diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..634347b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,14 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = tab +indent_size = 4 +insert_final_newline = true +trim_trailing_whitespace = true +max_line_length = off + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f33d1d4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,57 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events.json +speed-measure-plugin.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# e2e +/e2e/*.js +/e2e/*.map + +# System Files +.DS_Store +Thumbs.db +package-lock.json + +yarn-error.log +yarn.lock + +*.idea +*.DS_Store diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..c8e4409 --- /dev/null +++ b/.htaccess @@ -0,0 +1,8 @@ +RewriteEngine On +# If an existing asset or directory is requested go to it as it is +RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR] +RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d +RewriteRule ^ - [L] + +# If the requested resource doesn't exist, use index.html +RewriteRule ^(.*)$ index.html diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..0f3e5ce --- /dev/null +++ b/Dockerfile @@ -0,0 +1,23 @@ +FROM node:10.9.0 AS builder +RUN mkdir /app + +WORKDIR /app +RUN npm install -g @angular/cli@8.3 && npm install + +COPY . . + +RUN npm install + +RUN ng build --prod --aot=false --build-optimizer=false --baseHref=/ +#RUN ng build --prod --aot=false --build-optimizer=false --baseHref=/ + +# nginx state for serving content +FROM nginx:1.23.2-alpine + +WORKDIR /usr/share/nginx/html +RUN rm -rf ./* +COPY nginx.conf /etc/nginx/conf.d/default.conf +COPY nginx-default.conf /etc/nginx/nginx.conf +COPY --from=builder /app/dist . +EXPOSE 80 +EXPOSE 443 \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..2a995d7 --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +# Metronic Angular + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.3.7. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/angular.json b/angular.json new file mode 100644 index 0000000..ab3b325 --- /dev/null +++ b/angular.json @@ -0,0 +1,158 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "metronic": { + "root": "", + "sourceRoot": "src", + "projectType": "application", + "prefix": "kt", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.app.json", + "assets": [ + "src/favicon.ico", + "src/assets", + "src/.htaccess" + ], + "styles": [ + "src/styles.scss", + "node_modules/bootstrap/dist/css/bootstrap.css", + "node_modules/perfect-scrollbar/css/perfect-scrollbar.css", + "node_modules/socicon/css/socicon.css", + "node_modules/@fortawesome/fontawesome-free/css/all.min.css", + "src/assets/plugins/line-awesome/css/line-awesome.css", + "src/assets/plugins/flaticon/flaticon.css", + "src/assets/plugins/flaticon2/flaticon.css", + "src/assets/sass/style.angular.scss" + ], + "scripts": [ + "node_modules/popper.js/dist/umd/popper.js", + "node_modules/tooltip.js/dist/umd/tooltip.min.js", + "node_modules/perfect-scrollbar/dist/perfect-scrollbar.js" + ], + "stylePreprocessorOptions": { + "includePaths": [ + "src/assets" + ] + }, + "es5BrowserSupport": true + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "scripts": [], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "budgets": [ + { + "type": "initial", + "maximumWarning": "5mb", + "maximumError": "10mb" + } + ] + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "metronic:build" + }, + "configurations": { + "production": { + "browserTarget": "metronic:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "metronic:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.spec.json", + "karmaConfig": "src/karma.conf.js", + "styles": [ + "src/styles.scss" + ], + "scripts": [], + "assets": [ + "src/assets" + ] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "src/tsconfig.app.json", + "src/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } + }, + "metronic-e2e": { + "root": "e2e/", + "projectType": "application", + "prefix": "", + "architect": { + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "metronic:serve" + }, + "configurations": { + "production": { + "devServerTarget": "metronic:serve:production" + } + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": "e2e/tsconfig.e2e.json", + "exclude": [ + "**/node_modules/**" + ] + } + } + } + } + }, + "defaultProject": "metronic" +} diff --git a/browserslist b/browserslist new file mode 100644 index 0000000..342d28c --- /dev/null +++ b/browserslist @@ -0,0 +1,11 @@ +# This file is currently used by autoprefixer to adjust CSS to support the below specified browsers +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries +# +# For IE 9-11 support, please remove 'not' from the last line of the file and adjust as needed + +> 0.5% +last 2 versions +Firefox ESR +not dead +IE 11 \ No newline at end of file diff --git a/build b/build new file mode 100644 index 0000000..4dd84b4 --- /dev/null +++ b/build @@ -0,0 +1,3 @@ +ng build --prod --baseHref=/ + +ng build --prod --aot=false --build-optimizer=false --baseHref=/sistema-v2/ diff --git a/e2e/src/app.e2e-spec.ts b/e2e/src/app.e2e-spec.ts new file mode 100644 index 0000000..574c450 --- /dev/null +++ b/e2e/src/app.e2e-spec.ts @@ -0,0 +1,23 @@ +import { AppPage } from './app.po'; +import { browser, logging } from 'protractor'; + +describe('workspace-project App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', () => { + page.navigateTo(); + expect(page.getTitleText()).toEqual('Welcome to my-app!'); + }); + + afterEach(async () => { + // Assert that there are no errors emitted from the browser + const logs = await browser.manage().logs().get(logging.Type.BROWSER); + expect(logs).not.toContain(jasmine.objectContaining({ + level: logging.Level.SEVERE, + })); + }); +}); diff --git a/e2e/src/app.po.ts b/e2e/src/app.po.ts new file mode 100644 index 0000000..8bd75de --- /dev/null +++ b/e2e/src/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + navigateTo() { + return browser.get(browser.baseUrl) as Promise; + } + + getTitleText() { + return element(by.css('app-root h1')).getText() as Promise; + } +} diff --git a/e2e/tsconfig.e2e.json b/e2e/tsconfig.e2e.json new file mode 100644 index 0000000..a6dd622 --- /dev/null +++ b/e2e/tsconfig.e2e.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} \ No newline at end of file diff --git a/nginx-default.conf b/nginx-default.conf new file mode 100644 index 0000000..7fb7851 --- /dev/null +++ b/nginx-default.conf @@ -0,0 +1,60 @@ +worker_processes auto; + +worker_rlimit_nofile 20000; + +events { + worker_connections 5000; + use epoll; + multi_accept on; +} + +http { + + ## + # Basic Settings + ## + + proxy_headers_hash_max_size 1024; + proxy_headers_hash_bucket_size 128; + + sendfile on; + proxy_read_timeout 500; + proxy_connect_timeout 500; + proxy_send_timeout 500; + send_timeout 500; + keepalive_timeout 165; + + tcp_nopush on; + types_hash_max_size 2048; + client_max_body_size 10M; + server_tokens off; + + include /etc/nginx/mime.types; + default_type application/octet-stream; + + ## + # SSL Settings + ## + + ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE + ssl_prefer_server_ciphers on; + + ## + # Logging Settings + ## + + access_log /var/log/nginx/access.log; + + ## + # Gzip Settings + ## + + gzip on; + + ## + # Virtual Host Configs + ## + + include /etc/nginx/conf.d/*.conf; + include /etc/nginx/sites-enabled/*; +} diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..b3be85a --- /dev/null +++ b/nginx.conf @@ -0,0 +1,20 @@ +server { + listen 80; + sendfile on; + default_type application/octet-stream; + + gzip on; + gzip_http_version 1.1; + gzip_disable "MSIE [1-6]\."; + gzip_min_length 256; + gzip_vary on; + gzip_proxied expired no-cache no-store private auth; + gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript; + gzip_comp_level 9; + + root /usr/share/nginx/html; + + location / { + try_files $uri $uri/ /index.html =404; + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..cf95670 --- /dev/null +++ b/package.json @@ -0,0 +1,104 @@ +{ + "name": "metronic-angular", + "version": "6.1.4", + "description": "Packages used by Angular", + "scripts": { + "ng": "ng", + "start": "node --max_old_space_size=8192 node_modules/@angular/cli/bin/ng serve", + "build": "ng build --prod", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e", + "bundle-report": "webpack-bundle-analyzer dist/stats.json", + "rtl": "webpack" + }, + "private": true, + "dependencies": { + "@angular/animations": "^8.2.13", + "@angular/cdk": "^8.2.3", + "@angular/common": "^8.2.13", + "@angular/compiler": "^8.2.13", + "@angular/core": "^8.2.13", + "@angular/forms": "^8.2.13", + "@angular/platform-browser": "^8.2.13", + "@angular/platform-browser-dynamic": "^8.2.13", + "@angular/platform-server": "^8.2.13", + "@angular/router": "^8.2.13", + "@fortawesome/fontawesome-free": "^5.11.2", + "@ng-bootstrap/ng-bootstrap": "^5.1.2", + "@ngrx/effects": "^8.4.0", + "@ngrx/entity": "^8.4.0", + "@ngrx/router-store": "^8.4.0", + "@ngrx/store": "^8.4.0", + "@ngrx/store-devtools": "^8.4.0", + "@ngx-loading-bar/core": "^4.2.0", + "@ngx-translate/core": "^11.0.1", + "angular-calendar": "^0.28.22", + "angular-in-memory-web-api": "^0.8.0", + "bootstrap": "^4.3.1", + "chart.js": "^2.9.2", + "chartist": "^0.11.4", + "classlist.js": "^1.1.20150312", + "core-js": "^3.3.6", + "date-fns": "^2.16.1", + "hammerjs": "^2.0.8", + "highcharts": "^10.3.3", + "highlight.js": "^9.16.2", + "install": "^0.13.0", + "lodash": "^4.17.11", + "material-design-icons": "^3.0.1", + "moment": "^2.24.0", + "ng-inline-svg": "^8.5.1", + "ngrx-store-freeze": "^0.2.4", + "ngx-clipboard": "^12.2.0", + "ngx-daterangepicker-material": "^2.1.7", + "ngx-highlightjs": "^3.0.3", + "ngx-mat-select-search": "^3.3.3", + "ngx-perfect-scrollbar": "^8.0.0", + "ngx-permissions": "^7.0.3", + "ngx-scanner-qrcode": "^1.0.25", + "object-path": "^0.11.4", + "perfect-scrollbar": "^1.4.0", + "popper.js": "^1.16.0", + "querystring": "^0.2.1", + "rxjs": "^6.5.3", + "socicon": "^3.0.5", + "tooltip.js": "^1.3.3", + "tslib": "^1.10.0", + "web-animations-js": "^2.3.2", + "zone.js": "~0.9.1" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^0.800.6", + "@angular/cli": "^8.3.29", + "@angular/compiler-cli": "^8.2.13", + "@angular/language-service": "^8.2.13", + "@angular/material": "^8.2.3", + "@angular/material-moment-adapter": "^8.2.3", + "@ngrx/schematics": "^8.4.0", + "@types/chartist": "^0.9.46", + "@types/highlight.js": "^9.12.3", + "@types/jasmine": "^3.4.6", + "@types/jasminewd2": "^2.0.8", + "@types/node": "^12.20.55", + "@types/object-path": "^0.11.0", + "codelyzer": "^5.2.0", + "css-loader": "^3.2.0", + "jasmine-core": "~3.4.0", + "jasmine-spec-reporter": "~4.2.1", + "karma": "^4.4.1", + "karma-chrome-launcher": "~2.2.0", + "karma-coverage-istanbul-reporter": "^2.0.5", + "karma-jasmine": "~2.0.1", + "karma-jasmine-html-reporter": "^1.4.2", + "node-sass": "^4.13.0", + "protractor": "~5.4.2", + "ts-node": "~8.2.0", + "tslint": "~5.17.0", + "typescript": "~3.4.5", + "webpack-bundle-analyzer": "^3.6.0", + "webpack-cli": "^3.3.10", + "webpack-messages": "^2.0.4", + "webpack-rtl-plugin": "^2.0.0" + } +} diff --git a/run.sh b/run.sh new file mode 100644 index 0000000..1bf26a0 --- /dev/null +++ b/run.sh @@ -0,0 +1 @@ +docker run --rm -w /app -v $(pwd):/app -p 4202:4200 angular $1 $2 $3 $4 diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts new file mode 100644 index 0000000..8d9ff81 --- /dev/null +++ b/src/app/app-routing.module.ts @@ -0,0 +1,68 @@ +// Angular +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +// Components +import { BaseComponent } from './views/theme/base/base.component'; +import { ErrorPageComponent } from './views/theme/content/error-page/error-page.component'; +// Auth +import { AuthGuard } from './core/auth'; + +const routes: Routes = [ + {path: 'auth', loadChildren: () => import('../app/views/pages/auth/auth.module').then(m => m.AuthModule)}, + + { + path: '', + component: BaseComponent, + canActivate: [AuthGuard], + children: [ + { + path: 'inicio', + loadChildren: () => import('../app/views/pages/dashboard/dashboard.module').then(m => m.DashboardModule) + }, + { + path: 'catalogos', + loadChildren: () => import('../app/views/pages/catalogos/catalogos.module').then(m => m.CatalogosModule) + }, + { + path: 'servicios', + loadChildren: () => import('../app/views/pages/servicios/servicios.module').then(m => m.ServiciosModule) + }, + { + path: 'agenda', + loadChildren: () => import('../app/views/pages/agenda/agenda.module').then(m => m.AgendaModule) + }, + { + path: 'reportes', + loadChildren: () => import('../app/views/pages/reportes/reportes.module').then(m => m.ReportesModule) + }, + { + path: 'encuesta', + loadChildren: () => import('../app/views/pages/encuesta/encuesta.module').then(m => m.EncuestaModule) + }, + { + path: 'error/403', + component: ErrorPageComponent, + data: { + type: 'error-v6', + code: 403, + title: '403... Access forbidden', + desc: 'Looks like you don\'t have permission to access for requested page.
Please, contact administrator' + } + }, + {path: 'error/:type', component: ErrorPageComponent}, + {path: '', redirectTo: 'inicio', pathMatch: 'full'}, + {path: '**', redirectTo: 'inicio', pathMatch: 'full'} + ] + }, + {path: '', redirectTo: 'inicio', pathMatch: 'full'}, + {path: '**', redirectTo: 'error/403', pathMatch: 'full'}, +]; + +@NgModule({ + imports: [ + RouterModule.forRoot(routes) + ], + exports: [RouterModule] +}) +export class AppRoutingModule { +} diff --git a/src/app/app.component.html b/src/app/app.component.html new file mode 100644 index 0000000..d5aee0a --- /dev/null +++ b/src/app/app.component.html @@ -0,0 +1,2 @@ + + diff --git a/src/app/app.component.scss b/src/app/app.component.scss new file mode 100644 index 0000000..eb5570b --- /dev/null +++ b/src/app/app.component.scss @@ -0,0 +1,4 @@ +:host { + height: 100%; + margin: 0; +} diff --git a/src/app/app.component.ts b/src/app/app.component.ts new file mode 100644 index 0000000..e0ef5fc --- /dev/null +++ b/src/app/app.component.ts @@ -0,0 +1,102 @@ +import { Subscription } from 'rxjs'; +// Angular +import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core'; +import { NavigationEnd, Router } from '@angular/router'; +// Layout +import { LayoutConfigService, SplashScreenService, TranslationService } from './core/_base/layout'; +// language list +import { locale as enLang } from './core/_config/i18n/en'; +import { locale as chLang } from './core/_config/i18n/ch'; +import { locale as esLang } from './core/_config/i18n/es'; +import { locale as jpLang } from './core/_config/i18n/jp'; +import { locale as deLang } from './core/_config/i18n/de'; +import { locale as frLang } from './core/_config/i18n/fr'; +import {ApiService} from "./core/api/api.service"; +import {MatSnackBar} from "@angular/material"; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'body[kt-root]', + templateUrl: './app.component.html', + styleUrls: ['./app.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class AppComponent implements OnInit, OnDestroy { + // Public properties + title = 'Metronic'; + loader: boolean; + private unsubscribe: Subscription[] = []; // Read more: => https://brianflove.com/2016/12/11/anguar-2-unsubscribe-observables/ + + /** + * Component constructor + * + * @param translationService: TranslationService + * @param router: Router + * @param layoutConfigService: LayoutCongifService + * @param splashScreenService: SplashScreenService + */ + constructor(private translationService: TranslationService, + private router: Router, + private api: ApiService, + public snackBar: MatSnackBar, + private layoutConfigService: LayoutConfigService, + private splashScreenService: SplashScreenService) { + + // register translations + this.translationService.loadTranslations(enLang, chLang, esLang, jpLang, deLang, frLang); + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit(): void { + + this.api.error.subscribe((res: any) => { + if (res.status == 401 && res.error == 'token_expired'){ + this.api.login.refreshToken().subscribe(res=>{ + location.reload(); + }) + return; + } + for (let msg of res.msg) { + this.snackBar.open(msg, '',{ + duration: 5000, + verticalPosition: 'bottom', + horizontalPosition: 'right', + panelClass: [res.status] + }); + } + + }); + + // enable/disable loader + this.loader = this.layoutConfigService.getConfig('loader.enabled'); + + const routerSubscription = this.router.events.subscribe(event => { + if (event instanceof NavigationEnd) { + // hide splash screen + this.splashScreenService.hide(); + + // scroll to top on every route change + window.scrollTo(0, 0); + + // to display back the body content + setTimeout(() => { + document.body.classList.add('kt-page--loaded'); + }, 500); + } + }); + this.unsubscribe.push(routerSubscription); + } + + /** + * On Destroy + */ + ngOnDestroy() { + this.unsubscribe.forEach(sb => sb.unsubscribe()); + } +} diff --git a/src/app/app.module.ts b/src/app/app.module.ts new file mode 100644 index 0000000..17b0ca0 --- /dev/null +++ b/src/app/app.module.ts @@ -0,0 +1,187 @@ +// Angular +import {BrowserModule, HAMMER_GESTURE_CONFIG} from '@angular/platform-browser'; +import {APP_INITIALIZER, LOCALE_ID, NgModule} from '@angular/core'; +import {TranslateModule} from '@ngx-translate/core'; +import {HttpClientModule} from '@angular/common/http'; +import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; +import { + GestureConfig, + MAT_DATE_LOCALE, + MatNativeDateModule, + MatPaginatorIntl, + MatProgressSpinnerModule, + MatSelectModule +} from '@angular/material'; +import {OverlayModule} from '@angular/cdk/overlay'; +// Angular in memory +import {HttpClientInMemoryWebApiModule} from 'angular-in-memory-web-api'; +// Perfect Scroll bar +import {PERFECT_SCROLLBAR_CONFIG, PerfectScrollbarConfigInterface} from 'ngx-perfect-scrollbar'; +// SVG inline +import {InlineSVGModule} from 'ng-inline-svg'; +// Env +import {environment} from '../environments/environment'; +// Hammer JS +import 'hammerjs'; +// NGX Permissions +import {NgxPermissionsModule, NgxPermissionsService} from 'ngx-permissions'; +// NGRX +import {StoreModule} from '@ngrx/store'; +import {EffectsModule} from '@ngrx/effects'; +import {StoreRouterConnectingModule} from '@ngrx/router-store'; +import {StoreDevtoolsModule} from '@ngrx/store-devtools'; +// State +import {metaReducers, reducers} from './core/reducers'; +// Copmponents +import {AppComponent} from './app.component'; +// Modules +import {AppRoutingModule} from './app-routing.module'; +import {CoreModule} from './core/core.module'; +import {ThemeModule} from './views/theme/theme.module'; +// Partials +import {PartialsModule} from './views/partials/partials.module'; +// Layout Services +import { + DataTableService, + FakeApiService, + KtDialogService, + LayoutConfigService, + LayoutRefService, + MenuAsideService, + MenuConfigService, + MenuHorizontalService, + PageConfigService, + SplashScreenService, + SubheaderService +} from './core/_base/layout'; +// Auth +import {AuthModule} from './views/pages/auth/auth.module'; +import {AuthService} from './core/auth'; +// CRUD +import {HttpUtilsService, LayoutUtilsService, TypesUtilsService} from './core/_base/crud'; +// Config +import {LayoutConfig} from './core/_config/layout.config'; +// Highlight JS +import {HIGHLIGHT_OPTIONS, HighlightLanguage} from 'ngx-highlightjs'; +import * as typescript from 'highlight.js/lib/languages/typescript'; +import * as scss from 'highlight.js/lib/languages/scss'; +import * as xml from 'highlight.js/lib/languages/xml'; +import * as json from 'highlight.js/lib/languages/json'; +import {TokenStorage} from "./core/auth/_services/token-storage.service"; +import {PaginatorConfig} from './paginator-config'; + +import {CalendarModule, DateAdapter} from 'angular-calendar'; +import {adapterFactory} from 'angular-calendar/date-adapters/date-fns'; +import localeEs from '@angular/common/locales/es-MX'; +import {registerLocaleData} from "@angular/common"; + + +// tslint:disable-next-line:class-name +const DEFAULT_PERFECT_SCROLLBAR_CONFIG: PerfectScrollbarConfigInterface = { + wheelSpeed: 0.5, + swipeEasing: true, + minScrollbarLength: 40, + maxScrollbarLength: 300, +}; + +export function initializeLayoutConfig(appConfig: LayoutConfigService) { + // initialize app by loading default demo layout config + return () => { + if (appConfig.getConfig() === null) { + appConfig.loadConfigs(new LayoutConfig().configs); + } + }; +} + +export function hljsLanguages(): HighlightLanguage[] { + return [ + {name: 'typescript', func: typescript}, + {name: 'scss', func: scss}, + {name: 'xml', func: xml}, + {name: 'json', func: json} + ]; +} + +registerLocaleData(localeEs); + +@NgModule({ + declarations: [AppComponent], + imports: [ + BrowserAnimationsModule, + BrowserModule, + AppRoutingModule, + HttpClientModule, + environment.isMockEnabled ? HttpClientInMemoryWebApiModule.forRoot(FakeApiService, { + passThruUnknownUrl: true, + dataEncapsulation: false + }) : [], + NgxPermissionsModule.forRoot(), + PartialsModule, + CoreModule, + OverlayModule, + MatNativeDateModule, + StoreModule.forRoot(reducers, {metaReducers}), + EffectsModule.forRoot([]), + StoreRouterConnectingModule.forRoot({stateKey: 'router'}), + StoreDevtoolsModule.instrument(), + AuthModule.forRoot(), + TranslateModule.forRoot(), + MatProgressSpinnerModule, + InlineSVGModule.forRoot(), + ThemeModule, + MatSelectModule, + CalendarModule.forRoot({provide: DateAdapter, useFactory: adapterFactory}), + ], + providers: [ + AuthService, + TokenStorage, + LayoutConfigService, + LayoutRefService, + MenuConfigService, + PageConfigService, + KtDialogService, + DataTableService, + SplashScreenService, + { + provide: PERFECT_SCROLLBAR_CONFIG, + useValue: DEFAULT_PERFECT_SCROLLBAR_CONFIG + }, + { + provide: HAMMER_GESTURE_CONFIG, + useClass: GestureConfig + }, + { + // layout config initializer + provide: APP_INITIALIZER, + useFactory: (initializeLayoutConfig, ps: NgxPermissionsService) => function () { + return ps.loadPermissions([]) + }, + deps: [LayoutConfigService, NgxPermissionsService], + multi: true + }, + { + // layout config initializer + provide: APP_INITIALIZER, + useFactory: (initializeLayoutConfig), + deps: [LayoutConfigService, NgxPermissionsService], + multi: true + }, + { + provide: HIGHLIGHT_OPTIONS, + useValue: {languages: hljsLanguages} + }, + // template services + SubheaderService, + MenuHorizontalService, + MenuAsideService, + HttpUtilsService, + TypesUtilsService, + LayoutUtilsService, + {provide: MatPaginatorIntl, useValue: PaginatorConfig()}, + {provide: MAT_DATE_LOCALE, useValue: 'es-MX'}, + {provide: LOCALE_ID, useValue: 'es-MX'} + ], + bootstrap: [AppComponent] +}) +export class AppModule { +} diff --git a/src/app/core/_base/crud/index.ts b/src/app/core/_base/crud/index.ts new file mode 100644 index 0000000..d703633 --- /dev/null +++ b/src/app/core/_base/crud/index.ts @@ -0,0 +1,11 @@ +// Models +export { BaseModel } from './models/_base.model'; +export { BaseDataSource } from './models/_base.datasource'; +export { QueryParamsModel } from './models/query-models/query-params.model'; +export { QueryResultsModel } from './models/query-models/query-results.model'; +export { HttpExtenstionsModel } from './models/http-extentsions-model'; +// Utils +export { HttpUtilsService } from './utils/http-utils.service'; +export { TypesUtilsService } from './utils/types-utils.service'; +export { InterceptService } from './utils/intercept.service'; +export { LayoutUtilsService, MessageType } from './utils/layout-utils.service'; diff --git a/src/app/core/_base/crud/models/_base.datasource.ts b/src/app/core/_base/crud/models/_base.datasource.ts new file mode 100644 index 0000000..07f886d --- /dev/null +++ b/src/app/core/_base/crud/models/_base.datasource.ts @@ -0,0 +1,67 @@ +// Angular +import { CollectionViewer, DataSource } from '@angular/cdk/collections'; +// RxJS +import { Observable, BehaviorSubject, combineLatest, Subscription, of } from 'rxjs'; +// CRUD +import { HttpExtenstionsModel } from './http-extentsions-model'; +import { QueryParamsModel } from './query-models/query-params.model'; +import { QueryResultsModel } from './query-models/query-results.model'; +import { BaseModel } from './_base.model'; +import { skip, distinctUntilChanged } from 'rxjs/operators'; + +// Why not use MatTableDataSource? +/* In this example, we will not be using the built-in MatTableDataSource because its designed for filtering, + sorting and pagination of a client - side data array. + Read the article: 'https://blog.angular-university.io/angular-material-data-table/' +**/ +export class BaseDataSource implements DataSource { + entitySubject = new BehaviorSubject([]); + hasItems = true; // Need to show message: 'No records found' + + // Loading | Progress bar + loading$: Observable; + isPreloadTextViewed$: Observable = of(true); + + // Paginator | Paginators count + paginatorTotalSubject = new BehaviorSubject(0); + paginatorTotal$: Observable; + subscriptions: Subscription[] = []; + + constructor() { + this.paginatorTotal$ = this.paginatorTotalSubject.asObservable(); + + // subscribe hasItems to (entitySubject.length==0) + const hasItemsSubscription = this.paginatorTotal$.pipe( + distinctUntilChanged(), + skip(1) + ).subscribe(res => this.hasItems = res > 0); + this.subscriptions.push(hasItemsSubscription); + } + + connect(collectionViewer: CollectionViewer): Observable { + // Connecting data source + return this.entitySubject.asObservable(); + } + + disconnect(collectionViewer: CollectionViewer): void { + // Disonnecting data source + this.entitySubject.complete(); + this.paginatorTotalSubject.complete(); + this.subscriptions.forEach(sb => sb.unsubscribe()); + } + + baseFilter(_entities: any[], _queryParams: QueryParamsModel, _filtrationFields: string[] = []): QueryResultsModel { + const httpExtention = new HttpExtenstionsModel(); + return httpExtention.baseFilter(_entities, _queryParams, _filtrationFields); + } + + sortArray(_incomingArray: any[], _sortField: string = '', _sortOrder: string = 'asc'): any[] { + const httpExtention = new HttpExtenstionsModel(); + return httpExtention.sortArray(_incomingArray, _sortField, _sortOrder); + } + + searchInArray(_incomingArray: any[], _queryObj: any, _filtrationFields: string[] = []): any[] { + const httpExtention = new HttpExtenstionsModel(); + return httpExtention.searchInArray(_incomingArray, _queryObj, _filtrationFields); + } +} diff --git a/src/app/core/_base/crud/models/_base.model.ts b/src/app/core/_base/crud/models/_base.model.ts new file mode 100644 index 0000000..b56242a --- /dev/null +++ b/src/app/core/_base/crud/models/_base.model.ts @@ -0,0 +1,8 @@ +export class BaseModel { + // Edit + _isEditMode = false; + // Log + _userId = 0; // Admin + _createdDate: string; + _updatedDate: string; +} diff --git a/src/app/core/_base/crud/models/http-extentsions-model.ts b/src/app/core/_base/crud/models/http-extentsions-model.ts new file mode 100644 index 0000000..5c90740 --- /dev/null +++ b/src/app/core/_base/crud/models/http-extentsions-model.ts @@ -0,0 +1,124 @@ +// CRUD +import { QueryParamsModel } from './query-models/query-params.model'; +import { QueryResultsModel } from './query-models/query-results.model'; + +export class HttpExtenstionsModel { + + /** + * Filtration with sorting + * First do Sort then filter + * + * @param _entities: any[] + * @param _queryParams: QueryParamsModel + * @param _filtrationFields: string[] + */ + baseFilter(_entities: any[], _queryParams: QueryParamsModel, _filtrationFields: string[] = []): QueryResultsModel { + // Filtration + let entitiesResult = this.searchInArray(_entities, _queryParams.filter, _filtrationFields); + + // Sorting + // start + if (_queryParams.sortField) { + entitiesResult = this.sortArray(entitiesResult, _queryParams.sortField, _queryParams.sortOrder); + } + // end + + // Paginator + // start + const totalCount = entitiesResult.length; + const initialPos = _queryParams.pageNumber * _queryParams.pageSize; + entitiesResult = entitiesResult.slice(initialPos, initialPos + _queryParams.pageSize); + // end + + const queryResults = new QueryResultsModel(); + queryResults.items = entitiesResult; + queryResults.totalCount = totalCount; + return queryResults; + } + + /** + * Sort array by field name and order-type + * @param _incomingArray: any[] + * @param _sortField: string + * @param _sortOrder: string + */ + sortArray(_incomingArray: any[], _sortField: string = '', _sortOrder: string = 'asc'): any[] { + if (!_sortField) { + return _incomingArray; + } + + let result: any[] = []; + result = _incomingArray.sort((a, b) => { + if (a[_sortField] < b[_sortField]) { + return _sortOrder === 'asc' ? -1 : 1; + } + + if (a[_sortField] > b[_sortField]) { + return _sortOrder === 'asc' ? 1 : -1; + } + + return 0; + }); + return result; + } + + /** + * Filter array by some fields + * + * @param _incomingArray: any[] + * @param _queryObj: any + * @param _filtrationFields: string[] + */ + searchInArray(_incomingArray: any[], _queryObj: any, _filtrationFields: string[] = []): any[] { + const result: any[] = []; + let resultBuffer: any[] = []; + const indexes: number[] = []; + let firstIndexes: number[] = []; + let doSearch = false; + + _filtrationFields.forEach(item => { + if (item in _queryObj) { + _incomingArray.forEach((element, index) => { + if (element[item] === _queryObj[item]) { + firstIndexes.push(index); + } + }); + firstIndexes.forEach(element => { + resultBuffer.push(_incomingArray[element]); + }); + _incomingArray = resultBuffer.slice(0); + resultBuffer = [].slice(0); + firstIndexes = [].slice(0); + } + }); + + Object.keys(_queryObj).forEach(key => { + const searchText = _queryObj[key].toString().trim().toLowerCase(); + if (key && !_filtrationFields.some(e => e === key) && searchText) { + doSearch = true; + try { + _incomingArray.forEach((element, index) => { + if (element[key]) { + const _val = element[key].toString().trim().toLowerCase(); + if (_val.indexOf(searchText) > -1 && indexes.indexOf(index) === -1) { + indexes.push(index); + } + } + }); + } catch (ex) { + console.log(ex, key, searchText); + } + } + }); + + if (!doSearch) { + return _incomingArray; + } + + indexes.forEach(re => { + result.push(_incomingArray[re]); + }); + + return result; + } +} diff --git a/src/app/core/_base/crud/models/query-models/query-params.model.ts b/src/app/core/_base/crud/models/query-models/query-params.model.ts new file mode 100644 index 0000000..ec7044d --- /dev/null +++ b/src/app/core/_base/crud/models/query-models/query-params.model.ts @@ -0,0 +1,21 @@ +export class QueryParamsModel { + // fields + filter: any; + sortOrder: string; // asc || desc + sortField: string; + pageNumber: number; + pageSize: number; + + // constructor overrides + constructor(_filter: any, + _sortOrder: string = 'asc', + _sortField: string = '', + _pageNumber: number = 0, + _pageSize: number = 10) { + this.filter = _filter; + this.sortOrder = _sortOrder; + this.sortField = _sortField; + this.pageNumber = _pageNumber; + this.pageSize = _pageSize; + } +} diff --git a/src/app/core/_base/crud/models/query-models/query-results.model.ts b/src/app/core/_base/crud/models/query-models/query-results.model.ts new file mode 100644 index 0000000..4e0a4b5 --- /dev/null +++ b/src/app/core/_base/crud/models/query-models/query-results.model.ts @@ -0,0 +1,11 @@ +export class QueryResultsModel { + // fields + items: any[]; + totalCount: number; + errorMessage: string; + + constructor(_items: any[] = [], _totalCount: number = 0, _errorMessage: string = '') { + this.items = _items; + this.totalCount = _totalCount; + } +} diff --git a/src/app/core/_base/crud/utils/http-utils.service.ts b/src/app/core/_base/crud/utils/http-utils.service.ts new file mode 100644 index 0000000..1bceb32 --- /dev/null +++ b/src/app/core/_base/crud/utils/http-utils.service.ts @@ -0,0 +1,49 @@ +// Angular +import { Injectable } from '@angular/core'; +import { HttpParams, HttpHeaders } from '@angular/common/http'; +// CRUD +import { QueryResultsModel } from '../models/query-models/query-results.model'; +import { QueryParamsModel } from '../models/query-models/query-params.model'; +import { HttpExtenstionsModel } from '../../crud/models/http-extentsions-model'; + +@Injectable() +export class HttpUtilsService { + /** + * Prepare query http params + * @param queryParams: QueryParamsModel + */ + getFindHTTPParams(queryParams): HttpParams { + const params = new HttpParams() + .set('lastNamefilter', queryParams.filter) + .set('sortOrder', queryParams.sortOrder) + .set('sortField', queryParams.sortField) + .set('pageNumber', queryParams.pageNumber.toString()) + .set('pageSize', queryParams.pageSize.toString()); + + return params; + } + + /** + * get standard content-type + */ + getHTTPHeaders(): HttpHeaders { + const result = new HttpHeaders(); + result.set('Content-Type', 'application/json'); + return result; + } + + baseFilter(_entities: any[], _queryParams: QueryParamsModel, _filtrationFields: string[] = []): QueryResultsModel { + const httpExtention = new HttpExtenstionsModel(); + return httpExtention.baseFilter(_entities, _queryParams, _filtrationFields); + } + + sortArray(_incomingArray: any[], _sortField: string = '', _sortOrder: string = 'asc'): any[] { + const httpExtention = new HttpExtenstionsModel(); + return httpExtention.sortArray(_incomingArray, _sortField, _sortOrder); + } + + searchInArray(_incomingArray: any[], _queryObj: any, _filtrationFields: string[] = []): any[] { + const httpExtention = new HttpExtenstionsModel(); + return httpExtention.searchInArray(_incomingArray, _queryObj, _filtrationFields); + } +} diff --git a/src/app/core/_base/crud/utils/intercept.service.ts b/src/app/core/_base/crud/utils/intercept.service.ts new file mode 100644 index 0000000..2039764 --- /dev/null +++ b/src/app/core/_base/crud/utils/intercept.service.ts @@ -0,0 +1,51 @@ +// Angular +import { Injectable } from '@angular/core'; +import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpResponse } from '@angular/common/http'; +// RxJS +import { Observable } from 'rxjs'; +import { tap } from 'rxjs/operators'; +import { debug } from 'util'; + +/** + * More information there => https://medium.com/@MetonymyQT/angular-http-interceptors-what-are-they-and-how-to-use-them-52e060321088 + */ +@Injectable() +export class InterceptService implements HttpInterceptor { + // intercept request and add token + intercept( + request: HttpRequest, + next: HttpHandler + ): Observable> { + // tslint:disable-next-line:no-debugger + // modify request + // request = request.clone({ + // setHeaders: { + // Authorization: `Bearer ${localStorage.getItem('accessToken')}` + // } + // }); + // console.log('----request----'); + // console.log(request); + // console.log('--- end of request---'); + + return next.handle(request).pipe( + tap( + event => { + if (event instanceof HttpResponse) { + // console.log('all looks good'); + // http response status code + // console.log(event.status); + } + }, + error => { + // http response status code + // console.log('----response----'); + // console.error('status code:'); + // tslint:disable-next-line:no-debugger + console.error(error.status); + console.error(error.message); + // console.log('--- end of response---'); + } + ) + ); + } +} diff --git a/src/app/core/_base/crud/utils/layout-utils.service.ts b/src/app/core/_base/crud/utils/layout-utils.service.ts new file mode 100644 index 0000000..1a22d67 --- /dev/null +++ b/src/app/core/_base/crud/utils/layout-utils.service.ts @@ -0,0 +1,122 @@ +// Angular +import { Injectable } from '@angular/core'; +import { MatSnackBar, MatDialog } from '@angular/material'; +// Partials for CRUD +import { ActionNotificationComponent, + DeleteEntityDialogComponent, + FetchEntityDialogComponent, + UpdateStatusDialogComponent +} from '../../../../views/partials/content/crud'; + +export enum MessageType { + Create, + Read, + Update, + Delete +} + +@Injectable() +export class LayoutUtilsService { + /** + * Service constructor + * + * @param snackBar: MatSnackBar + * @param dialog: MatDialog + */ + constructor(private snackBar: MatSnackBar, + private dialog: MatDialog) { } + + /** + * Showing (Mat-Snackbar) Notification + * + * @param _message + * @param _type + * @param _duration + * @param _showCloseButton + * @param _showUndoButton + * @param _undoButtonDuration + * @param _verticalPosition + */ + showActionNotification( + _message: string, + _type: MessageType = MessageType.Create, + _duration: number = 10000, + _showCloseButton: boolean = true, + _showUndoButton: boolean = false, + _undoButtonDuration: number = 3000, + _verticalPosition: 'top' | 'bottom' = 'bottom' + ) { + const _data = { + message: _message, + snackBar: this.snackBar, + showCloseButton: _showCloseButton, + showUndoButton: _showUndoButton, + undoButtonDuration: _undoButtonDuration, + verticalPosition: _verticalPosition, + type: _type, + action: 'Undo' + }; + return this.snackBar.openFromComponent(ActionNotificationComponent, { + duration: _duration, + data: _data, + verticalPosition: _verticalPosition + }); + } + + /** + * Showing Confirmation (Mat-Dialog) before Entity Removing + * + * @param title: stirng + * @param description: stirng + * @param waitDesciption: string + * @param btnText + */ + deleteElement(title: string = '', description: string = '', waitDesciption: string = '', btnText: string = '') { + return this.dialog.open(DeleteEntityDialogComponent, { + data: { title, description, waitDesciption, btnText + }, + width: '440px', + }); + } + + /** + * Showing Confirmation (Mat-Dialog) before Entity Removing + * + * @param title: stirng + * @param description: stirng + * @param waitDesciption: string + * @param btnText + */ + customElement(title: string = '', description: string = '', waitDesciption: string = '', btnText: string = 'Aceptar') { + return this.dialog.open(DeleteEntityDialogComponent, { + data: { title, description, waitDesciption, btnText }, + width: '440px' + }); + } + + /** + * Showing Fetching Window(Mat-Dialog) + * + * @param _data: any + */ + fetchElements(_data) { + return this.dialog.open(FetchEntityDialogComponent, { + data: _data, + width: '400px' + }); + } + + /** + * Showing Update Status for Entites Window + * + * @param title: string + * @param statuses: string[] + * @param messages: string[] + */ + updateStatusForEntities(title, statuses, messages) { + return this.dialog.open(UpdateStatusDialogComponent, { + data: { title, statuses, messages }, + width: '480px' + }); + } +} diff --git a/src/app/core/_base/crud/utils/types-utils.service.ts b/src/app/core/_base/crud/utils/types-utils.service.ts new file mode 100644 index 0000000..76fa1ad --- /dev/null +++ b/src/app/core/_base/crud/utils/types-utils.service.ts @@ -0,0 +1,129 @@ +/** Angular */ +import { Injectable } from '@angular/core'; + +@Injectable() +export class TypesUtilsService { + /** + * Convert number to string and addinng '0' before + * + * @param value: number + */ + padNumber(value: number) { + if (this.isNumber(value)) { + return `0${value}`.slice(-2); + } else { + return ''; + } + } + + /** + * Checking value type equals to Number + * + * @param value: any + */ + isNumber(value: any): boolean { + return !isNaN(this.toInteger(value)); + } + + /** + * Covert value to number + * + * @param value: any + */ + toInteger(value: any): number { + return parseInt(`${value}`, 10); + } + + /** + * Convert date to string with 'MM/dd/yyyy' format + * + * @param date: Date + */ + dateFormat(date: Date): string { + const month = date.getMonth() + 1; + const day = date.getDate(); + const year = date.getFullYear(); + if (date) { + return `${month}/${day}/${year}`; + } + + return ''; + } + + /** + * Convert Date to string with custom format 'MM/dd/yyyy' + * + * @param date: any + */ + dateCustomFormat(date: any): string { + let stringDate = ''; + if (date) { + stringDate += this.isNumber(date.month) ? this.padNumber(date.month) + '/' : ''; + stringDate += this.isNumber(date.day) ? this.padNumber(date.day) + '/' : ''; + + stringDate += date.year; + } + return stringDate; + } + + /** + * Convert string to DateFormatter (For Reactive Forms Validators) + * + * @param dateInStr: string (format => 'MM/dd/yyyy') + */ + getDateFormatterFromString(dateInStr: string): any { + if (dateInStr && dateInStr.length > 0) { + const dateParts = dateInStr.trim().split('/'); + return [ + { + year: this.toInteger(dateParts[2]), + month: this.toInteger(dateParts[0]), + day: this.toInteger(dateParts[1]) + } + ]; + } + + const _date = new Date(); + return [ + { + year: _date.getFullYear(), + month: _date.getMonth() + 1, + day: _date.getDay() + } + ]; + } + + /** + * Convert string to Date + * + * @param dateInStr: string (format => 'MM/dd/yyyy') + */ + getDateFromString(dateInStr: string = ''): Date { + if (dateInStr && dateInStr.length > 0) { + const dateParts = dateInStr.trim().split('/'); + const year = this.toInteger(dateParts[2]); + const month = this.toInteger(dateParts[0]); + const day = this.toInteger(dateParts[1]); + // tslint:disable-next-line:prefer-const + let result = new Date(); + result.setDate(day); + result.setMonth(month - 1); + result.setFullYear(year); + return result; + } + + return new Date(); + } + + + /** + * Convert Date to string with format 'MM/dd/yyyy' + * @param _date: Date? + */ + getDateStringFromDate(_date: Date = new Date()): string { + const month = _date.getMonth() + 1; + const year = _date.getFullYear(); + const date = _date.getDate(); + return `${month}/${date}/${year}`; + } +} diff --git a/src/app/core/_base/layout/directives/content-animate.directive.ts b/src/app/core/_base/layout/directives/content-animate.directive.ts new file mode 100644 index 0000000..126af19 --- /dev/null +++ b/src/app/core/_base/layout/directives/content-animate.directive.ts @@ -0,0 +1,80 @@ +// Angular +import { Directive, ElementRef, OnDestroy, OnInit } from '@angular/core'; +import { animate, AnimationBuilder, AnimationPlayer, style } from '@angular/animations'; +import { NavigationEnd, Router } from '@angular/router'; +// RxJS +import { Subscription } from 'rxjs'; + +/** + * Page load animation + * + */ +@Directive({ + selector: '[ktContentAnimate]' +}) +export class ContentAnimateDirective implements OnInit, OnDestroy { + // Public properties + player: AnimationPlayer; + // Private properties + private events: Subscription; + + /** + * Directive Consturctor + * @param el: ElementRef + * @param router: Router + * @param animationBuilder: AnimationBuilder + */ + constructor( + private el: ElementRef, + private router: Router, + private animationBuilder: AnimationBuilder) { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit(): void { + // animate the content + this.initAnimate(); + // animate page load + this.events = this.router.events.subscribe(event => { + if (event instanceof NavigationEnd) { + this.player.play(); + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + this.events.unsubscribe(); + this.player.destroy(); + } + + /** + * Animate page load + */ + initAnimate() { + this.player = this.animationBuilder + .build([ + // style({opacity: 0, transform: 'translateY(15px)'}), + // animate(500, style({opacity: 1, transform: 'translateY(0)'})), + // style({transform: 'none'}), + style({ + transform: 'translateY(-3%)', + opacity: 0, + position: 'static' + }), + animate( + '0.5s ease-in-out', + style({transform: 'translateY(0%)', opacity: 1}) + ) + ]) + .create(this.el.nativeElement); + } +} diff --git a/src/app/core/_base/layout/directives/header.directive.ts b/src/app/core/_base/layout/directives/header.directive.ts new file mode 100644 index 0000000..3599ecd --- /dev/null +++ b/src/app/core/_base/layout/directives/header.directive.ts @@ -0,0 +1,68 @@ +// Angular +import { AfterViewInit, Directive, ElementRef, Input } from '@angular/core'; +// ObjectPath +import * as objectPath from 'object-path'; + +export interface HeaderOptions { + classic?: any; + offset?: any; + minimize?: any; +} + +/** + * Configure Header + */ +@Directive({ + selector: '[ktHeader]', + exportAs: 'ktHeader', +}) +export class HeaderDirective implements AfterViewInit { + @Input() options: HeaderOptions = {}; + + /** + * Directive Constructor + * @param el: ElementRef + */ + constructor(private el: ElementRef) { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * After view init + */ + ngAfterViewInit(): void { + this.setupOptions(); + + const header = new KTHeader(this.el.nativeElement, this.options); + } + + /** + * Setup options to header + */ + private setupOptions() { + this.options = { + classic: { + desktop: true, + mobile: false + }, + }; + + if (this.el.nativeElement.getAttribute('data-ktheader-minimize') == '1') { + objectPath.set(this.options, 'minimize', { + desktop: { + on: 'kt-header--minimize' + }, + mobile: { + on: 'kt-header--minimize' + } + }); + objectPath.set(this.options, 'offset', { + desktop: 200, + mobile: 150 + }); + } + } +} diff --git a/src/app/core/_base/layout/directives/menu.directive.ts b/src/app/core/_base/layout/directives/menu.directive.ts new file mode 100644 index 0000000..3c7e737 --- /dev/null +++ b/src/app/core/_base/layout/directives/menu.directive.ts @@ -0,0 +1,66 @@ +// Angular +import { AfterViewInit, Directive, ElementRef, Input } from '@angular/core'; +// Object-Path +import * as objectPath from 'object-path'; + +export interface MenuOptions { + scroll?: any; + submenu?: any; + accordion?: any; + dropdown?: any; +} + +/** + * Configure menu + */ +@Directive({ + selector: '[ktMenu]', + exportAs: 'ktMenu', +}) +export class MenuDirective implements AfterViewInit { + // Public propeties + @Input() options: MenuOptions; + // Private properites + private menu: any; + + /** + * Directive Constructor + * @param el: ElementRef + */ + constructor(private el: ElementRef) { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * After view init + */ + ngAfterViewInit(): void { + this.setupOptions(); + this.menu = new KTMenu(this.el.nativeElement, this.options); + } + + /** + * Return the menu + */ + getMenu() { + return this.menu; + } + + /** + * Setup menu options + */ + private setupOptions() { + // init aside menu + let menuDesktopMode = 'accordion'; + if (this.el.nativeElement.getAttribute('data-ktmenu-dropdown') === '1') { + menuDesktopMode = 'dropdown'; + } + + if (typeof objectPath.get(this.options, 'submenu.desktop') === 'object') { + objectPath.set(this.options, 'submenu.desktop', menuDesktopMode); + } + } +} diff --git a/src/app/core/_base/layout/directives/offcanvas.directive.ts b/src/app/core/_base/layout/directives/offcanvas.directive.ts new file mode 100644 index 0000000..e2942b3 --- /dev/null +++ b/src/app/core/_base/layout/directives/offcanvas.directive.ts @@ -0,0 +1,49 @@ +// Angular +import { AfterViewInit, Directive, ElementRef, Input } from '@angular/core'; + +export interface OffcanvasOptions { + baseClass: string; + overlay?: boolean; + closeBy: string; + toggleBy?: any; +} + +/** + * Setup off Convas + */ +@Directive({ + selector: '[ktOffcanvas]', + exportAs: 'ktOffcanvas', +}) +export class OffcanvasDirective implements AfterViewInit { + // Public properties + @Input() options: OffcanvasOptions; + // Private properties + private offcanvas: any; + + /** + * Directive Constructor + * @param el: ElementRef + */ + constructor(private el: ElementRef) { } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * After view init + */ + ngAfterViewInit(): void { + setTimeout(() => { + this.offcanvas = new KTOffcanvas(this.el.nativeElement, this.options); + }); + } + + /** + * Returns the offCanvas + */ + getOffcanvas() { + return this.offcanvas; + } +} diff --git a/src/app/core/_base/layout/directives/scroll-top.directive.ts b/src/app/core/_base/layout/directives/scroll-top.directive.ts new file mode 100644 index 0000000..c514e1d --- /dev/null +++ b/src/app/core/_base/layout/directives/scroll-top.directive.ts @@ -0,0 +1,44 @@ +// Angular +import { AfterViewInit, Directive, ElementRef, Input } from '@angular/core'; + +export interface ScrollTopOptions { + offset: number; + speed: number; +} + +/** + * Scroll to top + */ +@Directive({ + selector: '[ktScrollTop]' +}) +export class ScrollTopDirective implements AfterViewInit { + // Public properties + @Input() options: ScrollTopOptions; + // Private properites + private scrollTop: any; + + /** + * Directive Conctructor + * @param el: ElementRef + */ + constructor(private el: ElementRef) { } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * After view init + */ + ngAfterViewInit(): void { + this.scrollTop = new KTScrolltop(this.el.nativeElement, this.options); + } + + /** + * Returns ScrollTop + */ + getScrollTop() { + return this.scrollTop; + } +} diff --git a/src/app/core/_base/layout/directives/sparkline-chart.directive.ts b/src/app/core/_base/layout/directives/sparkline-chart.directive.ts new file mode 100644 index 0000000..2a1623d --- /dev/null +++ b/src/app/core/_base/layout/directives/sparkline-chart.directive.ts @@ -0,0 +1,161 @@ +// Angular +import { AfterViewInit, Directive, ElementRef, Input } from '@angular/core'; +// Chart +import { Chart } from 'chart.js/dist/Chart.min.js'; +// LayoutConfig +import { LayoutConfigService } from '../../layout/services/layout-config.service'; + +export interface SparklineChartOptions { + // array of numbers + data: number[]; + // chart line color + color: string; + // chart line size + border: number; + fill?: boolean; + tooltip?: boolean; +} + +/** + * Configure sparkline chart + */ +@Directive({ + selector: '[ktSparklineChart]', + exportAs: 'ktSparklineChart' +}) +export class SparklineChartDirective implements AfterViewInit { + // Public properties + @Input() options: SparklineChartOptions; + // Private properties + private chart: Chart; + + /** + * Directive Constructor + * + * @param el: ElementRef + * @param layoutConfigService: LayoutConfigService + */ + constructor(private el: ElementRef, private layoutConfigService: LayoutConfigService) { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * After view init + */ + ngAfterViewInit(): void { + this.initChart(this.el.nativeElement, this.options.data, this.options.color, this.options.border, this.options.fill, this.options.tooltip); + } + + /** + * Init chart + * @param src: any + * @param data: any + * @param color: any + * @param border: any + * @param fill: any + * @param tooltip: any + */ + initChart(src, data, color, border, fill, tooltip) { + if (src.length === 0) { + return; + } + + // set default values + fill = (typeof fill !== 'undefined') ? fill : false; + tooltip = (typeof tooltip !== 'undefined') ? tooltip : false; + + const config = { + type: 'line', + data: { + labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October'], + datasets: [{ + label: '', + borderColor: color, + borderWidth: border, + + pointHoverRadius: 4, + pointHoverBorderWidth: 12, + pointBackgroundColor: Chart.helpers.color('#000000').alpha(0).rgbString(), + pointBorderColor: Chart.helpers.color('#000000').alpha(0).rgbString(), + pointHoverBackgroundColor: this.layoutConfigService.getConfig('colors.state.danger'), + pointHoverBorderColor: Chart.helpers.color('#000000').alpha(0.1).rgbString(), + fill: false, + data, + }] + }, + options: { + title: { + display: false, + }, + tooltips: { + enabled: false, + intersect: false, + mode: 'nearest', + xPadding: 10, + yPadding: 10, + caretPadding: 10 + }, + legend: { + display: false, + labels: { + usePointStyle: false + } + }, + responsive: true, + maintainAspectRatio: true, + hover: { + mode: 'index' + }, + scales: { + xAxes: [{ + display: false, + gridLines: false, + scaleLabel: { + display: true, + labelString: 'Month' + } + }], + yAxes: [{ + display: false, + gridLines: false, + scaleLabel: { + display: true, + labelString: 'Value' + }, + ticks: { + beginAtZero: true + } + }] + }, + + elements: { + point: { + radius: 4, + borderWidth: 12 + }, + }, + + layout: { + padding: { + left: 0, + right: 10, + top: 5, + bottom: 0 + } + } + } + }; + + this.chart = new Chart(src, config); + } + + /** + * Returns the chart + */ + getChart() { + return this.chart; + } +} diff --git a/src/app/core/_base/layout/directives/sticky.directive.ts b/src/app/core/_base/layout/directives/sticky.directive.ts new file mode 100644 index 0000000..b16ccb1 --- /dev/null +++ b/src/app/core/_base/layout/directives/sticky.directive.ts @@ -0,0 +1,316 @@ +import { AfterViewInit, Directive, ElementRef, HostBinding, HostListener, Inject, Input, isDevMode, OnDestroy, OnInit, PLATFORM_ID } from '@angular/core'; +import { isPlatformBrowser } from '@angular/common'; +import { BehaviorSubject, combineLatest, Observable, Subject } from 'rxjs'; +import { animationFrame } from 'rxjs/internal/scheduler/animationFrame'; +import { filter, map, share, startWith, takeUntil, throttleTime } from 'rxjs/operators'; + +/** + * Extended version of "Sticky Directive for Angular 2+" + * https://github.com/w11k/angular-sticky-things + */ + +export interface StickyPositions { + offsetY: number; + bottomBoundary: number | null; +} + +export interface StickyStatus { + isSticky: boolean; + reachedLowerEdge: boolean; + marginTop: number; + marginBottom: number; +} + +@Directive({ + selector: '[ktSticky]' +}) +export class StickyDirective implements OnInit, AfterViewInit, OnDestroy { + + filterGate = false; + marginTop$ = new BehaviorSubject(0); + marginBottom$ = new BehaviorSubject(0); + enable$ = new BehaviorSubject(true); + + @Input() scrollContainer: string | HTMLElement; + @Input('spacerElement') spacerElement: HTMLElement | undefined; + @Input('boundaryElement') boundaryElement: HTMLElement | undefined; + @HostBinding('class.is-sticky') sticky = false; + @HostBinding('class.boundary-reached') boundaryReached = false; + /** + * The field represents some position values in normal (not sticky) mode. + * If the browser size or the content of the page changes, this value must be recalculated. + */ + private scroll$ = new Subject(); + private scrollThrottled$: Observable; + private resize$ = new Subject(); + private resizeThrottled$: Observable; + private extraordinaryChange$ = new BehaviorSubject(undefined); + private status$: Observable; + private componentDestroyed = new Subject(); + + constructor(private stickyElement: ElementRef, @Inject(PLATFORM_ID) private platformId: string) { + + /** Throttle the scroll to animation frame (around 16.67ms) */ + this.scrollThrottled$ = this.scroll$ + .pipe( + throttleTime(0, animationFrame), + share() + ); + + /** Throttle the resize to animation frame (around 16.67ms) */ + this.resizeThrottled$ = this.resize$ + .pipe( + throttleTime(0, animationFrame), + // emit once since we are currently using combineLatest + startWith(null), + share() + ); + + this.status$ = combineLatest( + this.enable$, + this.scrollThrottled$, + this.marginTop$, + this.marginBottom$, + this.extraordinaryChange$, + this.resizeThrottled$, + ) + .pipe( + filter(([enabled]) => this.checkEnabled(enabled)), + map(([enabled, pageYOffset, marginTop, marginBottom]) => this.determineStatus(this.determineElementOffsets(), pageYOffset, marginTop, marginBottom, enabled)), + share(), + ); + + } + + @Input() set marginTop(value: number) { + this.marginTop$.next(value); + } + + @Input() set marginBottom(value: number) { + this.marginBottom$.next(value); + } + + @Input() set enable(value: boolean) { + this.enable$.next(value); + } + + ngAfterViewInit(): void { + this.status$ + .pipe(takeUntil(this.componentDestroyed)) + .subscribe((status) => this.setSticky(status)); + } + + public recalculate(): void { + if (isPlatformBrowser(this.platformId)) { + // Make sure to be in the next tick by using timeout + setTimeout(() => { + this.extraordinaryChange$.next(undefined); + }, 0); + } + } + + + /** + * This is nasty code that should be refactored at some point. + * + * The Problem is, we filter for enabled. So that the code doesn't run + * if @Input enabled = false. But if the user disables, we need exactly 1 + * emit in order to reset and call removeSticky. So this method basically + * turns the filter in "filter, but let the first pass". + */ + checkEnabled(enabled: boolean): boolean { + + if (!isPlatformBrowser(this.platformId)) { + return false; + } + + if (enabled) { + // reset the gate + this.filterGate = false; + return true; + } else { + if (this.filterGate) { + // gate closed, first emit has happened + return false; + } else { + // this is the first emit for enabled = false, + // let it pass, and activate the gate + // so the next wont pass. + this.filterGate = true; + return true; + } + } + + + } + + @HostListener('window:resize', []) + onWindowResize(): void { + if (isPlatformBrowser(this.platformId)) { + this.resize$.next(); + } + } + + setupListener(): void { + if (isPlatformBrowser(this.platformId)) { + const target = this.getScrollTarget(); + target.addEventListener('scroll', this.listener); + } + } + + removeListener() { + if (isPlatformBrowser(this.platformId)) { + const target = this.getScrollTarget(); + target.removeEventListener('scroll', this.listener); + } + } + + listener = (e: Event) => { + const upperScreenEdgeAt = (e.target as HTMLElement).scrollTop || window.pageYOffset; + this.scroll$.next(upperScreenEdgeAt); + } + + + ngOnInit(): void { + // this.checkSetup(); + this.setupListener(); + } + + ngOnDestroy(): void { + this.componentDestroyed.next(); + this.removeListener(); + } + + getComputedStyle(el: HTMLElement): ClientRect | DOMRect { + return el.getBoundingClientRect(); + } + + private getScrollTarget(): Element | Window { + + let target: Element | Window; + + if (this.scrollContainer && typeof this.scrollContainer === 'string') { + target = document.querySelector(this.scrollContainer); + } else if (this.scrollContainer && this.scrollContainer instanceof HTMLElement) { + target = this.scrollContainer; + } else { + target = window; + } + return target; + } + + private determineStatus(originalVals: StickyPositions, pageYOffset: number, marginTop: number, marginBottom: number, enabled: boolean): StickyStatus { + const stickyElementHeight = this.getComputedStyle(this.stickyElement.nativeElement).height; + const reachedLowerEdge = this.boundaryElement && window.pageYOffset + stickyElementHeight + marginBottom >= (originalVals.bottomBoundary - marginTop); + return { + isSticky: enabled && pageYOffset > originalVals.offsetY, + reachedLowerEdge, + marginBottom, + marginTop, + }; + } + + + /** + * Gets the offset for element. If the element + * currently is sticky, it will get removed + * to access the original position. Other + * wise this would just be 0 for fixed elements. + */ + private determineElementOffsets(): StickyPositions { + if (this.sticky) { + this.removeSticky(); + } + + let bottomBoundary: number | null = null; + + if (this.boundaryElement) { + const boundaryElementHeight = this.getComputedStyle(this.boundaryElement).height; + const boundaryElementOffset = getPosition(this.boundaryElement).y; + bottomBoundary = boundaryElementHeight + boundaryElementOffset; + } + + return {offsetY: (getPosition(this.stickyElement.nativeElement).y - this.marginTop$.value), bottomBoundary}; + } + + private makeSticky(boundaryReached: boolean = false, marginTop: number, marginBottom: number): void { + + this.boundaryReached = boundaryReached; + + // do this before setting it to pos:fixed + const {width, height, left} = this.getComputedStyle(this.stickyElement.nativeElement); + const offSet = boundaryReached ? (this.getComputedStyle(this.boundaryElement).bottom - height - this.marginBottom$.value) : this.marginTop$.value; + + this.sticky = true; + this.stickyElement.nativeElement.style.position = 'sticky'; + this.stickyElement.nativeElement.style.backgroundColor = '#fff'; + this.stickyElement.nativeElement.style.top = this.marginTop$.value + 'px'; + // this.stickyElement.nativeElement.style.left = left + 'px'; + this.stickyElement.nativeElement.style.width = `${width}px`; + this.stickyElement.nativeElement.style.zIndex = `2`; + if (this.spacerElement) { + const spacerHeight = marginBottom + height + marginTop; + this.spacerElement.style.height = `${spacerHeight}px`; + } + } + + private checkSetup() { + if (isDevMode() && !this.spacerElement) { + console.warn(`******There might be an issue with your sticky directive!****** + +You haven't specified a spacer element. This will cause the page to jump. + +Best practise is to provide a spacer element (e.g. a div) right before/after the sticky element. +Then pass the spacer element as input: + +
+ +
+ I am sticky! +
`); + } + } + + + private setSticky(status: StickyStatus): void { + if (status.isSticky) { + this.makeSticky(status.reachedLowerEdge, status.marginTop, status.marginBottom); + } else { + this.removeSticky(); + } + } + + private removeSticky(): void { + + this.boundaryReached = false; + this.sticky = false; + + this.stickyElement.nativeElement.style.position = ''; + this.stickyElement.nativeElement.style.width = 'auto'; + this.stickyElement.nativeElement.style.left = 'auto'; + this.stickyElement.nativeElement.style.top = 'auto'; + if (this.spacerElement) { + this.spacerElement.style.height = '0'; + } + } +} + +// Thanks to https://stanko.github.io/javascript-get-element-offset/ +function getPosition(el) { + let top = 0; + let left = 0; + let element = el; + + // Loop through the DOM tree + // and add it's parent's offset to get page offset + do { + top += element.offsetTop || 0; + left += element.offsetLeft || 0; + element = element.offsetParent; + } while (element); + + return { + y: top, + x: left, + }; +} diff --git a/src/app/core/_base/layout/directives/tab-click-event.directive.ts b/src/app/core/_base/layout/directives/tab-click-event.directive.ts new file mode 100644 index 0000000..288c0a3 --- /dev/null +++ b/src/app/core/_base/layout/directives/tab-click-event.directive.ts @@ -0,0 +1,35 @@ +import { Directive, ElementRef, HostListener, Renderer2 } from '@angular/core'; + +/** + * Listen Tab click + */ +@Directive({ + selector: '[ktTabClickEvent]' +}) +export class TabClickEventDirective { + /** + * Directive Constructor + * @param el: ElementRef + * @param render: Renderer2 + */ + constructor(private el: ElementRef, private render: Renderer2) { } + + /** + * A directive handler the tab click event for active tab + * @param target + */ + @HostListener('click', ['$event.target']) + onClick(target: HTMLElement) { + // remove previous active tab + const parent = target.closest('[role="tablist"]'); + const activeLink = parent.querySelector('[role="tab"].active'); + if (activeLink) { + this.render.removeClass(activeLink, 'active'); + } + // set active tab + const link = target.closest('[role="tab"]'); + if (link) { + this.render.addClass(link, 'active'); + } + } +} diff --git a/src/app/core/_base/layout/directives/toggle.directive.ts b/src/app/core/_base/layout/directives/toggle.directive.ts new file mode 100644 index 0000000..54ea755 --- /dev/null +++ b/src/app/core/_base/layout/directives/toggle.directive.ts @@ -0,0 +1,38 @@ +// Angular +import { AfterViewInit, Directive, ElementRef, Input } from '@angular/core'; + +export interface ToggleOptions { + target?: string; + targetState?: string; + togglerState?: string; +} + +/** + * Toggle + */ +@Directive({ + selector: '[ktToggle]', + exportAs: 'ktToggle' +}) +export class ToggleDirective implements AfterViewInit { + // Public properties + @Input() options: ToggleOptions; + toggle: any; + + /** + * Directive constructor + * @param el: ElementRef + */ + constructor(private el: ElementRef) { } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * After view init + */ + ngAfterViewInit(): void { + this.toggle = new KTToggle(this.el.nativeElement, this.options); + } +} diff --git a/src/app/core/_base/layout/index.ts b/src/app/core/_base/layout/index.ts new file mode 100644 index 0000000..8d3b46b --- /dev/null +++ b/src/app/core/_base/layout/index.ts @@ -0,0 +1,45 @@ +// Directives +export { SparklineChartOptions, SparklineChartDirective } from './directives/sparkline-chart.directive'; +export { OffcanvasDirective } from './directives/offcanvas.directive'; +export { ScrollTopDirective } from './directives/scroll-top.directive'; +export { TabClickEventDirective } from './directives/tab-click-event.directive'; +export { ToggleDirective } from './directives/toggle.directive'; + +export { ContentAnimateDirective } from './directives/content-animate.directive'; +export { HeaderDirective } from './directives/header.directive'; +export { MenuDirective } from './directives/menu.directive'; +export { StickyDirective } from './directives/sticky.directive'; + +// Models +export { DataTableItemModel } from './models/datatable-item.model'; +export { ExternalCodeExample } from './models/external-code-example'; +export { OffcanvasOptions } from './directives/offcanvas.directive'; +export { ScrollTopOptions } from './directives/scroll-top.directive'; +export { ToggleOptions } from './directives/toggle.directive'; + +export { LayoutConfigModel } from './models/layout-config.model'; +export { MenuOptions } from './directives/menu.directive'; + +// Pipes +export { FirstLetterPipe } from './pipes/first-letter.pipe'; +export { GetObjectPipe } from './pipes/get-object.pipe'; +export { JoinPipe } from './pipes/join.pipe'; +export { SafePipe } from './pipes/safe.pipe'; +export { TimeElapsedPipe } from './pipes/time-elapsed.pipe'; + +// Services +export { DataTableService } from './services/datatable.service'; +export { TranslationService } from './services/translation.service'; + +export { LayoutConfigService } from './services/layout-config.service'; +export { LayoutRefService } from './services/layout-ref.service'; +export { MenuAsideService } from './services/menu-aside.service'; +export { MenuConfigService } from './services/menu-config.service'; +export { MenuHorizontalService } from './services/menu-horizontal.service'; +export { PageConfigService } from './services/page-config.service'; +export { SplashScreenService } from './services/splash-screen.service'; +export { SubheaderService } from './services/subheader.service'; +export { KtDialogService } from './services/kt-dialog.service'; + +// Server +export { FakeApiService } from './server/fake-api/fake-api.service'; diff --git a/src/app/core/_base/layout/models/datatable-item.model.ts b/src/app/core/_base/layout/models/datatable-item.model.ts new file mode 100644 index 0000000..0fcdda5 --- /dev/null +++ b/src/app/core/_base/layout/models/datatable-item.model.ts @@ -0,0 +1,13 @@ +export class DataTableItemModel { + id: number; + cModel: string; + cManufacture: string; + cModelYear: number; + cMileage: number; + cDescription: string; + cColor: string; + cPrice: number; + cCondition: number; + cStatus: number; + cVINCode: string; +} diff --git a/src/app/core/_base/layout/models/external-code-example.ts b/src/app/core/_base/layout/models/external-code-example.ts new file mode 100644 index 0000000..bb8222b --- /dev/null +++ b/src/app/core/_base/layout/models/external-code-example.ts @@ -0,0 +1,15 @@ +export class ExternalCodeExample { + beforeCodeTitle: string; + beforeCodeDescription: string; + htmlCode: string; + tsCode: string; + cssCode: string; + scssCode: string; + viewCode: string; + codeTitle: string; + afterCodeTitle: string; + afterCodeDescription: string; + sourceLink: string; + isCodeVisible = true; + isExampleExpanded: boolean; +} diff --git a/src/app/core/_base/layout/models/layout-config.model.ts b/src/app/core/_base/layout/models/layout-config.model.ts new file mode 100644 index 0000000..fc00ab2 --- /dev/null +++ b/src/app/core/_base/layout/models/layout-config.model.ts @@ -0,0 +1,168 @@ +export interface LayoutConfigModel { + demo: string; + self: { + layout?: string; + body?: { + 'background-image'?: string, + 'class'?: string, + 'background-position'?: string, + 'background-size'?: string + }; + logo: any | string; + }; + portlet?: { + sticky: { + offset: number + } + }; + loader: { + enabled: boolean; + type?: string | 'default' | 'spinner-message' | 'spinner-logo'; + logo?: string; + message?: string; + }; + colors: { + state?: any; + base: { + label: Array; + shape: Array + } + }; + width?: string; + header: { + self: { + skin?: string; + width?: string; + fixed: { + desktop: any; + mobile: boolean + } + }; + // not implemented yet + topbar?: { + self?: { + width?: string; + } + search?: { + display: boolean; + layout: 'offcanvas' | 'dropdown'; + dropdown?: { + style: 'light' | 'dark'; + } + }; + notifications?: { + display: boolean; + layout: 'offcanvas' | 'dropdown'; + dropdown: { + style: 'light' | 'dark'; + } + }; + 'quick-actions'?: { + display: boolean; + layout: 'offcanvas' | 'dropdown'; + dropdown: { + style: 'light' | 'dark'; + } + }; + user?: { + display: boolean; + layout: 'offcanvas' | 'dropdown'; + dropdown: { + style: 'light' | 'dark'; + } + }; + languages?: { + display: boolean + }; + cart?: { + display: boolean + }; + 'my-cart'?: any + 'quick-panel'?: { + display: boolean + } + }; + search?: { + display: boolean + }; + menu?: { + self: { + display: boolean; + layout?: string; + 'root-arrow'?: boolean; + width?: string; + }; + desktop: { + arrow: boolean; + toggle: string; + submenu: { + skin?: string; + arrow: boolean + } + }; + mobile: { + submenu: { + skin: string; + accordion: boolean + } + } + } + }; + brand?: { + self: { + skin: string + } + }; + aside?: { + self: { + skin?: string; + display: boolean; + fixed?: boolean | any; + minimize?: { + toggle: boolean; + default: boolean + } + }; + footer?: { + self: { + display: boolean + } + }; + menu: { + 'root-arrow'?: boolean; + dropdown: boolean; + scroll: boolean; + submenu: { + accordion: boolean; + dropdown: { + arrow: boolean; + 'hover-timeout': number + } + } + } + }; + 'aside-secondary'?: { + self: { + display: boolean; + layout?: string; + expanded?: boolean; + } + }; + subheader?: { + display: boolean; + fixed?: boolean; + width?: string; + layout?: string; + style?: 'light' | 'solid' | 'transparent'; + daterangepicker?: { + display: boolean + } + }; + content?: any; + footer?: { + self?: any; + }; + 'quick-panel'?: { + display?: boolean + }; +} diff --git a/src/app/core/_base/layout/pipes/first-letter.pipe.ts b/src/app/core/_base/layout/pipes/first-letter.pipe.ts new file mode 100644 index 0000000..cd518b0 --- /dev/null +++ b/src/app/core/_base/layout/pipes/first-letter.pipe.ts @@ -0,0 +1,21 @@ +// Angular +import { Pipe, PipeTransform } from '@angular/core'; + +/** + * Returns only first letter of string + */ +@Pipe({ + name: 'firstLetter' +}) +export class FirstLetterPipe implements PipeTransform { + + /** + * Transform + * + * @param value: any + * @param args: any + */ + transform(value: any, args?: any): any { + return value.split(' ').map(n => n[0]).join(''); + } +} diff --git a/src/app/core/_base/layout/pipes/get-object.pipe.ts b/src/app/core/_base/layout/pipes/get-object.pipe.ts new file mode 100644 index 0000000..5b7ba00 --- /dev/null +++ b/src/app/core/_base/layout/pipes/get-object.pipe.ts @@ -0,0 +1,22 @@ +// Angular +import { Pipe, PipeTransform } from '@angular/core'; +// Object-Path +import * as objectPath from 'object-path'; + +/** + * Returns object from parent object + */ +@Pipe({ + name: 'getObject' +}) +export class GetObjectPipe implements PipeTransform { + /** + * Transform + * + * @param value: any + * @param args: any + */ + transform(value: any, args?: any): any { + return objectPath.get(value, args); + } +} diff --git a/src/app/core/_base/layout/pipes/join.pipe.ts b/src/app/core/_base/layout/pipes/join.pipe.ts new file mode 100644 index 0000000..66542df --- /dev/null +++ b/src/app/core/_base/layout/pipes/join.pipe.ts @@ -0,0 +1,23 @@ +// Angular +import { Pipe, PipeTransform } from '@angular/core'; + +/** + * Returns string from Array + */ +@Pipe({ + name: 'join' +}) +export class JoinPipe implements PipeTransform { + /** + * Transform + * + * @param value: any + * @param args: any + */ + transform(value: any, args?: any): any { + if (Array.isArray(value)) { + return value.join(' '); + } + return value; + } +} diff --git a/src/app/core/_base/layout/pipes/safe.pipe.ts b/src/app/core/_base/layout/pipes/safe.pipe.ts new file mode 100644 index 0000000..a814ae2 --- /dev/null +++ b/src/app/core/_base/layout/pipes/safe.pipe.ts @@ -0,0 +1,42 @@ +// Angular +import { Pipe, PipeTransform } from '@angular/core'; +import { DomSanitizer, SafeHtml, SafeStyle, SafeScript, SafeUrl, SafeResourceUrl } from '@angular/platform-browser'; + +/** + * Sanitize HTML + */ +@Pipe({ + name: 'safe' +}) +export class SafePipe implements PipeTransform { + /** + * Pipe Constructor + * + * @param _sanitizer: DomSanitezer + */ + constructor(protected _sanitizer: DomSanitizer) { } + + /** + * Transform + * + * @param value: string + * @param type: string + */ + transform(value: string, type: string): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl { + switch (type) { + case 'html': + return this._sanitizer.bypassSecurityTrustHtml(value); + case 'style': + return this._sanitizer.bypassSecurityTrustStyle(value); + case 'script': + return this._sanitizer.bypassSecurityTrustScript(value); + case 'url': + return this._sanitizer.bypassSecurityTrustUrl(value); + case 'resourceUrl': + return this._sanitizer.bypassSecurityTrustResourceUrl(value); + default: + return this._sanitizer.bypassSecurityTrustHtml(value); + } + } + +} diff --git a/src/app/core/_base/layout/pipes/time-elapsed.pipe.ts b/src/app/core/_base/layout/pipes/time-elapsed.pipe.ts new file mode 100644 index 0000000..6657a14 --- /dev/null +++ b/src/app/core/_base/layout/pipes/time-elapsed.pipe.ts @@ -0,0 +1,123 @@ +// Angular +import { Pipe, PipeTransform, OnDestroy, ChangeDetectorRef, NgZone } from '@angular/core'; + +/** + * https://github.com/AndrewPoyntz/time-ago-pipe + * An Angular pipe for converting a date string into a time ago + */ +@Pipe({ + name: 'kTimeElapsed' +}) +export class TimeElapsedPipe implements PipeTransform, OnDestroy { + // Private properties + private timer: number; + + /** + * Pipe Constructor + * + * @param changeDetectorRef: ChangeDetectorRef + * @param ngZone: NgZone + */ + constructor( + private changeDetectorRef: ChangeDetectorRef, + private ngZone: NgZone + ) {} + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On destroy + */ + ngOnDestroy(): void { + this.removeTimer(); + } + + /** + * Transform + * + * @param value: string + */ + transform(value: string) { + this.removeTimer(); + const d = new Date(value); + const now = new Date(); + const seconds = Math.round( + Math.abs((now.getTime() - d.getTime()) / 1000) + ); + const timeToUpdate = this.getSecondsUntilUpdate(seconds) * 1000; + this.timer = this.ngZone.runOutsideAngular(() => { + if (typeof window !== 'undefined') { + return window.setTimeout(() => { + this.ngZone.run(() => + this.changeDetectorRef.markForCheck() + ); + }, timeToUpdate); + } + return null; + }); + const minutes = Math.round(Math.abs(seconds / 60)); + const hours = Math.round(Math.abs(minutes / 60)); + const days = Math.round(Math.abs(hours / 24)); + const months = Math.round(Math.abs(days / 30.416)); + const years = Math.round(Math.abs(days / 365)); + if (seconds <= 45) { + return 'just now'; + } else if (seconds <= 90) { + return '1 min'; + } else if (minutes <= 45) { + return minutes + ' mins'; + } else if (minutes <= 90) { + return '1 hr'; + } else if (hours <= 22) { + return hours + ' hrs'; + } else if (hours <= 36) { + return '1 day'; + } else if (days <= 25) { + return days + ' days'; + } else if (days <= 45) { + return '1 month'; + } else if (days <= 345) { + return months + ' months'; + } else if (days <= 545) { + return '1 year'; + } else { + // (days > 545) + return years + ' years'; + } + } + + /** + * Remove timer + */ + private removeTimer() { + if (this.timer) { + window.clearTimeout(this.timer); + this.timer = null; + } + } + + /** + * Returns Seconds Until Update + * @param seconds: number + */ + private getSecondsUntilUpdate(seconds: number) { + const min = 60; + const hr = min * 60; + const day = hr * 24; + if (seconds < min) { + // less than 1 min, update ever 2 secs + return 2; + } else if (seconds < hr) { + // less than an hour, update every 30 secs + return 30; + } else if (seconds < day) { + // less then a day, update every 5 mins + return 300; + } else { + // update every hour + return 3600; + } + } +} diff --git a/src/app/core/_base/layout/server/fake-api/fake-api.service.ts b/src/app/core/_base/layout/server/fake-api/fake-api.service.ts new file mode 100644 index 0000000..9be02e0 --- /dev/null +++ b/src/app/core/_base/layout/server/fake-api/fake-api.service.ts @@ -0,0 +1,48 @@ +// Angular +import { Injectable } from '@angular/core'; +// Angular in memory +import { InMemoryDbService } from 'angular-in-memory-web-api'; +// RxJS +import { Observable } from 'rxjs'; +// Auth +import { AuthDataContext } from '../../../../auth'; +// ECommerce +import { ECommerceDataContext } from '../../../../e-commerce'; +// Models +import { CarsDb } from './fake-db/cars'; + +@Injectable() +export class FakeApiService implements InMemoryDbService { + /** + * Service Constructore + */ + constructor() {} + + /** + * Create Fake DB and API + */ + createDb(): {} | Observable<{}> { + // tslint:disable-next-line:class-name + const db = { + // auth module + users: AuthDataContext.users, + roles: AuthDataContext.roles, + permissions: AuthDataContext.permissions, + + // e-commerce + // customers + customers: ECommerceDataContext.customers, + // products + products: ECommerceDataContext.cars, + productRemarks: ECommerceDataContext.remarks, + productSpecs: ECommerceDataContext.carSpecs, + + // orders + orders: ECommerceDataContext.orders, + + // data-table + cars: CarsDb.cars + }; + return db; + } +} diff --git a/src/app/core/_base/layout/server/fake-api/fake-db/cars.ts b/src/app/core/_base/layout/server/fake-api/fake-db/cars.ts new file mode 100644 index 0000000..32bc2ee --- /dev/null +++ b/src/app/core/_base/layout/server/fake-api/fake-db/cars.ts @@ -0,0 +1,481 @@ +export class CarsDb { + public static cars: any = [ + { + id: 1, + cModel: 'Elise', + cManufacture: 'Lotus', + cModelYear: 2004, + cMileage: 116879, + // tslint:disable-next-line:max-line-length + cDescription: `The Lotus Elise first appeared in 1996 and revolutionised small sports car design with its lightweight extruded aluminium chassis and composite body. There have been many variations, but the basic principle remain the same.`, + cColor: 'Red', + cPrice: 18347, + cCondition: 1, + createdDate: '09/30/2017', + cStatus: 0, + cVINCode: '1FTWX3D52AE575540', + }, { + id: 2, + cModel: 'Sunbird', + cManufacture: 'Pontiac', + cModelYear: 1984, + cMileage: 99515, + // tslint:disable-next-line:max-line-length + cDescription: `The Pontiac Sunbird is an automobile that was produced by Pontiac, initially as a subcompact for the 1976 to 1980 cModel years,and later as a compact for the 1982 to 1994 cModel years. The Sunbird badge ran for 18 years (with a hiatus during the 1981 and 1982 cModel years, as the 1982 cModel was called J2000) and was then replaced in 1995 by the Pontiac Sunfire. Through the years the Sunbird was available in notchback coupé, sedan, hatchback, station wagon, and convertible body styles.`, + cColor: 'Khaki', + cPrice: 165956, + cCondition: 0, + createdDate: '03/22/2018', + cStatus: 1, + cVINCode: 'JM1NC2EF8A0293556' + }, { + id: 3, + cModel: 'Amigo', + cManufacture: 'Isuzu', + cModelYear: 1993, + cMileage: 138027, + // tslint:disable-next-line:max-line-length + cDescription: `The Isuzu MU is a mid-size SUV that was produced by the Japan-based cManufacturer Isuzu. The three-door MU was introduced in 1989, followed in 1990 by the five-door version called Isuzu MU Wizard, both of which stopped production in 1998 to be replaced by a second generation. This time, the five-door version dropped the "MU" prefix, to become the Isuzu Wizard. The acronym "MU" is short for "Mysterious Utility". Isuzu cManufactured several variations to the MU and its derivates for sale in other countries.`, + cColor: 'Aquamarine', + cPrice: 45684, + cCondition: 0, + createdDate: '03/06/2018', + cStatus: 0, + cVINCode: '1G6DG8E56C0973889' + }, { + id: 4, + cModel: 'LS', + cManufacture: 'Lexus', + cModelYear: 2004, + cMileage: 183068, + // tslint:disable-next-line:max-line-length + cDescription: `The Lexus LS (Japanese: レクサス・LS, Rekusasu LS) is a full-size luxury car (F-segment in Europe) serving as the flagship cModel of Lexus, the luxury division of Toyota. For the first four generations, all LS cModels featured V8 engines and were predominantly rear-wheel-drive, with Lexus also offering all-wheel-drive, hybrid, and long-wheelbase variants. The fifth generation changed to using a V6 engine with no V8 option, and the long wheelbase variant was removed entirely.`, + cColor: 'Mauv', + cPrice: 95410, + cCondition: 1, + createdDate: '02/03/2018', + cStatus: 1, + cVINCode: '2T1BU4EE6DC859114' + }, { + id: 5, + cModel: 'Paseo', + cManufacture: 'Toyota', + cModelYear: 1997, + cMileage: 74884, + // tslint:disable-next-line:max-line-length + cDescription: `The Toyota Paseo (known as the Cynos in Japan and other regions) is a sports styled compact car sold from 1991–1999 and was loosely based on the Tercel. It was available as a coupe and in later cModels as a convertible. Toyota stopped selling the car in the United States in 1997, however the car continued to be sold in Canada, Europe and Japan until 1999, but had no direct replacement. The Paseo, like the Tercel, shares a platform with the Starlet. Several parts are interchangeable between the three`, + cColor: 'Pink', + cPrice: 24796, + cCondition: 1, + createdDate: '08/13/2017', + cStatus: 0, + cVINCode: '1D7RB1GP0AS597432' + }, { + id: 6, + cModel: 'M', + cManufacture: 'Infiniti', + cModelYear: 2009, + cMileage: 194846, + // tslint:disable-next-line:max-line-length + cDescription: `The Infiniti M is a line of mid-size luxury (executive) cars from the Infiniti luxury division of Nissan.\r\nThe first iteration was the M30 Coupe/Convertible, which were rebadged JDM Nissan Leopard.\r\nAfter a long hiatus, the M nameplate was used for Infiniti's mid-luxury sedans (executive cars). First was the short-lived M45 sedan, a rebadged version of the Japanese-spec Nissan Gloria. The next generations, the M35/45 and M37/56/35h/30d, became the flagship of the Infiniti brand and are based on the JDM Nissan Fuga.`, + cColor: 'Puce', + cPrice: 30521, + cCondition: 1, + createdDate: '01/27/2018', + cStatus: 0, + cVINCode: 'YV1940AS1D1542424' + }, { + id: 7, + cModel: 'Phantom', + cManufacture: 'Rolls-Royce', + cModelYear: 2008, + cMileage: 164124, + // tslint:disable-next-line:max-line-length + cDescription: `The Rolls-Royce Phantom VIII is a luxury saloon car cManufactured by Rolls-Royce Motor Cars. It is the eighth and current generation of Rolls-Royce Phantom, and the second launched by Rolls-Royce under BMW ownership. It is offered in two wheelbase lengths`, + cColor: 'Purple', + cPrice: 196247, + cCondition: 1, + createdDate: '09/28/2017', + cStatus: 1, + cVINCode: '3VWML7AJ1DM234625' + }, { + id: 8, + cModel: 'QX', + cManufacture: 'Infiniti', + cModelYear: 2002, + cMileage: 57410, + // tslint:disable-next-line:max-line-length + cDescription: `The Infiniti QX80 (called the Infiniti QX56 until 2013) is a full-size luxury SUV built by Nissan Motor Company's Infiniti division. The naming convention originally adhered to the current trend of using a numeric designation derived from the engine's displacement, thus QX56 since the car has a 5.6-liter engine. From the 2014 cModel year, the car was renamed the QX80, as part of Infiniti's cModel name rebranding. The new name carries no meaning beyond suggesting that the vehicle is larger than smaller cModels such as the QX60`, + cColor: 'Green', + cPrice: 185775, + cCondition: 1, + createdDate: '11/15/2017', + cStatus: 0, + cVINCode: 'WDDHF2EB9CA161524' + }, { + id: 9, + cModel: 'Daytona', + cManufacture: 'Dodge', + cModelYear: 1993, + cMileage: 4444, + // tslint:disable-next-line:max-line-length + cDescription: `The Dodge Daytona was an automobile which was produced by the Chrysler Corporation under their Dodge division from 1984 to 1993. It was a front-wheel drive hatchback based on the Chrysler G platform, which was derived from the Chrysler K platform. The Chrysler Laser was an upscale rebadged version of the Daytona. The Daytona was restyled for 1987, and again for 1992. It replaced the Mitsubishi Galant-based Challenger, and slotted between the Charger and the Conquest. The Daytona was replaced by the 1995 Dodge Avenger, which was built by Mitsubishi Motors. The Daytona derives its name mainly from the Dodge Charger Daytona, which itself was named after the Daytona 500 race in Daytona Beach, Florida.`, + cColor: 'Maroon', + cPrice: 171898, + cCondition: 0, + createdDate: '12/24/2017', + cStatus: 1, + cVINCode: 'WBAET37422N752051' + }, { + id: 10, + cModel: '1500 Silverado', + cManufacture: 'Chevrolet', + cModelYear: 1999, + cMileage: 195310, + // tslint:disable-next-line:max-line-length + cDescription: `The Chevrolet Silverado, and its mechanically identical cousin, the GMC Sierra, are a series of full-size and heavy-duty pickup trucks cManufactured by General Motors and introduced in 1998 as the successor to the long-running Chevrolet C/K line. The Silverado name was taken from a trim level previously used on its predecessor, the Chevrolet C/K pickup truck from 1975 through 1998. General Motors continues to offer a GMC-badged variant of the Chevrolet full-size pickup under the GMC Sierra name, first used in 1987 for its variant of the GMT400 platform trucks.`, + cColor: 'Blue', + cPrice: 25764, + cCondition: 0, + createdDate: '08/30/2017', + cStatus: 1, + cVINCode: '1N6AF0LX6EN590806' + }, { + id: 11, + cModel: 'CTS', + cManufacture: 'Cadillac', + cModelYear: 2012, + cMileage: 170862, + // tslint:disable-next-line:max-line-length + cDescription: `The Cadillac CTS is a mid-size luxury car / executive car designed, engineered, cManufactured and marketed by General Motors, and now in its third generation. \r\nInitially available only as a 4-door sedan on the GM Sigma platform, GM had offered the second generation CTS in three body styles: 4-door sedan, 2-door coupe, and 5-door sport wagon also using the Sigma platform — and the third generation in coupe and sedan configurations, using a stretched version of the GM Alpha platform.\r\nWayne Cherry and Kip Wasenko designed the exterior of the first generation CTS, marking the production debut of a design language (marketed as "Art and Science") first seen on the Evoq concept car. Bob Boniface and Robin Krieg designed the exterior of the third generation CTS`, + cColor: 'Crimson', + cPrice: 80588, + cCondition: 0, + createdDate: '02/15/2018', + cStatus: 0, + cVINCode: '1G4HR54KX4U506530' + }, { + id: 12, + cModel: 'Astro', + cManufacture: 'Chevrolet', + cModelYear: 1995, + cMileage: 142137, + // tslint:disable-next-line:max-line-length + cDescription: `The Chevrolet Astro was a rear-wheel drive van/minivan cManufactured and marketed by the American automaker Chevrolet from 1985 to 2005 and over two build generations. Along with its rebadged variant, the GMC Safari, the Astro was marketed in passenger as well as cargo and livery configurations—featuring a V6 engine, unibody construction with a separate front engine/suspension sub-frame, leaf-spring rear suspension, rear bi-parting doors, and a seating capacity of up to eight passengers`, + cColor: 'Teal', + cPrice: 72430, + cCondition: 1, + createdDate: '07/31/2017', + cStatus: 0, + cVINCode: 'KMHGH4JH2DU676107' + }, { + id: 13, + cModel: 'XL7', + cManufacture: 'Suzuki', + cModelYear: 2009, + cMileage: 165165, + // tslint:disable-next-line:max-line-length + cDescription: `The Suzuki XL-7 (styled as XL7 for the second generation) is Suzuki's mid-sized SUV that was made from 1998 to 2009, over two generations. It was slotted above the Grand Vitara in Suzuki's lineup.`, + cColor: 'Puce', + cPrice: 118667, + cCondition: 0, + createdDate: '02/04/2018', + cStatus: 0, + cVINCode: '1N6AF0LX9EN733005' + }, { + id: 14, + cModel: 'SJ 410', + cManufacture: 'Suzuki', + cModelYear: 1984, + cMileage: 176074, + // tslint:disable-next-line:max-line-length + cDescription: `The SJ-Series was introduced to the United States (Puerto Rico (SJ-410) and Canada earlier) in 1985 for the 1986 cModel year. It was cPriced at $6200 and 47,000 were sold in its first year. The Samurai had a 1.3 liter, 63 hp (47 kW), 4-cylinder engine and was available as a convertible or a hardtop, and with or without a rear seat. The Suzuki Samurai became intensely popular within the serious 4WD community for its good off-road performance and reliability compared to other 4WDs of the time. This is due to the fact that while very compact and light, it is a real 4WD vehicle equipped with a transfer case, switchable 4WD and low range. Its lightness makes it a very nimble off-roader less prone to sinking in softer ground than heavier types. It is also considered a great beginner off-roader due to its simple design and ease of engine and suspension modifications.`, + cColor: 'Orange', + cPrice: 84325, + cCondition: 0, + createdDate: '12/22/2017', + cStatus: 0, + cVINCode: '2C3CDYBT6DH183756' + }, { + id: 15, + cModel: 'F-Series', + cManufacture: 'Ford', + cModelYear: 1995, + cMileage: 53030, + // tslint:disable-next-line:max-line-length + cDescription: `The Ford F-Series is a series of light-duty trucks and medium-duty trucks (Class 2-7) that have been marketed and cManufactured by Ford Motor Company since 1948. While most variants of the F-Series trucks are full-size pickup trucks, the F-Series also includes chassis cab trucks and commercial vehicles. The Ford F-Series has been the best-selling vehicle in the United States since 1986 and the best-selling pickup since 1977.[1][2] It is also the best selling vehicle in Canada.[3] As of the 2018 cModel year, the F-Series generates $41.0 billion in annual revenue for Ford, making the F-Series brand more valuable than Coca-Cola and Nike.`, + cColor: 'Aquamarine', + cPrice: 77108, + cCondition: 0, + createdDate: '01/09/2018', + cStatus: 0, + cVINCode: 'WBAVB33526P873481' + }, { + id: 16, + cModel: 'HS', + cManufacture: 'Lexus', + cModelYear: 2011, + cMileage: 84718, + // tslint:disable-next-line:max-line-length + cDescription: `The Lexus HS (Japanese: レクサス・HS, Rekusasu HS) is a dedicated hybrid vehicle introduced by Lexus as a new entry-level luxury compact sedan in 2009.[2] Built on the Toyota New MC platform,[3] it is classified as a compact under Japanese regulations concerning vehicle exterior dimensions and engine displacement. Unveiled at the North American International Auto Show in January 2009, the HS 250h went on sale in July 2009 in Japan, followed by the United States in August 2009 as a 2010 cModel. The HS 250h represented the first dedicated hybrid vehicle in the Lexus lineup, as well as the first offered with an inline-four gasoline engine.[4] Bioplastic materials are used for the vehicle interior.[5] With a total length of 184.8 inches, the Lexus HS is slightly larger than the Lexus IS, but still smaller than the mid-size Lexus ES.`, + cColor: 'Purple', + cPrice: 140170, + cCondition: 0, + createdDate: '11/14/2017', + cStatus: 1, + cVINCode: '1FTWF3A56AE545514' + }, { + id: 17, + cModel: 'Land Cruiser', + cManufacture: 'Toyota', + cModelYear: 2008, + cMileage: 157019, + // tslint:disable-next-line:max-line-length + cDescription: `Production of the first generation Land Cruiser began in 1951 (90 units) as Toyota's version of a Jeep-like vehicle.[2][3] The Land Cruiser has been produced in convertible, hardtop, station wagon and cab chassis versions. The Land Cruiser's reliability and longevity has led to huge popularity, especially in Australia where it is the best-selling body-on-frame, four-wheel drive vehicle.[4] Toyota also extensively tests the Land Cruiser in the Australian outback – considered to be one of the toughest operating environments in both temperature and terrain. In Japan, the Land Cruiser is exclusive to Toyota Japanese dealerships called Toyota Store.`, + cColor: 'Crimson', + cPrice: 72638, + cCondition: 1, + createdDate: '08/08/2017', + cStatus: 1, + cVINCode: '3C3CFFDR2FT957799' + }, { + id: 18, + cModel: 'Wrangler', + cManufacture: 'Jeep', + cModelYear: 1994, + cMileage: 55857, + // tslint:disable-next-line:max-line-length + cDescription: `The Jeep Wrangler is a series of compact and mid-size (Wrangler Unlimited and Wrangler 4-door JL) four-wheel drive off-road vehicle cModels, cManufactured by Jeep since 1986, and currently migrating from its third into its fourth generation. The Wrangler JL was unveiled in late 2017 and will be produced at Jeep's Toledo Complex.`, + cColor: 'Red', + cPrice: 193523, + cCondition: 0, + createdDate: '02/28/2018', + cStatus: 1, + cVINCode: '3C4PDCAB7FT652291' + }, { + id: 19, + cModel: 'Sunbird', + cManufacture: 'Pontiac', + cModelYear: 1994, + cMileage: 165202, + // tslint:disable-next-line:max-line-length + cDescription: `The Pontiac Sunbird is an automobile that was produced by Pontiac, initially as a subcompact for the 1976 to 1980 cModel years, and later as a compact for the 1982 to 1994 cModel years. The Sunbird badge ran for 18 years (with a hiatus during the 1981 and 1982 cModel years, as the 1982 cModel was called J2000) and was then replaced in 1995 by the Pontiac Sunfire. Through the years the Sunbird was available in notchback coupé, sedan, hatchback, station wagon, and convertible body styles.`, + cColor: 'Blue', + cPrice: 198739, + cCondition: 0, + createdDate: '05/13/2017', + cStatus: 1, + cVINCode: '1GD22XEG9FZ103872' + }, { + id: 20, + cModel: 'A4', + cManufacture: 'Audi', + cModelYear: 1998, + cMileage: 117958, + // tslint:disable-next-line:max-line-length + cDescription: `The A4 has been built in five generations and is based on the Volkswagen Group B platform. The first generation A4 succeeded the Audi 80. The automaker's internal numbering treats the A4 as a continuation of the Audi 80 lineage, with the initial A4 designated as the B5-series, followed by the B6, B7, B8 and the B9. The B8 and B9 versions of the A4 are built on the Volkswagen Group MLB platform shared with many other Audi cModels and potentially one Porsche cModel within Volkswagen Group`, + cColor: 'Yellow', + cPrice: 159377, + cCondition: 0, + createdDate: '12/15/2017', + cStatus: 1, + cVINCode: '2C3CDXCT2FH350366' + }, { + id: 21, + cModel: 'Camry Solara', + cManufacture: 'Toyota', + cModelYear: 2006, + cMileage: 22436, + // tslint:disable-next-line:max-line-length + cDescription: `The Toyota Camry Solara, popularly known as the Toyota Solara, is a mid-size coupe/convertible built by Toyota. The Camry Solara is mechanically based on the Toyota Camry and effectively replaced the discontinued Camry Coupe (XV10); however, in contrast with its predecessor's conservative design, the Camry Solara was designed with a greater emphasis on sportiness, with more rakish styling, and uprated suspension and engine tuning intended to provide a sportier feel.[5] The coupe was launched in late 1998 as a 1999 cModel.[1] In 2000, the convertible was introduced, effectively replacing the Celica convertible in Toyota's North American lineup`, + cColor: 'Green', + cPrice: 122562, + cCondition: 0, + createdDate: '07/11/2017', + cStatus: 0, + cVINCode: '3C3CFFHH6DT874066' + }, { + id: 22, + cModel: 'Tribeca', + cManufacture: 'Subaru', + cModelYear: 2007, + cMileage: 127958, + // tslint:disable-next-line:max-line-length + cDescription: `The Subaru Tribeca is a mid-size crossover SUV made from 2005 to 2014. Released in some markets, including Canada, as the Subaru B9 Tribeca, the name "Tribeca" derives from the Tribeca neighborhood of New York City.[1] Built on the Subaru Legacy platform and sold in five- and seven-seat configurations, the Tribeca was intended to be sold alongside a slightly revised version known as the Saab 9-6. Saab, at the time a subsidiary of General Motors (GM), abandoned the 9-6 program just prior to its release subsequent to GM's 2005 divestiture of its 20 percent stake in FHI.`, + cColor: 'Yellow', + cPrice: 90221, + cCondition: 1, + createdDate: '11/12/2017', + cStatus: 0, + cVINCode: 'WVWGU7AN9AE957575' + }, { + id: 23, + cModel: '1500 Club Coupe', + cManufacture: 'GMC', + cModelYear: 1997, + cMileage: 95783, + // tslint:disable-next-line:max-line-length + cDescription: `GMC (General Motors Truck Company), formally the GMC Division of General Motors LLC, is a division of the American automobile cManufacturer General Motors (GM) that primarily focuses on trucks and utility vehicles. GMC sells pickup and commercial trucks, buses, vans, military vehicles, and sport utility vehicles marketed worldwide by General Motors.`, + cColor: 'Teal', + cPrice: 64376, + cCondition: 1, + createdDate: '06/28/2017', + cStatus: 0, + cVINCode: 'SCFBF04BX7G920997' + }, { + id: 24, + cModel: 'Firebird', + cManufacture: 'Pontiac', + cModelYear: 2002, + cMileage: 74063, + // tslint:disable-next-line:max-line-length + cDescription: `The Pontiac Firebird is an American automobile built by Pontiac from the 1967 to the 2002 cModel years. Designed as a pony car to compete with the Ford Mustang, it was introduced 23 February 1967, the same cModel year as GM's Chevrolet division platform-sharing Camaro.[1] This also coincided with the release of the 1967 Mercury Cougar, Ford's upscale, platform-sharing version of the Mustang. The name "Firebird" was also previously used by GM for the General Motors Firebird 1950s and early-1960s`, + cColor: 'Puce', + cPrice: 94178, + cCondition: 1, + createdDate: '09/13/2017', + cStatus: 0, + cVINCode: '3C63D2JL5CG563879' + }, { + id: 25, + cModel: 'RAV4', + cManufacture: 'Toyota', + cModelYear: 1996, + cMileage: 99461, + // tslint:disable-next-line:max-line-length + cDescription: `The Toyota RAV4 (Japanese: トヨタ RAV4 Toyota Ravufō) is a compact crossover SUV (sport utility vehicle) produced by the Japanese automobile cManufacturer Toyota. This was the first compact crossover SUV;[1] it made its debut in Japan and Europe in 1994,[2] and in North America in 1995. The vehicle was designed for consumers wanting a vehicle that had most of the benefits of SUVs, such as increased cargo room, higher visibility, and the option of full-time four-wheel drive, along with the maneuverability and fuel economy of a compact car. Although not all RAV4s are four-wheel-drive, RAV4 stands for "Recreational Activity Vehicle: 4-wheel drive", because the aforementioned equipment is an option in select countries`, + cColor: 'Goldenrod', + cPrice: 48342, + cCondition: 0, + createdDate: '12/29/2017', + cStatus: 0, + cVINCode: '2C4RDGDG6DR836144' + }, { + id: 26, + cModel: 'Amanti / Opirus', + cManufacture: 'Kia', + cModelYear: 2007, + cMileage: 189651, + // tslint:disable-next-line:max-line-length + cDescription: `The Kia Opirus was an executive car cManufactured and marketed by Kia Motors that was launched in April 2003 and was marketed globally under various nameplates, prominently as the Amanti. It was considered to be Kia's flagship vehicle.`, + cColor: 'Indigo', + cPrice: 44292, + cCondition: 1, + createdDate: '09/01/2017', + cStatus: 1, + cVINCode: '1C4SDHCT2CC055294' + }, { + id: 27, + cModel: 'S60', + cManufacture: 'Volvo', + cModelYear: 2001, + cMileage: 78963, + // tslint:disable-next-line:max-line-length + cDescription: `First introduced in 2004, Volvo's S60 R used a Haldex all-wheel-drive system mated to a 300 PS (221 kW; 296 hp) / 400 N⋅m (300 lbf⋅ft) inline-5. The 2004–2005 cModels came with a 6-speed manual transmission, or an available 5-speed automatic which allowed only 258 lb⋅ft (350 N⋅m) torque in 1st and 2nd gears. The 2006–2007 cModels came with a 6-speed manual or 6-speed automatic transmission (which was no longer torque-restricted)`, + cColor: 'Goldenrod', + cPrice: 9440, + cCondition: 0, + createdDate: '11/06/2017', + cStatus: 0, + cVINCode: '3C6TD5CT5CG316067', + }, { + id: 28, + cModel: 'Grand Marquis', + cManufacture: 'Mercury', + cModelYear: 1984, + cMileage: 153027, + // tslint:disable-next-line:max-line-length + cDescription: `The Mercury Grand Marquis is an automobile that was sold by the Mercury division of Ford Motor Company from 1975 to 2011. From 1975 to 1982, it was the premium cModel of the Mercury Marquis cModel line, becoming a standalone cModel line in 1983. For its entire production run, the Grand Marquis served as the flagship of the Mercury line, with the Ford (LTD) Crown Victoria serving as its Ford counterpart. In addition, from 1979 to 2011, the Grand Marquis shared the rear-wheel drive Panther platform alongside the Lincoln Town Car`, + cColor: 'Goldenrod', + cPrice: 76027, + cCondition: 0, + createdDate: '12/16/2017', + cStatus: 1, + cVINCode: '3C3CFFJH2DT871398' + }, { + id: 29, + cModel: 'Talon', + cManufacture: 'Eagle', + cModelYear: 1991, + cMileage: 111234, + // tslint:disable-next-line:max-line-length + cDescription: `Cosmetically, differences between the three were found in wheels, availability of cColors, tail lights, front and rear bumpers, and spoilers. The Talon featured two-tone body cColor with a black 'greenhouse' (roof, pillars, door-mounted mirrors) regardless of the body cColor. The variants featured 5-speed manual or 4-speed automatic transmissions and a hood bulge on the left-hand side of the car in order for camshaft clearance on the 4G63 engine. The base cModel DL did not use this engine but still had a bulge as evident in the 1992 Talon brochure. 2nd Generation cars all had such a bulge, even with the inclusion of the 420A engine`, + cColor: 'Teal', + cPrice: 157216, + cCondition: 0, + createdDate: '05/08/2017', + cStatus: 1, + cVINCode: 'YV1902FH1D2957659' + }, { + id: 30, + cModel: 'Passport', + cManufacture: 'Honda', + cModelYear: 2002, + cMileage: 3812, + // tslint:disable-next-line:max-line-length + cDescription: `The Passport was a part of a partnership between Isuzu and Honda in the 1990s, which saw an exchange of passenger vehicles from Honda to Isuzu, such as the Isuzu Oasis, and trucks from Isuzu to Honda, such as the Passport and Acura SLX. This arrangement was convenient for both companies, as Isuzu discontinued passenger car production in 1993 after a corporate restructuring, and Honda was in desperate need a SUV, a segment that was growing in popularity in North America as well as Japan during the 1990s. The partnership ended in 2002 with the discontinuation of the Passport in favor of the Honda-engineered Pilot`, + cColor: 'Puce', + cPrice: 41299, + cCondition: 1, + createdDate: '03/08/2018', + cStatus: 0, + cVINCode: 'WVWEU9AN4AE524071' + }, { + id: 31, + cModel: 'H3', + cManufacture: 'Hummer', + cModelYear: 2006, + cMileage: 196321, + // tslint:disable-next-line:max-line-length + cDescription: `The Hummer H3 is a sport utility vehicle/off-road vehicle from Hummer that was produced from 2005 to 2010. Introduced for the 2006 cModel year, it was based on a highly modified GMT355 underpinning the Chevrolet cColorado/GMC Canyon compact pickup trucks that were also built at GM's Shreveport Operations in Shreveport, Louisiana and the Port Elizabeth plant in South Africa. The H3 was actually the smallest among the Hummer cModels. It was available either as a traditional midsize SUV or as a midsize pickup known as the H3T`, + cColor: 'Pink', + cPrice: 186964, + cCondition: 1, + createdDate: '06/04/2017', + cStatus: 1, + cVINCode: '4T1BF1FK4FU746230', + }, { + id: 32, + cModel: 'Comanche', + cManufacture: 'Jeep', + cModelYear: 1992, + cMileage: 72285, + // tslint:disable-next-line:max-line-length + cDescription: `The Jeep Comanche (designated MJ) is a pickup truck variant of the Cherokee compact SUV (1984–2001)[3] cManufactured and marketed by Jeep for cModel years 1986-1992 in rear wheel (RWD) and four-wheel drive (4WD) cModels as well as two cargo bed lengths: six-feet (1.83 metres) and seven-feet (2.13 metres)`, + cColor: 'Mauv', + cPrice: 145971, + cCondition: 1, + createdDate: '09/01/2017', + cStatus: 0, + cVINCode: '1J4PN2GK1BW745045' + }, { + id: 33, + cModel: 'Blazer', + cManufacture: 'Chevrolet', + cModelYear: 1993, + cMileage: 189804, + // tslint:disable-next-line:max-line-length + cDescription: `The 2014 – 2nd generation, MY14 Duramax 2.8L diesel engines have several new parts, namely a new water-cooled variable-geometry turbocharger, a new high-pressure common-rail fuel delivery system, a new exhaust gas recirculation (EGR) system, a new intake manifold, a new cylinder head, a new cylinder block, a new balance shaft unit and a new Engine Control Module (ECM). and now produce 197 hp and 369 Ft/Lbs of torque`, + cColor: 'Indigo', + cPrice: 154594, + cCondition: 0, + createdDate: '09/13/2017', + cStatus: 0, + cVINCode: '1G6KD57Y43U482896' + }, { + id: 34, + cModel: 'Envoy XUV', + cManufacture: 'GMC', + cModelYear: 2004, + cMileage: 187960, + // tslint:disable-next-line:max-line-length + cDescription: `The GMC Envoy is a mid-size SUV that was produced by General Motors. It was introduced for the 1998 cModel year. After the first generation Envoy was discontinued after the 2000 cModel year, but the Envoy was reintroduced and redesigned for the 2002 cModel year, and it was available in the GMC line of vehicles from the 2002 to 2009 cModel years`, + cColor: 'Turquoise', + cPrice: 185103, + cCondition: 1, + createdDate: '12/07/2017', + cStatus: 0, + cVINCode: '5GAER23D09J658030' + } + ]; +} diff --git a/src/app/core/_base/layout/services/datatable.service.ts b/src/app/core/_base/layout/services/datatable.service.ts new file mode 100644 index 0000000..71152bb --- /dev/null +++ b/src/app/core/_base/layout/services/datatable.service.ts @@ -0,0 +1,26 @@ +// Angular +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +// RxJS +import { Observable } from 'rxjs'; +// Models +import { DataTableItemModel } from '../models/datatable-item.model'; + +const API_DATATABLE_URL = 'api/cars'; + +@Injectable() +export class DataTableService { + /** + * Service Constructor + * + * @param http: HttpClient + */ + constructor(private http: HttpClient) { } + + /** + * Returns data from fake server + */ + getAllItems(): Observable { + return this.http.get(API_DATATABLE_URL); + } +} diff --git a/src/app/core/_base/layout/services/kt-dialog.service.ts b/src/app/core/_base/layout/services/kt-dialog.service.ts new file mode 100644 index 0000000..7d446d4 --- /dev/null +++ b/src/app/core/_base/layout/services/kt-dialog.service.ts @@ -0,0 +1,29 @@ +// Angular +import { Injectable } from '@angular/core'; +// RxJS +import { BehaviorSubject } from 'rxjs'; + +@Injectable() +export class KtDialogService { + private ktDialog: any; + private currentState: BehaviorSubject = new BehaviorSubject(false); + + // Public properties + constructor() { + this.ktDialog = new KTDialog({type: 'loader', placement: 'top center', message: 'Loading ...'}); + } + + show() { + this.currentState.next(true); + this.ktDialog.show(); + } + + hide() { + this.currentState.next(false); + this.ktDialog.hide(); + } + + checkIsShown() { + return this.currentState.value; + } +} diff --git a/src/app/core/_base/layout/services/layout-config.service.ts b/src/app/core/_base/layout/services/layout-config.service.ts new file mode 100644 index 0000000..f8372cd --- /dev/null +++ b/src/app/core/_base/layout/services/layout-config.service.ts @@ -0,0 +1,144 @@ +// Angular +import { Injectable } from '@angular/core'; +// RxJS +import { Subject } from 'rxjs'; +// Object-Path +import * as objectPath from 'object-path'; +// Lodash +import { merge } from 'lodash'; +// Models +import { LayoutConfigModel } from '../models/layout-config.model'; + +@Injectable() +export class LayoutConfigService { + // Public properties + onConfigUpdated$: Subject; + layoutConfig: LayoutConfigModel; + + /** + * Servcie constructor + */ + constructor() { + // register on config changed event and set default config + this.onConfigUpdated$ = new Subject(); + } + + /** + * Save layout config to the local storage + * @param layoutConfig + */ + saveConfig(layoutConfig: LayoutConfigModel): void { + if (layoutConfig) { + localStorage.setItem('layoutConfigDrenax', JSON.stringify(layoutConfig)); + } + } + + /** + * Get layout config from local storage + */ + getSavedConfig(): LayoutConfigModel { + const config = localStorage.getItem('layoutConfigDrenax'); + try { + return JSON.parse(config); + } catch (e) { + } + } + + /** + * Remove saved layout config and revert back to default + */ + resetConfig(): void { + localStorage.removeItem('layoutConfigDrenax'); + } + + /** + * Get all config or by object path + * @param path | object path separated by dot + */ + getConfig(path?: string): LayoutConfigModel | any { + // merge default layout config with the saved config from layout storage + // @todo; known issue; viewing 2 or more demos at the time in different browser's tabs, can cause conflict to the layout config + this.layoutConfig = this.getSavedConfig(); + + if (path) { + // if path is specified, get the value within object + return objectPath.get(this.layoutConfig, path); + } + + return this.layoutConfig; + } + + /** + * Set existing config with a new value + * @param value + * @param save + */ + setConfig(value: any, save?: boolean): void { + this.layoutConfig = merge(this.layoutConfig, value); + + if (save) { + this.saveConfig(this.layoutConfig); + } + + // fire off an event that all subscribers will listen + this.onConfigUpdated$.next(this.layoutConfig); + } + + /** + * Get brand logo + */ + getLogo(): string { + const menuAsideLeftSkin = objectPath.get(this.layoutConfig, 'brand.self.skin'); + // set brand logo + const logoObject = objectPath.get(this.layoutConfig, 'self.logo'); + + let logo; + if (typeof logoObject === 'string') { + logo = logoObject; + } + if (typeof logoObject === 'object') { + logo = objectPath.get(logoObject, menuAsideLeftSkin + ''); + } + if (typeof logo === 'undefined') { + try { + const logos = objectPath.get(this.layoutConfig, 'self.logo'); + logo = logos[Object.keys(logos)[0]]; + } catch (e) { + } + } + return logo; + } + + /** + * Returns sticky logo + */ + getStickyLogo(): string { + let logo = objectPath.get(this.layoutConfig, 'self.logo.sticky'); + if (typeof logo === 'undefined') { + logo = this.getLogo(); + } + return logo + ''; + } + + /** + * Initialize layout config + * @param config + */ + loadConfigs(config: LayoutConfigModel) { + this.layoutConfig = this.getSavedConfig(); + // use saved config as priority, or load new config if demo does not matched + if (!this.layoutConfig || objectPath.get(this.layoutConfig, 'demo') !== config.demo) { + this.layoutConfig = config; + } + this.saveConfig(this.layoutConfig); + } + + /** + * Reload current layout config to the state of latest saved config + */ + reloadConfigs(): LayoutConfigModel { + this.layoutConfig = this.getSavedConfig(); + this.onConfigUpdated$.next(this.layoutConfig); + return this.layoutConfig; + } +} diff --git a/src/app/core/_base/layout/services/layout-ref.service.ts b/src/app/core/_base/layout/services/layout-ref.service.ts new file mode 100644 index 0000000..f75a121 --- /dev/null +++ b/src/app/core/_base/layout/services/layout-ref.service.ts @@ -0,0 +1,25 @@ +// Angular +import { Injectable } from '@angular/core'; +// RxJS +import { BehaviorSubject } from 'rxjs'; + +@Injectable() +export class LayoutRefService { + // Public properties + layoutRefs$: BehaviorSubject = new BehaviorSubject({}); + layoutRefs: any = {}; + + /** + * Add element to Ref + * + * @param name: any + * @param element: any + */ + addElement(name, element) { + const obj = {}; + obj[name] = element; + + this.layoutRefs = Object.assign({}, this.layoutRefs, obj); + this.layoutRefs$.next(this.layoutRefs); + } +} diff --git a/src/app/core/_base/layout/services/menu-aside.service.ts b/src/app/core/_base/layout/services/menu-aside.service.ts new file mode 100644 index 0000000..84c7680 --- /dev/null +++ b/src/app/core/_base/layout/services/menu-aside.service.ts @@ -0,0 +1,32 @@ +// Angular +import { Injectable } from '@angular/core'; +// RxJS +import { BehaviorSubject } from 'rxjs'; +// Object path +import * as objectPath from 'object-path'; +// Services +import { MenuConfigService } from './menu-config.service'; + +@Injectable() +export class MenuAsideService { + // Public properties + menuList$: BehaviorSubject = new BehaviorSubject([]); + + /** + * Service constructor + * + * @param menuConfigService: MenuConfigService + */ + constructor(private menuConfigService: MenuConfigService) { + this.loadMenu(); + } + + /** + * Load menu list + */ + loadMenu() { + // get menu list + const menuItems: any[] = objectPath.get(this.menuConfigService.getMenus(), 'aside.items'); + this.menuList$.next(menuItems); + } +} diff --git a/src/app/core/_base/layout/services/menu-config.service.ts b/src/app/core/_base/layout/services/menu-config.service.ts new file mode 100644 index 0000000..c6cfc65 --- /dev/null +++ b/src/app/core/_base/layout/services/menu-config.service.ts @@ -0,0 +1,37 @@ +// Angular +import { Injectable } from '@angular/core'; +// RxJS +import { Subject } from 'rxjs'; + +@Injectable() +export class MenuConfigService { + // Public properties + onConfigUpdated$: Subject; + // Private properties + private menuConfig: any; + + /** + * Service Constructor + */ + constructor() { + // register on config changed event and set default config + this.onConfigUpdated$ = new Subject(); + } + + /** + * Returns the menuConfig + */ + getMenus() { + return this.menuConfig; + } + + /** + * Load config + * + * @param config: any + */ + loadConfigs(config: any) { + this.menuConfig = config; + this.onConfigUpdated$.next(this.menuConfig); + } +} diff --git a/src/app/core/_base/layout/services/menu-horizontal.service.ts b/src/app/core/_base/layout/services/menu-horizontal.service.ts new file mode 100644 index 0000000..6444db1 --- /dev/null +++ b/src/app/core/_base/layout/services/menu-horizontal.service.ts @@ -0,0 +1,32 @@ +// Angular +import { Injectable } from '@angular/core'; +// RxJS +import { BehaviorSubject } from 'rxjs'; +// Object path +import * as objectPath from 'object-path'; +// Services +import { MenuConfigService } from './menu-config.service'; + +@Injectable() +export class MenuHorizontalService { + // Public properties + menuList$: BehaviorSubject = new BehaviorSubject([]); + + /** + * Service constructor + * + * @param menuConfigService: MenuConfigService + */ + constructor(private menuConfigService: MenuConfigService) { + this.loadMenu(); + } + + /** + * Load menu list + */ + loadMenu() { + // get menu list + const menuItems: any[] = objectPath.get(this.menuConfigService.getMenus(), 'header.items'); + this.menuList$.next(menuItems); + } +} diff --git a/src/app/core/_base/layout/services/page-config.service.ts b/src/app/core/_base/layout/services/page-config.service.ts new file mode 100644 index 0000000..3f099ce --- /dev/null +++ b/src/app/core/_base/layout/services/page-config.service.ts @@ -0,0 +1,92 @@ +// Angular +import { Injectable } from '@angular/core'; +import { Router } from '@angular/router'; +// RxJS +import { Subject } from 'rxjs'; +// Object-Path +import * as objectPath from 'object-path'; +// Lodash +import { merge } from 'lodash'; + +@Injectable() +export class PageConfigService { + // Public properties + onConfigUpdated$: Subject; + pageConfig: any; + + /** + * Service Constructor + * + * @param router: Router + */ + constructor(private router: Router) { + // register on config changed event and set default config + this.onConfigUpdated$ = new Subject(); + } + + /** + * Get current page config based on route + */ + getCurrentPageConfig(path?: string): any { + let configPath = this.cleanUrl(this.router.url); + + if (path) { + configPath += '.' + path; + } + + // get page config by path + return objectPath.get(this.pageConfig, configPath); + } + + /** + * Set existing config with a new value + * @param value: any + * @param sav: boolean? + */ + setConfig(value: any, save?: boolean): void { + this.pageConfig = merge(this.pageConfig, value); + + if (save) { + // not implemented + } + + // fire off an event that all subscribers will listen + this.onConfigUpdated$.next(this.pageConfig); + } + + /** + * Load confgis + * + * @param config: any + */ + loadConfigs(config: any) { + this.pageConfig = config; + this.onConfigUpdated$.next(this.pageConfig); + } + + /** + * Remove unnecessary params from URL + * @param url + */ + cleanUrl(url: string): string { + // remove first route (demo name) from url router + if (new RegExp(/^\/demo/).test(url)) { + const urls = url.split('/'); + urls.splice(0, 2); + url = urls.join('/'); + } + + if (url.charAt(0) == '/') { + url = url.substr(1); + } + + // we get the page title from config, using url path. + // we need to remove query from url ?id=1 before we use the path to search in array config. + let finalUrl = url.replace(/\//g, '.'); + if (finalUrl.indexOf('?') !== -1) { + finalUrl = finalUrl.substring(0, finalUrl.indexOf('?')); + } + + return finalUrl; + } +} diff --git a/src/app/core/_base/layout/services/splash-screen.service.ts b/src/app/core/_base/layout/services/splash-screen.service.ts new file mode 100644 index 0000000..57724c8 --- /dev/null +++ b/src/app/core/_base/layout/services/splash-screen.service.ts @@ -0,0 +1,52 @@ +// Angular +import { ElementRef, Injectable } from '@angular/core'; +import { animate, AnimationBuilder, style } from '@angular/animations'; + +@Injectable() +export class SplashScreenService { + // Private properties + private el: ElementRef; + private stopped: boolean; + + /** + * Service constctuctor + * + * @param animationBuilder: AnimationBuilder + */ + constructor(private animationBuilder: AnimationBuilder) { + } + + /** + * Init + * + * @param element: ElementRef + */ + init(element: ElementRef) { + this.el = element; + } + + /** + * Hide + */ + hide() { + if (this.stopped) { + return; + } + + const player = this.animationBuilder.build([ + style({opacity: '1'}), + animate(800, style({opacity: '0'})) + ]).create(this.el.nativeElement); + + player.onDone(() => { + if (typeof this.el.nativeElement.remove === 'function') { + this.el.nativeElement.remove(); + } else { + this.el.nativeElement.style.display = 'none'; + } + this.stopped = true; + }); + + setTimeout(() => player.play(), 300); + } +} diff --git a/src/app/core/_base/layout/services/subheader.service.ts b/src/app/core/_base/layout/services/subheader.service.ts new file mode 100644 index 0000000..9c454ba --- /dev/null +++ b/src/app/core/_base/layout/services/subheader.service.ts @@ -0,0 +1,197 @@ +// Angular +import { Injectable } from '@angular/core'; +import { NavigationEnd, Router } from '@angular/router'; +// RxJS +import { BehaviorSubject, Subject } from 'rxjs'; +import { filter } from 'rxjs/operators'; +// Object-Path +import * as objectPath from 'object-path'; +// Services +import { PageConfigService } from './page-config.service'; +import { MenuConfigService } from './menu-config.service'; + +export interface Breadcrumb { + title: string; + page: string | any; +} + +export interface BreadcrumbTitle { + title: string; + desc?: string; +} + +@Injectable() +export class SubheaderService { + // Public properties + title$: BehaviorSubject = new BehaviorSubject({title: '', desc: ''}); + breadcrumbs$: BehaviorSubject = new BehaviorSubject([]); + disabled$: Subject = new Subject(); + + // Private properties + private manualBreadcrumbs: any = {}; + private appendingBreadcrumbs: any = {}; + private manualTitle: any = {}; + + private asideMenus: any; + private headerMenus: any; + private pageConfig: any; + + /** + * Service Constructor + * + * @param router: Router + * @param pageConfigService: PageConfigServie + * @param menuConfigService: MenuConfigService + */ + constructor( + private router: Router, + private pageConfigService: PageConfigService, + private menuConfigService: MenuConfigService) { + const initBreadcrumb = () => { + // get updated title current page config + this.pageConfig = this.pageConfigService.getCurrentPageConfig(); + + this.headerMenus = objectPath.get(this.menuConfigService.getMenus(), 'header'); + this.asideMenus = objectPath.get(this.menuConfigService.getMenus(), 'aside'); + + // update breadcrumb on initial page load + this.updateBreadcrumbs(); + + if (objectPath.get(this.manualTitle, this.router.url)) { + this.setTitle(this.manualTitle[this.router.url]); + } else { + // get updated page title on every route changed + this.title$.next(objectPath.get(this.pageConfig, 'page')); + + // subheader enable/disable + const hideSubheader = objectPath.get(this.pageConfig, 'page.subheader'); + this.disabled$.next(typeof hideSubheader !== 'undefined' && !hideSubheader); + + if (objectPath.get(this.manualBreadcrumbs, this.router.url)) { + // breadcrumbs was set manually + this.setBreadcrumbs(this.manualBreadcrumbs[this.router.url]); + } else { + // get updated breadcrumbs on every route changed + this.updateBreadcrumbs(); + // breadcrumbs was appended before, reuse it for this page + if (objectPath.get(this.appendingBreadcrumbs, this.router.url)) { + this.appendBreadcrumbs(this.appendingBreadcrumbs[this.router.url]); + } + } + } + }; + + initBreadcrumb(); + + // subscribe to router events + this.router.events + .pipe(filter(event => event instanceof NavigationEnd)) + .subscribe(initBreadcrumb); + } + + /** + * Update breadCrumbs + */ + updateBreadcrumbs() { + // get breadcrumbs from header menu + let breadcrumbs = this.getBreadcrumbs(this.headerMenus); + // if breadcrumbs empty from header menu + if (breadcrumbs.length === 0) { + // get breadcrumbs from aside menu + breadcrumbs = this.getBreadcrumbs(this.asideMenus); + } + + if ( + // if breadcrumb has only 1 item + breadcrumbs.length === 1 && + // and breadcrumb title is same as current page title + breadcrumbs[0].title.indexOf(objectPath.get(this.pageConfig, 'page.title')) !== -1) { + // no need to display on frontend + breadcrumbs = []; + } + + this.breadcrumbs$.next(breadcrumbs); + } + + /** + * Manually set full breadcrumb paths + */ + setBreadcrumbs(breadcrumbs: Breadcrumb[] | any[]) { + this.manualBreadcrumbs[this.router.url] = breadcrumbs; + this.breadcrumbs$.next(breadcrumbs); + } + + /** + * Append breadcrumb to the last existing breadcrumbs + * @param breadcrumbs + */ + appendBreadcrumbs(breadcrumbs: Breadcrumb[] | any[]) { + this.appendingBreadcrumbs[this.router.url] = breadcrumbs; + const prev = this.breadcrumbs$.getValue(); + this.breadcrumbs$.next(prev.concat(breadcrumbs)); + } + + /** + * Get breadcrumbs from menu items + * @param menus + */ + getBreadcrumbs(menus: any) { + let url = this.pageConfigService.cleanUrl(this.router.url); + url = url.replace(new RegExp(/\./, 'g'), '/'); + + const breadcrumbs = []; + const menuPath = this.getPath(menus, url) || []; + menuPath.forEach(key => { + menus = menus[key]; + if (typeof menus !== 'undefined' && menus.title) { + breadcrumbs.push(menus); + } + }); + + return breadcrumbs; + } + + /** + * Set title + * + * @param title: string + */ + setTitle(title: string) { + this.manualTitle[this.router.url] = title; + this.title$.next({title}); + } + + /** + * Get object path by value + * @param obj + * @param value + */ + getPath(obj, value) { + if (typeof obj !== 'object') { + return; + } + const path = []; + let found = false; + + const search = (haystack) => { + // tslint:disable-next-line:forin + for (const key in haystack) { + path.push(key); + if (haystack[key] === value) { + found = true; + break; + } + if (typeof haystack[key] === 'object') { + search(haystack[key]); + if (found) { + break; + } + } + path.pop(); + } + }; + + search(obj); + return path; + } +} diff --git a/src/app/core/_base/layout/services/translation.service.ts b/src/app/core/_base/layout/services/translation.service.ts new file mode 100644 index 0000000..8c7a8fb --- /dev/null +++ b/src/app/core/_base/layout/services/translation.service.ts @@ -0,0 +1,71 @@ +// Angular +import { Injectable } from '@angular/core'; +// Tranlsation +import { TranslateService } from '@ngx-translate/core'; + +export interface Locale { + lang: string; + // tslint:disable-next-line:ban-types + data: Object; +} + +@Injectable({ + providedIn: 'root' +}) +export class TranslationService { + // Private properties + private langIds: any = []; + + /** + * Service Constructor + * + * @param translate: TranslateService + */ + constructor(private translate: TranslateService) { + // add new langIds to the list + this.translate.addLangs(['en']); + + // this language will be used as a fallback when a translation isn't found in the current language + this.translate.setDefaultLang('en'); + } + + /** + * Load Translation + * + * @param args: Locale[] + */ + loadTranslations(...args: Locale[]): void { + const locales = [...args]; + + locales.forEach(locale => { + // use setTranslation() with the third argument set to true + // to append translations instead of replacing them + this.translate.setTranslation(locale.lang, locale.data, true); + + this.langIds.push(locale.lang); + }); + + // add new languages to the list + this.translate.addLangs(this.langIds); + } + + /** + * Setup language + * + * @param lang: any + */ + setLanguage(lang) { + if (lang) { + this.translate.use(this.translate.getDefaultLang()); + this.translate.use(lang); + localStorage.setItem('languageDrenax', lang); + } + } + + /** + * Returns selected language + */ + getSelectedLanguage(): any { + return localStorage.getItem('languageDrenax') || this.translate.getDefaultLang(); + } +} diff --git a/src/app/core/_config/i18n/ch.ts b/src/app/core/_config/i18n/ch.ts new file mode 100644 index 0000000..ede127c --- /dev/null +++ b/src/app/core/_config/i18n/ch.ts @@ -0,0 +1,105 @@ +// China +export const locale = { + lang: 'ch', + data: { + TRANSLATOR: { + SELECT: '选择你的语言', + }, + MENU: { + NEW: '新', + ACTIONS: '行动', + CREATE_POST: '创建新帖子', + PAGES: 'Pages', + FEATURES: '特征', + APPS: '应用', + DASHBOARD: '仪表板', + }, + AUTH: { + GENERAL: { + OR: '要么', + SUBMIT_BUTTON: '提交', + NO_ACCOUNT: '没有账号?', + SIGNUP_BUTTON: '注册', + FORGOT_BUTTON: '忘记密码', + BACK_BUTTON: '背部', + PRIVACY: '隐私', + LEGAL: '法律', + CONTACT: '联系', + }, + LOGIN: { + TITLE: '创建帐号', + BUTTON: '签到', + }, + FORGOT: { + TITLE: 'Forgotten Password?', + DESC: 'Enter your email to reset your password', + SUCCESS: 'Your account has been successfully reset.' + }, + REGISTER: { + TITLE: 'Sign Up', + DESC: 'Enter your details to create your account', + SUCCESS: 'Your account has been successfuly registered.' + }, + INPUT: { + EMAIL: 'Email', + FULLNAME: 'Fullname', + PASSWORD: 'Password', + CONFIRM_PASSWORD: 'Confirm Password', + USERNAME: '用戶名' + }, + VALIDATION: { + INVALID: '{{name}} is not valid', + REQUIRED: '{{name}} is required', + MIN_LENGTH: '{{name}} minimum length is {{min}}', + AGREEMENT_REQUIRED: 'Accepting terms & conditions are required', + NOT_FOUND: 'The requested {{name}} is not found', + INVALID_LOGIN: 'The login detail is incorrect', + REQUIRED_FIELD: 'Required field', + MIN_LENGTH_FIELD: 'Minimum field length:', + MAX_LENGTH_FIELD: 'Maximum field length:', + INVALID_FIELD: 'Field is not valid', + } + }, + ECOMMERCE: { + COMMON: { + SELECTED_RECORDS_COUNT: 'Selected records count: ', + ALL: 'All', + SUSPENDED: 'Suspended', + ACTIVE: 'Active', + FILTER: 'Filter', + BY_STATUS: 'by Status', + BY_TYPE: 'by Type', + BUSINESS: 'Business', + INDIVIDUAL: 'Individual', + SEARCH: 'Search', + IN_ALL_FIELDS: 'in all fields' + }, + ECOMMERCE: 'eCommerce', + CUSTOMERS: { + CUSTOMERS: '顾客', + CUSTOMERS_LIST: '客户名单', + NEW_CUSTOMER: 'New Customer', + DELETE_CUSTOMER_SIMPLE: { + TITLE: 'Customer Delete', + DESCRIPTION: 'Are you sure to permanently delete this customer?', + WAIT_DESCRIPTION: 'Customer is deleting...', + MESSAGE: 'Customer has been deleted' + }, + DELETE_CUSTOMER_MULTY: { + TITLE: 'Customers Delete', + DESCRIPTION: 'Are you sure to permanently delete selected customers?', + WAIT_DESCRIPTION: 'Customers are deleting...', + MESSAGE: 'Selected customers have been deleted' + }, + UPDATE_STATUS: { + TITLE: 'Status has been updated for selected customers', + MESSAGE: 'Selected customers status have successfully been updated' + }, + EDIT: { + UPDATE_MESSAGE: 'Customer has been updated', + ADD_MESSAGE: 'Customer has been created' + } + } + } + } +}; diff --git a/src/app/core/_config/i18n/de.ts b/src/app/core/_config/i18n/de.ts new file mode 100644 index 0000000..339f3b7 --- /dev/null +++ b/src/app/core/_config/i18n/de.ts @@ -0,0 +1,105 @@ +// Germany +export const locale = { + lang: 'de', + data: { + TRANSLATOR: { + SELECT: 'Wähle deine Sprache', + }, + MENU: { + NEW: 'Neu', + ACTIONS: 'Aktionen', + CREATE_POST: 'Erstellen Sie einen neuen Beitrag', + PAGES: 'Pages', + FEATURES: 'Eigenschaften', + APPS: 'Apps', + DASHBOARD: 'Instrumententafel' + }, + AUTH: { + GENERAL: { + OR: 'Oder', + SUBMIT_BUTTON: 'einreichen', + NO_ACCOUNT: 'Hast du kein Konto?', + SIGNUP_BUTTON: 'Anmelden', + FORGOT_BUTTON: 'Passwort vergessen', + BACK_BUTTON: 'Zurück', + PRIVACY: 'Privatsphäre', + LEGAL: 'Legal', + CONTACT: 'Kontakt', + }, + LOGIN: { + TITLE: 'Create Account', + BUTTON: 'Sign In', + }, + FORGOT: { + TITLE: 'Forgotten Password?', + DESC: 'Enter your email to reset your password', + SUCCESS: 'Your account has been successfully reset.' + }, + REGISTER: { + TITLE: 'Sign Up', + DESC: 'Enter your details to create your account', + SUCCESS: 'Your account has been successfuly registered.' + }, + INPUT: { + EMAIL: 'Email', + FULLNAME: 'Fullname', + PASSWORD: 'Password', + CONFIRM_PASSWORD: 'Confirm Password', + USERNAME: 'Nutzername' + }, + VALIDATION: { + INVALID: '{{name}} is not valid', + REQUIRED: '{{name}} is required', + MIN_LENGTH: '{{name}} minimum length is {{min}}', + AGREEMENT_REQUIRED: 'Accepting terms & conditions are required', + NOT_FOUND: 'The requested {{name}} is not found', + INVALID_LOGIN: 'The login detail is incorrect', + REQUIRED_FIELD: 'Required field', + MIN_LENGTH_FIELD: 'Minimum field length:', + MAX_LENGTH_FIELD: 'Maximum field length:', + INVALID_FIELD: 'Field is not valid', + } + }, + ECOMMERCE: { + COMMON: { + SELECTED_RECORDS_COUNT: 'Selected records count: ', + ALL: 'All', + SUSPENDED: 'Suspended', + ACTIVE: 'Active', + FILTER: 'Filter', + BY_STATUS: 'by Status', + BY_TYPE: 'by Type', + BUSINESS: 'Business', + INDIVIDUAL: 'Individual', + SEARCH: 'Search', + IN_ALL_FIELDS: 'in all fields' + }, + ECOMMERCE: 'eCommerce', + CUSTOMERS: { + CUSTOMERS: 'Customers', + CUSTOMERS_LIST: 'Customers list', + NEW_CUSTOMER: 'New Customer', + DELETE_CUSTOMER_SIMPLE: { + TITLE: 'Customer Delete', + DESCRIPTION: 'Are you sure to permanently delete this customer?', + WAIT_DESCRIPTION: 'Customer is deleting...', + MESSAGE: 'Customer has been deleted' + }, + DELETE_CUSTOMER_MULTY: { + TITLE: 'Customers Delete', + DESCRIPTION: 'Are you sure to permanently delete selected customers?', + WAIT_DESCRIPTION: 'Customers are deleting...', + MESSAGE: 'Selected customers have been deleted' + }, + UPDATE_STATUS: { + TITLE: 'Status has been updated for selected customers', + MESSAGE: 'Selected customers status have successfully been updated' + }, + EDIT: { + UPDATE_MESSAGE: 'Customer has been updated', + ADD_MESSAGE: 'Customer has been created' + } + } + } + } +}; diff --git a/src/app/core/_config/i18n/en.ts b/src/app/core/_config/i18n/en.ts new file mode 100644 index 0000000..d52804e --- /dev/null +++ b/src/app/core/_config/i18n/en.ts @@ -0,0 +1,105 @@ +// USA +export const locale = { + lang: 'en', + data: { + TRANSLATOR: { + SELECT: 'Select your language', + }, + MENU: { + NEW: 'new', + ACTIONS: 'Actions', + CREATE_POST: 'Create New Post', + PAGES: 'Pages', + FEATURES: 'Features', + APPS: 'Apps', + DASHBOARD: 'Dashboard', + }, + AUTH: { + GENERAL: { + OR: 'Or', + SUBMIT_BUTTON: 'Submit', + NO_ACCOUNT: 'Don\'t have an account?', + SIGNUP_BUTTON: 'Sign Up', + FORGOT_BUTTON: 'Forgot Password', + BACK_BUTTON: 'Back', + PRIVACY: 'Privacy', + LEGAL: 'Legal', + CONTACT: 'Contact', + }, + LOGIN: { + TITLE: 'Login Account', + BUTTON: 'Sign In', + }, + FORGOT: { + TITLE: 'Forgotten Password?', + DESC: 'Enter your email to reset your password', + SUCCESS: 'Your account has been successfully reset.' + }, + REGISTER: { + TITLE: 'Sign Up', + DESC: 'Enter your details to create your account', + SUCCESS: 'Your account has been successfuly registered.' + }, + INPUT: { + EMAIL: 'Email', + FULLNAME: 'Fullname', + PASSWORD: 'Password', + CONFIRM_PASSWORD: 'Confirm Password', + USERNAME: 'Username' + }, + VALIDATION: { + INVALID: '{{name}} is not valid', + REQUIRED: '{{name}} is required', + MIN_LENGTH: '{{name}} minimum length is {{min}}', + AGREEMENT_REQUIRED: 'Accepting terms & conditions are required', + NOT_FOUND: 'The requested {{name}} is not found', + INVALID_LOGIN: 'The login detail is incorrect', + REQUIRED_FIELD: 'Required field', + MIN_LENGTH_FIELD: 'Minimum field length:', + MAX_LENGTH_FIELD: 'Maximum field length:', + INVALID_FIELD: 'Field is not valid', + } + }, + ECOMMERCE: { + COMMON: { + SELECTED_RECORDS_COUNT: 'Selected records count: ', + ALL: 'All', + SUSPENDED: 'Suspended', + ACTIVE: 'Active', + FILTER: 'Filter', + BY_STATUS: 'by Status', + BY_TYPE: 'by Type', + BUSINESS: 'Business', + INDIVIDUAL: 'Individual', + SEARCH: 'Search', + IN_ALL_FIELDS: 'in all fields' + }, + ECOMMERCE: 'eCommerce', + CUSTOMERS: { + CUSTOMERS: 'Customers', + CUSTOMERS_LIST: 'Customers list', + NEW_CUSTOMER: 'New Customer', + DELETE_CUSTOMER_SIMPLE: { + TITLE: 'Customer Delete', + DESCRIPTION: 'Are you sure to permanently delete this customer?', + WAIT_DESCRIPTION: 'Customer is deleting...', + MESSAGE: 'Customer has been deleted' + }, + DELETE_CUSTOMER_MULTY: { + TITLE: 'Customers Delete', + DESCRIPTION: 'Are you sure to permanently delete selected customers?', + WAIT_DESCRIPTION: 'Customers are deleting...', + MESSAGE: 'Selected customers have been deleted' + }, + UPDATE_STATUS: { + TITLE: 'Status has been updated for selected customers', + MESSAGE: 'Selected customers status have successfully been updated' + }, + EDIT: { + UPDATE_MESSAGE: 'Customer has been updated', + ADD_MESSAGE: 'Customer has been created' + } + } + } + } +}; diff --git a/src/app/core/_config/i18n/es.ts b/src/app/core/_config/i18n/es.ts new file mode 100644 index 0000000..dd77743 --- /dev/null +++ b/src/app/core/_config/i18n/es.ts @@ -0,0 +1,105 @@ +// Spain +export const locale = { + lang: 'es', + data: { + TRANSLATOR: { + SELECT: 'Elige tu idioma', + }, + MENU: { + NEW: 'nuevo', + ACTIONS: 'Comportamiento', + CREATE_POST: 'Crear nueva publicación', + PAGES: 'Pages', + FEATURES: 'Caracteristicas', + APPS: 'Aplicaciones', + DASHBOARD: 'Tablero' + }, + AUTH: { + GENERAL: { + OR: 'O', + SUBMIT_BUTTON: 'Enviar', + NO_ACCOUNT: 'No tienes una cuenta?', + SIGNUP_BUTTON: 'Regístrate', + FORGOT_BUTTON: 'Se te olvidó tu contraseña', + BACK_BUTTON: 'Espalda', + PRIVACY: 'Intimidad', + LEGAL: 'Legal', + CONTACT: 'Contacto', + }, + LOGIN: { + TITLE: 'Crear una cuenta', + BUTTON: 'Registrarse', + }, + FORGOT: { + TITLE: 'Contraseña olvidada?', + DESC: 'Ingrese su correo electrónico para restablecer su contraseña', + SUCCESS: 'Your account has been successfully reset.' + }, + REGISTER: { + TITLE: 'Sign Up', + DESC: 'Enter your details to create your account', + SUCCESS: 'Your account has been successfuly registered.' + }, + INPUT: { + EMAIL: 'Email', + FULLNAME: 'Fullname', + PASSWORD: 'Password', + CONFIRM_PASSWORD: 'Confirm Password', + USERNAME: 'Usuario' + }, + VALIDATION: { + INVALID: '{{name}} is not valid', + REQUIRED: '{{name}} is required', + MIN_LENGTH: '{{name}} minimum length is {{min}}', + AGREEMENT_REQUIRED: 'Accepting terms & conditions are required', + NOT_FOUND: 'The requested {{name}} is not found', + INVALID_LOGIN: 'The login detail is incorrect', + REQUIRED_FIELD: 'Required field', + MIN_LENGTH_FIELD: 'Minimum field length:', + MAX_LENGTH_FIELD: 'Maximum field length:', + INVALID_FIELD: 'Field is not valid', + } + }, + ECOMMERCE: { + COMMON: { + SELECTED_RECORDS_COUNT: 'Selected records count: ', + ALL: 'All', + SUSPENDED: 'Suspended', + ACTIVE: 'Active', + FILTER: 'Filter', + BY_STATUS: 'by Status', + BY_TYPE: 'by Type', + BUSINESS: 'Business', + INDIVIDUAL: 'Individual', + SEARCH: 'Search', + IN_ALL_FIELDS: 'in all fields' + }, + ECOMMERCE: 'eCommerce', + CUSTOMERS: { + CUSTOMERS: 'Customers', + CUSTOMERS_LIST: 'Customers list', + NEW_CUSTOMER: 'New Customer', + DELETE_CUSTOMER_SIMPLE: { + TITLE: 'Customer Delete', + DESCRIPTION: 'Are you sure to permanently delete this customer?', + WAIT_DESCRIPTION: 'Customer is deleting...', + MESSAGE: 'Customer has been deleted' + }, + DELETE_CUSTOMER_MULTY: { + TITLE: 'Customers Delete', + DESCRIPTION: 'Are you sure to permanently delete selected customers?', + WAIT_DESCRIPTION: 'Customers are deleting...', + MESSAGE: 'Selected customers have been deleted' + }, + UPDATE_STATUS: { + TITLE: 'Status has been updated for selected customers', + MESSAGE: 'Selected customers status have successfully been updated' + }, + EDIT: { + UPDATE_MESSAGE: 'Customer has been updated', + ADD_MESSAGE: 'Customer has been created' + } + } + } + } +}; diff --git a/src/app/core/_config/i18n/fr.ts b/src/app/core/_config/i18n/fr.ts new file mode 100644 index 0000000..fbb47cd --- /dev/null +++ b/src/app/core/_config/i18n/fr.ts @@ -0,0 +1,105 @@ +// France +export const locale = { + lang: 'fr', + data: { + TRANSLATOR: { + SELECT: 'choisissez votre langue', + }, + MENU: { + NEW: 'Nouveau', + ACTIONS: 'Actes', + CREATE_POST: 'Créer un nouveau Post', + PAGES: 'Pages', + FEATURES: 'Fonctionnalités', + APPS: 'Applications', + DASHBOARD: 'Tableau de Bord', + }, + AUTH: { + GENERAL: { + OR: 'Ou', + SUBMIT_BUTTON: 'Soumettre', + NO_ACCOUNT: 'Ne pas avoir de compte?', + SIGNUP_BUTTON: 'Registre', + FORGOT_BUTTON: 'Mot de passe oublié', + BACK_BUTTON: 'Back', + PRIVACY: 'Privacy', + LEGAL: 'Legal', + CONTACT: 'Contact', + }, + LOGIN: { + TITLE: 'Créer un compte', + BUTTON: 'Sign In', + }, + FORGOT: { + TITLE: 'Forgotten Password?', + DESC: 'Enter your email to reset your password', + SUCCESS: 'Your account has been successfully reset.' + }, + REGISTER: { + TITLE: 'Sign Up', + DESC: 'Enter your details to create your account', + SUCCESS: 'Your account has been successfuly registered.' + }, + INPUT: { + EMAIL: 'Email', + FULLNAME: 'Fullname', + PASSWORD: 'Mot de passe', + CONFIRM_PASSWORD: 'Confirm Password', + USERNAME: 'Nom d\'utilisateur' + }, + VALIDATION: { + INVALID: '{{name}} n\'est pas valide', + REQUIRED: '{{name}} est requis', + MIN_LENGTH: '{{name}} minimum length is {{min}}', + AGREEMENT_REQUIRED: 'Accepting terms & conditions are required', + NOT_FOUND: 'The requested {{name}} is not found', + INVALID_LOGIN: 'The login detail is incorrect', + REQUIRED_FIELD: 'Required field', + MIN_LENGTH_FIELD: 'Minimum field length:', + MAX_LENGTH_FIELD: 'Maximum field length:', + INVALID_FIELD: 'Field is not valid', + } + }, + ECOMMERCE: { + COMMON: { + SELECTED_RECORDS_COUNT: 'Nombre d\'enregistrements sélectionnés: ', + ALL: 'All', + SUSPENDED: 'Suspended', + ACTIVE: 'Active', + FILTER: 'Filter', + BY_STATUS: 'by Status', + BY_TYPE: 'by Type', + BUSINESS: 'Business', + INDIVIDUAL: 'Individual', + SEARCH: 'Search', + IN_ALL_FIELDS: 'in all fields' + }, + ECOMMERCE: 'éCommerce', + CUSTOMERS: { + CUSTOMERS: 'Les clients', + CUSTOMERS_LIST: 'Liste des clients', + NEW_CUSTOMER: 'Nouveau client', + DELETE_CUSTOMER_SIMPLE: { + TITLE: 'Suppression du client', + DESCRIPTION: 'Êtes-vous sûr de supprimer définitivement ce client?', + WAIT_DESCRIPTION: 'Le client est en train de supprimer ...', + MESSAGE: 'Le client a été supprimé' + }, + DELETE_CUSTOMER_MULTY: { + TITLE: 'Supprimer les clients', + DESCRIPTION: 'Êtes-vous sûr de supprimer définitivement les clients sélectionnés?', + WAIT_DESCRIPTION: 'Les clients suppriment ...', + MESSAGE: 'Les clients sélectionnés ont été supprimés' + }, + UPDATE_STATUS: { + TITLE: 'Le statut a été mis à jour pour les clients sélectionnés', + MESSAGE: 'Le statut des clients sélectionnés a été mis à jour avec succès' + }, + EDIT: { + UPDATE_MESSAGE: 'Le client a été mis à jour', + ADD_MESSAGE: 'Le client a été créé' + } + } + } + } +}; diff --git a/src/app/core/_config/i18n/jp.ts b/src/app/core/_config/i18n/jp.ts new file mode 100644 index 0000000..a73339a --- /dev/null +++ b/src/app/core/_config/i18n/jp.ts @@ -0,0 +1,105 @@ +// Japan +export const locale = { + lang: 'jp', + data: { + TRANSLATOR: { + SELECT: 'あなたが使う言語を選んでください', + }, + MENU: { + NEW: '新しい', + ACTIONS: '行動', + CREATE_POST: '新しい投稿を作成', + PAGES: 'Pages', + FEATURES: '特徴', + APPS: 'アプリ', + DASHBOARD: 'ダッシュボード', + }, + AUTH: { + GENERAL: { + OR: 'または', + SUBMIT_BUTTON: '提出する', + NO_ACCOUNT: 'アカウントを持っていない?', + SIGNUP_BUTTON: 'サインアップ', + FORGOT_BUTTON: 'パスワードをお忘れですか', + BACK_BUTTON: 'バック', + PRIVACY: 'プライバシー', + LEGAL: '法的', + CONTACT: '接触', + }, + LOGIN: { + TITLE: 'Create Account', + BUTTON: 'Sign In', + }, + FORGOT: { + TITLE: 'Forgotten Password?', + DESC: 'Enter your email to reset your password', + SUCCESS: 'Your account has been successfully reset.' + }, + REGISTER: { + TITLE: 'Sign Up', + DESC: 'Enter your details to create your account', + SUCCESS: 'Your account has been successfuly registered.' + }, + INPUT: { + EMAIL: 'Email', + FULLNAME: 'Fullname', + PASSWORD: 'Password', + CONFIRM_PASSWORD: 'Confirm Password', + USERNAME: 'ユーザー名' + }, + VALIDATION: { + INVALID: '{{name}} is not valid', + REQUIRED: '{{name}} is required', + MIN_LENGTH: '{{name}} minimum length is {{min}}', + AGREEMENT_REQUIRED: 'Accepting terms & conditions are required', + NOT_FOUND: 'The requested {{name}} is not found', + INVALID_LOGIN: 'The login detail is incorrect', + REQUIRED_FIELD: 'Required field', + MIN_LENGTH_FIELD: 'Minimum field length:', + MAX_LENGTH_FIELD: 'Maximum field length:', + INVALID_FIELD: 'Field is not valid', + } + }, + ECOMMERCE: { + COMMON: { + SELECTED_RECORDS_COUNT: 'Selected records count: ', + ALL: 'All', + SUSPENDED: 'Suspended', + ACTIVE: 'Active', + FILTER: 'Filter', + BY_STATUS: 'by Status', + BY_TYPE: 'by Type', + BUSINESS: 'Business', + INDIVIDUAL: 'Individual', + SEARCH: 'Search', + IN_ALL_FIELDS: 'in all fields' + }, + ECOMMERCE: 'eCommerce', + CUSTOMERS: { + CUSTOMERS: 'Customers', + CUSTOMERS_LIST: 'Customers list', + NEW_CUSTOMER: 'New Customer', + DELETE_CUSTOMER_SIMPLE: { + TITLE: 'Customer Delete', + DESCRIPTION: 'Are you sure to permanently delete this customer?', + WAIT_DESCRIPTION: 'Customer is deleting...', + MESSAGE: 'Customer has been deleted' + }, + DELETE_CUSTOMER_MULTY: { + TITLE: 'Customers Delete', + DESCRIPTION: 'Are you sure to permanently delete selected customers?', + WAIT_DESCRIPTION: 'Customers are deleting...', + MESSAGE: 'Selected customers have been deleted' + }, + UPDATE_STATUS: { + TITLE: 'Status has been updated for selected customers', + MESSAGE: 'Selected customers status have successfully been updated' + }, + EDIT: { + UPDATE_MESSAGE: 'Customer has been updated', + ADD_MESSAGE: 'Customer has been created' + } + } + } + } +}; diff --git a/src/app/core/_config/layout.config.ts b/src/app/core/_config/layout.config.ts new file mode 100644 index 0000000..d632a73 --- /dev/null +++ b/src/app/core/_config/layout.config.ts @@ -0,0 +1,133 @@ +import {LayoutConfigModel} from '../_base/layout'; + +export class LayoutConfig { + public defaults: LayoutConfigModel = { + demo: 'demo6', + // == Base Layout + self: { + layout: 'fluid', // fluid|boxed + body: { + 'background-image': './assets/media/misc/bg-1.jpg', + }, + logo: './assets/media/logos/logo-6.png', + }, + // == Page Splash Screen loading + loader: { + enabled: true, + type: 'spinner-logo', + logo: './assets/media/logos/logo-mini-md.png', + message: 'Please wait...', + }, + // == Colors for javascript + colors: { + state: { + brand: '#22b9ff', + light: '#19385E', + dark: '#282a3c', + primary: '#5867dd', + success: '#34bfa3', + info: '#36a3f7', + warning: '#ffb822', + danger: '#fd3995', + }, + base: { + label: [ + '#c5cbe3', + '#a1a8c3', + '#3d4465', + '#3e4466', + ], + shape: [ + '#f0f3ff', + '#d9dffa', + '#afb4d4', + '#646c9a', + ], + }, + }, + header: { + self: { + skin: 'light', + fixed: { + desktop: true, + mobile: true, + }, + }, + menu: { + self: { + display: true, + layout: 'default', + 'root-arrow': true, + }, + desktop: { + arrow: true, + toggle: 'click', + submenu: { + skin: 'light', + arrow: true, + }, + }, + mobile: { + submenu: { + skin: 'dark', + accordion: true, + }, + }, + }, + }, + subheader: { + display: true, + layout: 'subheader-v1', + fixed: true, + width: 'fluid', + style: 'solid', + }, + content: { + width: 'fluid', + }, + brand: { + self: { + skin: 'narvy', + }, + }, + aside: { + self: { + display: true, + fixed: true, + minimize: { + toggle: false, + default: true, + }, + }, + footer: { + self: { + display: true, + }, + }, + menu: { + dropdown: false, + scroll: false, + submenu: { + accordion: false, + dropdown: { + arrow: true, + 'hover-timeout': 500, + }, + }, + }, + }, + footer: { + self: { + width: 'fluid', + fixed: false, + }, + }, + }; + + /** + * Good place for getting the remote config + */ + public get configs(): LayoutConfigModel { + return this.defaults; + } +} diff --git a/src/app/core/_config/menu.config.ts b/src/app/core/_config/menu.config.ts new file mode 100644 index 0000000..82a2454 --- /dev/null +++ b/src/app/core/_config/menu.config.ts @@ -0,0 +1,197 @@ +export class MenuConfig { + public defaults: any = { + aside: { + self: {}, + items: [ + { + title: 'Inicio', + root: true, + icon: 'flaticon2-architecture-and-city', + page: '/inicio', + bullet: 'dot', + }, + {section: 'Catálogos'}, + { + title: 'Catálogos', + root: true, + icon: 'fa fa-book', + permissions: [ + 'administrador.usuarios.index', + 'administrador.roles.index', + 'administrador.clientes.index', + 'administrador.estatus_servicios.index', + 'administrador.formas_pagos.index', + 'administrador.tipos_servicios.index', + 'administrador.servicios.index', + 'administrador.tipos_vehiculos.index', + 'administrador.vehiculos.index', + 'administrador.sucursales.index' + ], + submenu: [ + { + title: 'Usuarios', + icon: 'fa fa-user', + page: '/catalogos/usuarios', + permissions: ['administrador.usuarios.index'], + }, + { + title: 'Roles', + icon: 'fa fa-users', + page: '/catalogos/roles', + permissions: ['administrador.roles.index'], + }, + { + title: 'Clientes', + icon: 'fa fa-handshake-o', + page: '/catalogos/clientes', + permissions: ['administrador.clientes.index'], + }, + { + title: 'Estados de servicio', + icon: 'fa fa-signal', + page: '/catalogos/estados-servicio', + permissions: ['administrador.estatus_servicios.index'], + }, + { + title: 'Formas de pago', + icon: 'fa fa-money', + page: '/catalogos/formas-pago', + permissions: ['administrador.formas_pagos.index'], + }, + { + title: 'Tipos de servicio', + icon: 'fa fa-building', + page: '/catalogos/tipos-servicio', + permissions: ['administrador.tipos_servicios.index'], + }, + { + title: 'Servicios', + icon: 'fa fa-cogs', + page: '/catalogos/servicios', + permissions: ['administrador.servicios.index'], + }, + { + title: 'Tipos de vehículo', + icon: 'fa fa-truck', + page: '/catalogos/tipos-vehiculo', + permissions: ['administrador.tipos_vehiculos.index'], + }, + { + title: 'Vehículos', + icon: 'fa fa-car', + page: '/catalogos/vehiculos', + permissions: ['administrador.vehiculos.index'], + }, + { + title: 'Sucursales', + icon: 'fa fa-home', + page: '/catalogos/sucursales', + permissions: ['administrador.sucursales.index'], + }, + ] + }, + {section: 'Servicios'}, + { + title: 'Servicios', + root: true, + icon: 'fas fa-phone', + permissions: ['atencion_clientes.solicitud_servicios.index'], + submenu: [ + { + title: 'Solicitudes de servicios', + icon: 'far fa-calendar', + page: '/servicios/solicitudes-servicio', + permissions: ['atencion_clientes.solicitud_servicios.index'] + } + ] + }, + { + title: 'Agenda', + root: true, + icon: 'flaticon2-calendar', + page: '/agenda', + bullet: 'dot', + permissions: ['atencion_clientes.servicios.agenda'], + }, + {section: 'Reportes'}, + { + title: 'Reportes', + root: true, + icon: 'fa fa-line-chart', + permissions: [ + 'reportes.servicios', + 'reportes.productividad.atencionclientes', + 'reportes.servicios.asesores', + 'reportes.servicios.clientes', + 'reportes.servicios.capacidad', + 'reportes.servicios.semanal', + 'reportes.servicios.mensual' + ], + submenu: [ + { + title: 'Servicios', + icon: 'fa fa-file-excel-o', + page: '/reportes/servicios', + permissions: ['reportes.servicios'] + }, + { + title: 'Productividad atención a clientes', + icon: 'fa fa-file-excel-o', + page: '/reportes/productividad', + permissions: ['reportes.productividad.atencionclientes'] + }, + { + title: 'Servicios otorgados por asesor de operaciones', + icon: 'fa fa-file-excel-o', + page: '/reportes/servicios-asesor', + permissions: ['reportes.servicios.asesores'] + }, + { + title: 'Servicios por cliente', + icon: 'fa fa-file-excel-o', + page: '/reportes/servicios-cliente', + permissions: ['reportes.servicios.clientes'] + }, + { + title: 'Capacidad aprovechada', + icon: 'fa fa-file-excel-o', + page: '/reportes/capacidad-aprovechada', + permissions: ['reportes.servicios.capacidad'] + }, + { + title: 'Semanal', + icon: 'fa fa-file-excel-o', + page: '/reportes/semanal', + permissions: ['reportes.servicios.semanal'] + }, + { + title: 'Mensual', + icon: 'fa fa-file-excel-o', + page: '/reportes/mensual', + permissions: ['reportes.servicios.mensual'] + } + ] + }, + {section: 'Encuesta'}, + { + title: 'Encuesta', + root: true, + icon: 'fa fa-bar-chart-o', + permissions: ['reportes.servicios.encuesta'], + submenu: [ + { + title: 'Encuesta General', + icon: 'glyphicon glyphicon-list-alt', + page: '/encuesta/encuesta-general', + permissions: ['reportes.servicios.encuesta'] + } + ] + }, + ] + }, + }; + + public get configs(): any { + return this.defaults; + } +} diff --git a/src/app/core/_config/page.config.ts b/src/app/core/_config/page.config.ts new file mode 100644 index 0000000..b0df165 --- /dev/null +++ b/src/app/core/_config/page.config.ts @@ -0,0 +1,43 @@ +export class PageConfig { + public defaults: any = { + dashboard: { + page: { + title: 'Dashboard', + desc: 'Latest updates and statistic charts' + }, + }, + catalogos: { + 'usuarios': {page: {title: 'Usuarios', desc: ''}}, + 'productos': {page: {title: 'Productos', desc: ''}} + }, + builder: { + page: {title: 'Layout Builder', desc: ''} + }, + header: { + actions: { + page: {title: 'Actions', desc: 'Actions example page'} + } + }, + profile: { + page: {title: 'User Profile', desc: ''} + }, + error: { + 404: { + page: {title: '404 Not Found', desc: '', subheader: false} + }, + 403: { + page: {title: '403 Access Forbidden', desc: '', subheader: false} + } + }, + wizard: { + 'wizard-1': {page: {title: 'Wizard 1', desc: ''}}, + 'wizard-2': {page: {title: 'Wizard 2', desc: ''}}, + 'wizard-3': {page: {title: 'Wizard 3', desc: ''}}, + 'wizard-4': {page: {title: 'Wizard 4', desc: ''}}, + }, + }; + + public get configs(): any { + return this.defaults; + } +} diff --git a/src/app/core/api/CustomValidators.ts b/src/app/core/api/CustomValidators.ts new file mode 100644 index 0000000..681cf61 --- /dev/null +++ b/src/app/core/api/CustomValidators.ts @@ -0,0 +1,192 @@ +import {AbstractControl, FormControl, ValidatorFn} from '@angular/forms'; + +export class CustomValidators { + static isNullOrUndefined(obj: T | null | undefined): obj is null | undefined { + return typeof obj === 'undefined' || obj === null; + } + + static email2(control: FormControl): any { + const exp: any = /[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,3}$/; + if (control.value !== undefined && !exp.test(control.value)) { + return {'email': true, 'currentValue': control.value}; + } + return null; + } + + static password(control: FormControl): any { + const exp: any = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*)[A-Za-z0-9\d$]{8,16}$/; + if (!(typeof control.value === 'undefined' || control.value === null) && control.value !== "" && !exp.test(control.value)) { + return {'password': true, 'currentValue': control.value}; + } + return null; + } + + static fechamx(control: FormControl): any { + // let exp: any = /^(d{1,2})[/](d{1,2})[/](d{2}|d{4})$/; // Basic validation + const exp: any = /^(?:(0[1-9]|[12][0-9]|3[01])[\/.](0[1-9]|1[012])[\/.](19|20)[0-9]{2})$/; + return exp.test(control.value) ? null : { + fechamx: { + valid: true + } + }; + } + + static fechaus(control: FormControl): any { + // let exp: any = /^(d{1,2})[/](d{1,2})[/](d{2}|d{4})$/; // Basic validation + const exp: any = /^(?:(19|20)[0-9]{2}[\-.](0[1-9]|1[012])[\-.](0[1-9]|[12][0-9]|3[01]))$/; + return exp.test(control.value) ? null : { + fechaus: { + valid: true + } + }; + } + + static telefono2(control: FormControl): any { + const exp: any = /^\+\d{2,3}\s\d{10}$/; + if (control.value !== undefined && !exp.test(control.value)) { + return {'telefono': true, 'currentValue': control.value}; + } + return null; + } + + static formatoNumero(control: FormControl): any { + const exp: any = /^[0-9]+$/; + if (control.value !== undefined && !exp.test(control.value)) { + return {'formatoNumero': true, 'currentValue': control.value}; + } + return null; + } + + static formatoDecimal(control: FormControl): any { + const exp: any = /^(\d+\.?\d{0,9}|\.\d{1,9})$/; + if (control.value !== undefined && !exp.test(control.value)) { + return {'formatoDecimal': true, 'currentValue': control.value}; + } + return null; + } + + static formatoHora(control: FormControl): any { + const exp: any = /^(?:[01]\d|2[0123]):(?:[012345]\d):(?:[012345]\d)$/; + if (control.value !== undefined && !exp.test(control.value)) { + return {'formatoHora': true, 'currentValue': control.value}; + } + return null; + } + + static email(control: FormControl): any { + const exp: any = /[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,3}$/; + if (control.value !== undefined && !exp.test(control.value)) { + return {'email': true, 'currentValue': control.value}; + } + return null; + } + + static urlYoutube(control: FormControl): any { + const exp: any = /^(https:\/\/(www.)?youtube.com\/embed\/)/; + + if (control.value && !exp.test(control.value)) { + return {'deUrl': true, 'currentValue': control.value}; + } + return null; + } + + static urlSpotify(control: FormControl): any { + const exp: any = /^(https:\/\/open.spotify.com\/embed\/)/; + + if (control.value && !exp.test(control.value)) { + return {'deUrl': true, 'currentValue': control.value}; + } + return null; + } + + static telefono(control: FormControl): any { + const exp: any = /^\+\d{2,3}\s\d{10}$/; + if (control.value !== undefined && !exp.test(control.value)) { + return {'telefono': true, 'currentValue': control.value}; + } + return null; + } + + static numeric(control: FormControl): any { + const exp: any = /^[0-9]+$/; + if (control.value && !exp.test(control.value)) { + return {'numeric': true, 'currentValue': control.value}; + } + return null; + } + + static deUrl(control: FormControl): any { + const exp: any = /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/; + if (control.value !== undefined && !exp.test(control.value)) { + return {'deUrl': true, 'currentValue': control.value}; + } + return null; + } + + static deUrlImagen(control: FormControl): any { + const exp: any = /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/; + if (control.value !== undefined && !exp.test(control.value)) { + return {'deUrlImagen': true, 'currentValue': control.value}; + } + return null; + } + + // VALIDA QUE LA CONTRASEÑA NO CONTENGA ESPACIOS + static noWhiteSpace(control: FormControl): any { + const exp: any = /^\S+$/; + if (control.value !== undefined && !exp.test(control.value)) { + return {'nowhitespace': true, 'currentValue': control.value}; + } + return null; + } + + // VALIDA QUE EL USUARIO NO CONTENGA ESPACIOS + static nbUsuario(control: FormControl): any { + const exp: any = /^\S+$/; + if (control.value !== undefined && !exp.test(control.value)) { + return {'nbUsuario': true, 'currentValue': control.value}; + } + return null; + } + + // VALIDA QUE LA CONTRASEÑA NO CONTENGA ESPACIOS + static dePassword(control: FormControl): any { + const exp: any = /^\S+$/; + if (control.value !== undefined && !exp.test(control.value)) { + return {'dePassword': true, 'currentValue': control.value}; + } + return null; + } + + static precio(control: FormControl): any { + const exp: any = /^([0-9])*[.]?[0-9]*$/; + if (control.value !== undefined && !exp.test(control.value)) { + return {'precio': true, 'currentValue': control.value}; + } + return null; + } + + + static preciomayor0(control: FormControl): any { + const exp: any = /^([0-9])*[.]?[0-9]*$/; + if (parseInt(control.value) == 0) { + return {'precio': true, 'currentValue': control.value}; + } + if (control.value !== undefined && !exp.test(control.value) && parseInt(control.value) == 0) { + return {'precio': true, 'currentValue': control.value}; + } + return null; + } + + static minValue(min: Number): ValidatorFn { + return (control: AbstractControl): { [key: string]: any } => { + const input = control.value, + isValid = input < min; + if (isValid) { + return {'minValue': {min}}; + } else { + return null; + } + }; + } +} diff --git a/src/app/core/api/api-base.ts b/src/app/core/api/api-base.ts new file mode 100644 index 0000000..7b5f347 --- /dev/null +++ b/src/app/core/api/api-base.ts @@ -0,0 +1,47 @@ +import {EventEmitter, Output} from '@angular/core'; +import {HttpErrorResponse} from '@angular/common/http'; +import {Observable, throwError} from 'rxjs'; + +export class ApiBase { + @Output() errorEvent: EventEmitter = new EventEmitter(true); + + protected handleError(operation = 'operation', result?: T) { + return (error: HttpErrorResponse): Observable => { + console.log("HANDLE ERROR", error.status) + // console.error(`${operation} failed henry: ${error.message}`); + let msg: any = []; + let status = error.status; + //if(!error.status){ + // return throwError(null); + //} + if (error.status === 401) { + msg[0] = 'Usuario y/o contraseña incorrecta, intente de nuevo'; + //status = error.status; + } else if (error.status === 403) { + msg[0] = 'No cuentas con los suficientes permisos.'; + //status = error.status; + } else if (error.status === 422) { + let i = 0; + for (let e of error.error.errors) { + msg[i] = e; + i++; + } + //status = 'warning-snackbar'; + } else if (error.status === 404) { + msg[0] = 'La ruta no se encuentra disponible.'; + //status = 'error-snackbar'; + } else { + msg[0] = 'Algo salió mal, intente de nuevo'; + //status = 'error-snackbar'; + } + let info = {msg: msg, status: status, error: error.error.error}; + console.log('MENSAJE=> ', info); + + this.errorEvent.emit(info); + + return throwError(msg); + }; + } + + +} diff --git a/src/app/core/api/api.service.ts b/src/app/core/api/api.service.ts new file mode 100644 index 0000000..5b50864 --- /dev/null +++ b/src/app/core/api/api.service.ts @@ -0,0 +1,80 @@ +import {EventEmitter, Injectable, Output} from '@angular/core'; +import {AuthService} from '../auth/_services'; +import {TokenStorage} from '../auth/_services/token-storage.service'; +import {UsuariosService} from '../../views/pages/catalogos/usuarios/usuarios.service'; +import {RolesService} from '../../views/pages/catalogos/roles/roles.service'; +import {MatSnackBar} from "@angular/material/snack-bar"; +import {EstadosServicioService} from '../../views/pages/catalogos/estados-servicio/estados-servicio.service'; +import {FormasPagoService} from '../../views/pages/catalogos/formas-pago/formas-pago.service'; +import {TiposServicioService} from '../../views/pages/catalogos/tipos-servicio/tipos-servicio.service'; +import {ServiciosService} from '../../views/pages/catalogos/servicios/servicios.service'; +import {TiposVehiculoService} from '../../views/pages/catalogos/tipos-vehiculo/tipos-vehiculo.service'; +import {VehiculosService} from '../../views/pages/catalogos/vehiculos/vehiculos.service'; +import {SucursalesService} from '../../views/pages/catalogos/sucursales/sucursales.service'; +import {ClientesService} from '../../views/pages/catalogos/clientes/clientes.service'; +import { SolicitudesServicioService } from '../../views/pages/servicios/solicitudes-servicio/solicitudes-servicio.service'; +import { ReportesService } from '../../views/pages/reportes/reportes.service'; +import {ClientesDomiciliosService} from '../../views/pages/catalogos/clientes/clientes-domicilios.service'; +import {AgendaService} from "../../views/pages/agenda/agenda.service"; + +@Injectable({ + providedIn: 'root' +}) +export class ApiService { + + + @Output() error: EventEmitter = new EventEmitter(true); + + constructor( + public login: AuthService, + public usuarios: UsuariosService, + public roles: RolesService, + public estadosServicio: EstadosServicioService, + public formasPago: FormasPagoService, + public tiposServicio: TiposServicioService, + public servicios: ServiciosService, + public tiposVehiculos: TiposVehiculoService, + public vehiculos: VehiculosService, + public sucursales: SucursalesService, + public clientes: ClientesService, + public clientesDomicilios: ClientesDomiciliosService, + public solicitudesServicioService: SolicitudesServicioService, + public reportesService: ReportesService, + public tokenStorage: TokenStorage, + public snackBar: MatSnackBar, + public agenda: AgendaService + ) { + this.login.errorEvent.subscribe((res: any) => this.error.emit(res)); + this.usuarios.errorEvent.subscribe((res: any) => this.error.emit(res)); + this.roles.errorEvent.subscribe((res: any) => this.error.emit(res)); + this.estadosServicio.errorEvent.subscribe((res: any) => this.error.emit(res)); + this.formasPago.errorEvent.subscribe((res: any) => this.error.emit(res)); + this.tiposServicio.errorEvent.subscribe((res: any) => this.error.emit(res)); + this.servicios.errorEvent.subscribe((res: any) => this.error.emit(res)); + this.tiposVehiculos.errorEvent.subscribe((res: any) => this.error.emit(res)); + this.vehiculos.errorEvent.subscribe((res: any) => this.error.emit(res)); + this.sucursales.errorEvent.subscribe((res: any) => this.error.emit(res)); + this.clientes.errorEvent.subscribe((res: any) => this.error.emit(res)); + this.clientesDomicilios.errorEvent.subscribe((res: any) => this.error.emit(res)); + this.solicitudesServicioService.errorEvent.subscribe((res: any) => this.error.emit(res)); + this.reportesService.errorEvent.subscribe((res: any) => this.error.emit(res)); + this.agenda.errorEvent.subscribe((res: any) => this.error.emit(res)); + } + + /** + * Get access token + * @description Should return access token in Observable from e.g. localStorage + * @returns {Observable} + */ + public getAccessToken(): string { + return this.tokenStorage.getAccessToken(); + } + + public snackbar(msg: string, duration: number = 3000) { + this.snackBar.open(msg, '', { + duration: duration, + verticalPosition: 'bottom', + horizontalPosition: 'right', + }); + } +} diff --git a/src/app/core/api/feedback-validators-reset.component.ts b/src/app/core/api/feedback-validators-reset.component.ts new file mode 100644 index 0000000..4c0dae8 --- /dev/null +++ b/src/app/core/api/feedback-validators-reset.component.ts @@ -0,0 +1,37 @@ +import {Component, Input} from '@angular/core'; + +@Component({ + styles : [` + .my-mat-hint { + line-height: 1.2em; + transform: translateY(30px); + font-size: 75%; + } + `], + selector : 'app-feedback-validator-reset', + template : + `
+
El campo {{attr}} es requerido.
+
El {{attr}} debe ser más grande que {{errors.minlength.requiredLength}} caracteres.
+
El campo {{attr}} tiene caracteres de espacio en blanco no válido.
+
El campo {{attr}} debe tener {{errors.size.requiredSize}} caracteres.
+
El campo {{attr}} debe ser numérico.
+
El campo {{attr}} debe ser un correo electrónico válido.
+
El campo seleccionado {{attr}} es inválido.
+
El campo seleccionado {{attr}} is inválido.
+
El campo seleccionado {{attr}} es inválido.
+
El número máximo de caracteres para el campo {{attr}} es {{errors.max.length}}.
+
El número mínimo de caracteres para el campo {{attr}} es {{errors.min.length}}.
+
La hora debe ser formato 24 horas (HH:MM:SS).
+
El campo {{attr}} debe tener 10 números.
+ +
` +}) +export class FeedbackValidatorsResetComponent { + + @Input() submitted; + @Input() errors; + @Input() attr = 'Field'; + constructor() {} + +} diff --git a/src/app/core/api/feedback-validators.component.ts b/src/app/core/api/feedback-validators.component.ts new file mode 100644 index 0000000..ffb1f66 --- /dev/null +++ b/src/app/core/api/feedback-validators.component.ts @@ -0,0 +1,37 @@ +import {Component, Input} from '@angular/core'; + +@Component({ + styles : [` + .my-mat-hint { + line-height: 1.2em; + transform: translateY(30px); + font-size: 75%; + } + `], + selector : 'app-feedback-validator', + template : + `
+
El campo {{attr}} es requerido.
+
El {{attr}} debe ser más grande que {{errors.minlength.requiredLength}} caracteres.
+
El campo {{attr}} tiene caracteres de espacio en blanco no válido.
+
El campo {{attr}} debe tener {{errors.size.requiredSize}} caracteres.
+
El campo {{attr}} debe ser numérico.
+
El campo {{attr}} debe ser un correo electrónico válido.
+
El campo seleccionado {{attr}} es inválido.
+
El campo seleccionado {{attr}} is inválido.
+
El campo seleccionado {{attr}} es inválido.
+
El número máximo de caracteres para el campo {{attr}} es {{errors.max.length}}.
+
El número mínimo de caracteres para el campo {{attr}} es {{errors.min.length}}.
+
La hora debe ser formato 24 horas (HH:MM:SS).
+
El campo {{attr}} debe tener 10 números.
+ +
` +}) +export class FeedbackValidatorsComponent { + + @Input() submitted; + @Input() errors; + @Input() attr = 'Field'; + constructor() {} + +} diff --git a/src/app/core/api/myErrorStateMatcher.ts b/src/app/core/api/myErrorStateMatcher.ts new file mode 100644 index 0000000..42cf941 --- /dev/null +++ b/src/app/core/api/myErrorStateMatcher.ts @@ -0,0 +1,9 @@ +/** Error when invalid control is dirty or touched*/ +import {ErrorStateMatcher} from '@angular/material'; +import {FormControl, FormGroupDirective, NgForm} from '@angular/forms'; + +export class MyErrorStateMatcher implements ErrorStateMatcher { + isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { + return !!(control && control.invalid && (control.dirty || control.touched)); + } +} diff --git a/src/app/core/api/resource.ts b/src/app/core/api/resource.ts new file mode 100644 index 0000000..e512741 --- /dev/null +++ b/src/app/core/api/resource.ts @@ -0,0 +1,66 @@ +import {EventEmitter, Output} from '@angular/core'; +import {HttpClient, HttpParams} from '@angular/common/http'; +import {Observable} from 'rxjs/index'; +import {isNullOrUndefined} from 'util'; +import {catchError} from 'rxjs/internal/operators'; +import {ApiBase} from './api-base'; +import {environment} from '../../../environments/environment'; + + +export class ResourceBase extends ApiBase { + + baseUrl = environment.API; + private url = ''; + + constructor(public http: HttpClient, private urlReceive: string) { + super(); + this.url = this.baseUrl + urlReceive; + } + + @Output() errorEvent: EventEmitter = new EventEmitter(true); + + public index(page?: string, searchText?: string, sortBy?: string, order?: string, perPage?: string, visible?: string, deleted_at?: string): Observable { + + const params = new HttpParams() + .set('sortBy', isNullOrUndefined(sortBy) ? '' : sortBy) + .set('order', isNullOrUndefined(order) ? '' : order) + .set('page', isNullOrUndefined(page) ? '1' : page) + .set('perPage', isNullOrUndefined(perPage) ? '10' : perPage) + .set('visible', isNullOrUndefined(visible) ? '1' : visible) + .set('deleted', isNullOrUndefined(deleted_at) ? '0' : deleted_at) + .set('query', searchText ? searchText : ''); + const options = {params: params}; + + return this.http.get(this.url, options).pipe( + catchError(this.handleError('index')) + ); + } + + + public create(body: any): Observable { + return this.http.post(this.url, body).pipe( + catchError(this.handleError('create')) + ); + } + + public delete(id: number, reactivate = false): Observable { + + let deleted = reactivate ? '?deleted=1' : ''; + + return this.http.delete(`${this.url}/${id}`+ deleted).pipe( + catchError(this.handleError('delete')) + ); + } + + public show(id: number): Observable { + return this.http.get(`${this.url}/${id}`).pipe( + catchError(this.handleError('show')) + ); + } + + public update(id: number, body: any): Observable { + return this.http.put(`${this.url}/${id}`, body).pipe( + catchError(this.handleError('update')) + ); + } +} diff --git a/src/app/core/api/url-interceptor.service.ts b/src/app/core/api/url-interceptor.service.ts new file mode 100644 index 0000000..72426b5 --- /dev/null +++ b/src/app/core/api/url-interceptor.service.ts @@ -0,0 +1,25 @@ +import {Injectable} from '@angular/core'; +import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http'; +import {Observable} from 'rxjs/index'; +import {ApiService} from "./api.service"; +@Injectable({ + providedIn: 'root' +}) +export class UrlInterceptorService implements HttpInterceptor { + + constructor(private api: ApiService) { + } + + + intercept(req: HttpRequest, next: HttpHandler): Observable> { + + const authToken: string = this.api.getAccessToken(); + + const authReq = req.clone({ + headers: req.headers.set('Authorization', 'Bearer ' + authToken) + .set('Application', 'WEB'), + url: `${req.url}` + }); + return next.handle(authReq); + } +} diff --git a/src/app/core/api/validators.component.ts b/src/app/core/api/validators.component.ts new file mode 100644 index 0000000..8f5beab --- /dev/null +++ b/src/app/core/api/validators.component.ts @@ -0,0 +1,40 @@ +import {Component, Input} from '@angular/core'; + +@Component({ + styles : [` + .my-mat-hint { + line-height: 1.2em; + transform: translateY(30px); + font-size: 75%; + } + `], + selector : 'app-validator', + template : + `
+
El campo {{attr}} es requerido.
+
El {{attr}} debe ser más grande que {{errors.minlength.requiredLength}} caracteres.
+
El campo {{attr}} tiene caracteres de espacio en blanco no válido.
+
El campo {{attr}} debe tener {{errors.size.requiredSize}} caracteres.
+
El campo {{attr}} debe ser numérico.
+
El campo {{attr}} debe ser un correo electrónico válido.
+
El campo seleccionado {{attr}} es inválido.
+
El campo seleccionado {{attr}} is inválido.
+
El campo seleccionado {{attr}} es inválido.
+
El número máximo de caracteres para el campo {{attr}} es {{errors.max.length}}.
+
El número mínimo de caracteres para el campo {{attr}} es {{errors.min.length}}.
+
La hora debe ser formato 24 horas (HH:MM:SS).
+
El campo {{attr}} debe tener 10 números.
+
El campo {{attr}} debe ser una url correcta.
+
El campo {{attr}} debe ser una url de Youtube correcta..
+
El campo {{attr}} debe ser un precio correcto.
+ +
` +}) +export class ValidatorsComponent { + + @Input() submitted; + @Input() errors; + @Input() attr = 'Field'; + constructor() {} + +} diff --git a/src/app/core/auth/_actions/auth.actions.ts b/src/app/core/auth/_actions/auth.actions.ts new file mode 100644 index 0000000..1263843 --- /dev/null +++ b/src/app/core/auth/_actions/auth.actions.ts @@ -0,0 +1,38 @@ +import { Action } from '@ngrx/store'; +import { User } from '../_models/user.model'; + +export enum AuthActionTypes { + Login = '[Login] Action', + Logout = '[Logout] Action', + Register = '[Register] Action', + UserRequested = '[Request User] Action', + UserLoaded = '[Load User] Auth API' +} + +export class Login implements Action { + readonly type = AuthActionTypes.Login; + constructor(public payload: { authToken: string }) { } +} + +export class Logout implements Action { + readonly type = AuthActionTypes.Logout; +} + +export class Register implements Action { + readonly type = AuthActionTypes.Register; + constructor(public payload: { authToken: string }) { } +} + + +export class UserRequested implements Action { + readonly type = AuthActionTypes.UserRequested; +} + +export class UserLoaded implements Action { + readonly type = AuthActionTypes.UserLoaded; + constructor(public payload: { user: User }) { } +} + + + +export type AuthActions = Login | Logout | Register | UserRequested | UserLoaded; diff --git a/src/app/core/auth/_actions/permission.actions.ts b/src/app/core/auth/_actions/permission.actions.ts new file mode 100644 index 0000000..2079ca2 --- /dev/null +++ b/src/app/core/auth/_actions/permission.actions.ts @@ -0,0 +1,20 @@ +// NGRX +import { Action } from '@ngrx/store'; +// Models +import { Permission } from '../_models/permission.model'; + +export enum PermissionActionTypes { + AllPermissionsRequested = '[Init] All Permissions Requested', + AllPermissionsLoaded = '[Init] All Permissions Loaded' +} + +export class AllPermissionsRequested implements Action { + readonly type = PermissionActionTypes.AllPermissionsRequested; +} + +export class AllPermissionsLoaded implements Action { + readonly type = PermissionActionTypes.AllPermissionsLoaded; + constructor(public payload: { permissions: Permission[] }) { } +} + +export type PermissionActions = AllPermissionsRequested | AllPermissionsLoaded; diff --git a/src/app/core/auth/_actions/role.actions.ts b/src/app/core/auth/_actions/role.actions.ts new file mode 100644 index 0000000..f7083ec --- /dev/null +++ b/src/app/core/auth/_actions/role.actions.ts @@ -0,0 +1,89 @@ +// NGRX +import { Action } from '@ngrx/store'; +import { Update } from '@ngrx/entity'; +// CRUD +import { QueryParamsModel } from '../../_base/crud'; +// Models +import { Role } from '../_models/role.model'; + +export enum RoleActionTypes { + AllRolesRequested = '[Roles Home Page] All Roles Requested', + AllRolesLoaded = '[Roles API] All Roles Loaded', + RoleOnServerCreated = '[Edit Role Dialog] Role On Server Created', + RoleCreated = '[Edit Roles Dialog] Roles Created', + RoleUpdated = '[Edit Role Dialog] Role Updated', + RoleDeleted = '[Roles List Page] Role Deleted', + RolesPageRequested = '[Roles List Page] Roles Page Requested', + RolesPageLoaded = '[Roles API] Roles Page Loaded', + RolesPageCancelled = '[Roles API] Roles Page Cancelled', + RolesPageToggleLoading = '[Roles page] Roles Page Toggle Loading', + RolesActionToggleLoading = '[Roles] Roles Action Toggle Loading' +} + +export class RoleOnServerCreated implements Action { + readonly type = RoleActionTypes.RoleOnServerCreated; + constructor(public payload: { role: Role }) { } +} + +export class RoleCreated implements Action { + readonly type = RoleActionTypes.RoleCreated; + constructor(public payload: { role: Role }) { } +} + +export class RoleUpdated implements Action { + readonly type = RoleActionTypes.RoleUpdated; + constructor(public payload: { + partialrole: Update, + role: Role + }) { } +} + +export class RoleDeleted implements Action { + readonly type = RoleActionTypes.RoleDeleted; + constructor(public payload: { id: number }) {} +} + +export class RolesPageRequested implements Action { + readonly type = RoleActionTypes.RolesPageRequested; + constructor(public payload: { page: QueryParamsModel }) { } +} + +export class RolesPageLoaded implements Action { + readonly type = RoleActionTypes.RolesPageLoaded; + constructor(public payload: { roles: Role[], totalCount: number, page: QueryParamsModel }) { } +} + +export class RolesPageCancelled implements Action { + readonly type = RoleActionTypes.RolesPageCancelled; +} + +export class AllRolesRequested implements Action { + readonly type = RoleActionTypes.AllRolesRequested; +} + +export class AllRolesLoaded implements Action { + readonly type = RoleActionTypes.AllRolesLoaded; + constructor(public payload: { roles: Role[] }) { } +} + +export class RolesPageToggleLoading implements Action { + readonly type = RoleActionTypes.RolesPageToggleLoading; + constructor(public payload: { isLoading: boolean }) { } +} + +export class RolesActionToggleLoading implements Action { + readonly type = RoleActionTypes.RolesActionToggleLoading; + constructor(public payload: { isLoading: boolean }) { } +} + +export type RoleActions = RoleCreated +| RoleUpdated +| RoleDeleted +| RolesPageRequested +| RolesPageLoaded +| RolesPageCancelled +| AllRolesLoaded +| AllRolesRequested +| RoleOnServerCreated +| RolesPageToggleLoading +| RolesActionToggleLoading; diff --git a/src/app/core/auth/_actions/user.actions.ts b/src/app/core/auth/_actions/user.actions.ts new file mode 100644 index 0000000..c47cef4 --- /dev/null +++ b/src/app/core/auth/_actions/user.actions.ts @@ -0,0 +1,80 @@ +// NGRX +import { Action } from '@ngrx/store'; +import { Update } from '@ngrx/entity'; +// CRUD +import { User } from '../_models/user.model'; +// Models +import { QueryParamsModel } from '../../_base/crud'; + +export enum UserActionTypes { + AllUsersRequested = '[Users Module] All Users Requested', + AllUsersLoaded = '[Users API] All Users Loaded', + UserOnServerCreated = '[Edit User Component] User On Server Created', + UserCreated = '[Edit User Dialog] User Created', + UserUpdated = '[Edit User Dialog] User Updated', + UserDeleted = '[Users List Page] User Deleted', + UsersPageRequested = '[Users List Page] Users Page Requested', + UsersPageLoaded = '[Users API] Users Page Loaded', + UsersPageCancelled = '[Users API] Users Page Cancelled', + UsersPageToggleLoading = '[Users] Users Page Toggle Loading', + UsersActionToggleLoading = '[Users] Users Action Toggle Loading' +} + +export class UserOnServerCreated implements Action { + readonly type = UserActionTypes.UserOnServerCreated; + constructor(public payload: { user: User }) { } +} + +export class UserCreated implements Action { + readonly type = UserActionTypes.UserCreated; + constructor(public payload: { user: User }) { } +} + + +export class UserUpdated implements Action { + readonly type = UserActionTypes.UserUpdated; + constructor(public payload: { + partialUser: Update, + user: User + }) { } +} + +export class UserDeleted implements Action { + readonly type = UserActionTypes.UserDeleted; + constructor(public payload: { id: number }) {} +} + +export class UsersPageRequested implements Action { + readonly type = UserActionTypes.UsersPageRequested; + constructor(public payload: { page: QueryParamsModel }) { } +} + +export class UsersPageLoaded implements Action { + readonly type = UserActionTypes.UsersPageLoaded; + constructor(public payload: { users: User[], totalCount: number, page: QueryParamsModel }) { } +} + + +export class UsersPageCancelled implements Action { + readonly type = UserActionTypes.UsersPageCancelled; +} + +export class UsersPageToggleLoading implements Action { + readonly type = UserActionTypes.UsersPageToggleLoading; + constructor(public payload: { isLoading: boolean }) { } +} + +export class UsersActionToggleLoading implements Action { + readonly type = UserActionTypes.UsersActionToggleLoading; + constructor(public payload: { isLoading: boolean }) { } +} + +export type UserActions = UserCreated +| UserUpdated +| UserDeleted +| UserOnServerCreated +| UsersPageLoaded +| UsersPageCancelled +| UsersPageToggleLoading +| UsersPageRequested +| UsersActionToggleLoading; diff --git a/src/app/core/auth/_data-sources/roles.datasource.ts b/src/app/core/auth/_data-sources/roles.datasource.ts new file mode 100644 index 0000000..39e9c34 --- /dev/null +++ b/src/app/core/auth/_data-sources/roles.datasource.ts @@ -0,0 +1,33 @@ +// RxJS +import { of } from 'rxjs'; +import { catchError, finalize, tap, debounceTime, delay, distinctUntilChanged } from 'rxjs/operators'; +// NGRX +import { Store, select } from '@ngrx/store'; +// CRUD +import { BaseDataSource, QueryResultsModel } from '../../_base/crud'; +// State +import { AppState } from '../../../core/reducers'; +// Selectirs +import { selectQueryResult, selectRolesPageLoading, selectRolesShowInitWaitingMessage } from '../_selectors/role.selectors'; + +export class RolesDataSource extends BaseDataSource { + constructor(private store: Store) { + super(); + + this.loading$ = this.store.pipe( + select(selectRolesPageLoading) + ); + + this.isPreloadTextViewed$ = this.store.pipe( + select(selectRolesShowInitWaitingMessage) + ); + + this.store.pipe( + select(selectQueryResult) + ).subscribe((response: QueryResultsModel) => { + this.paginatorTotalSubject.next(response.totalCount); + this.entitySubject.next(response.items); + }); + + } +} diff --git a/src/app/core/auth/_data-sources/users.datasource.ts b/src/app/core/auth/_data-sources/users.datasource.ts new file mode 100644 index 0000000..05a5941 --- /dev/null +++ b/src/app/core/auth/_data-sources/users.datasource.ts @@ -0,0 +1,32 @@ +// RxJS +import { of } from 'rxjs'; +import { catchError, finalize, tap, debounceTime, delay, distinctUntilChanged } from 'rxjs/operators'; +// NGRX +import { Store, select } from '@ngrx/store'; +// CRUD +import { BaseDataSource, QueryResultsModel } from '../../_base/crud'; +// State +import { AppState } from '../../../core/reducers'; +import { selectUsersInStore, selectUsersPageLoading, selectUsersShowInitWaitingMessage } from '../_selectors/user.selectors'; + + +export class UsersDataSource extends BaseDataSource { + constructor(private store: Store) { + super(); + + this.loading$ = this.store.pipe( + select(selectUsersPageLoading) + ); + + this.isPreloadTextViewed$ = this.store.pipe( + select(selectUsersShowInitWaitingMessage) + ); + + this.store.pipe( + select(selectUsersInStore) + ).subscribe((response: QueryResultsModel) => { + this.paginatorTotalSubject.next(response.totalCount); + this.entitySubject.next(response.items); + }); + } +} diff --git a/src/app/core/auth/_effects/auth.effects.ts b/src/app/core/auth/_effects/auth.effects.ts new file mode 100644 index 0000000..d635f42 --- /dev/null +++ b/src/app/core/auth/_effects/auth.effects.ts @@ -0,0 +1,84 @@ +// Angular +import { Injectable } from '@angular/core'; +import { NavigationEnd, Router } from '@angular/router'; +// RxJS +import { filter, mergeMap, tap, withLatestFrom } from 'rxjs/operators'; +import { defer, Observable, of } from 'rxjs'; +// NGRX +import { Actions, Effect, ofType } from '@ngrx/effects'; +import { Action, select, Store } from '@ngrx/store'; +// Auth actions +import { AuthActionTypes, Login, Logout, Register, UserLoaded, UserRequested } from '../_actions/auth.actions'; +import { AuthService } from '../_services/index'; +import { AppState } from '../../reducers'; +import { environment } from '../../../../environments/environment'; +import { isUserLoaded } from '../_selectors/auth.selectors'; + +@Injectable() +export class AuthEffects { + @Effect({dispatch: false}) + login$ = this.actions$.pipe( + ofType(AuthActionTypes.Login), + tap(action => { + localStorage.setItem(environment.authTokenKey, action.payload.authToken); + this.store.dispatch(new UserRequested()); + }), + ); + + @Effect({dispatch: false}) + logout$ = this.actions$.pipe( + ofType(AuthActionTypes.Logout), + tap(() => { + localStorage.removeItem(environment.authTokenKey); + this.router.navigate(['/auth/login'], {queryParams: {returnUrl: this.returnUrl}}); + }) + ); + + @Effect({dispatch: false}) + register$ = this.actions$.pipe( + ofType(AuthActionTypes.Register), + tap(action => { + localStorage.setItem(environment.authTokenKey, action.payload.authToken); + }) + ); + + @Effect({dispatch: false}) + loadUser$ = this.actions$ + .pipe( + ofType(AuthActionTypes.UserRequested), + withLatestFrom(this.store.pipe(select(isUserLoaded))), + filter(([action, _isUserLoaded]) => !_isUserLoaded), + mergeMap(([action, _isUserLoaded]) => this.auth.getUserByToken()), + tap(_user => { + if (_user) { + this.store.dispatch(new UserLoaded({ user: _user })); + } else { + this.store.dispatch(new Logout()); + } + }) + ); + + @Effect() + init$: Observable = defer(() => { + const userToken = localStorage.getItem(environment.authTokenKey); + let observableResult = of({type: 'NO_ACTION'}); + if (userToken) { + observableResult = of(new Login({ authToken: userToken })); + } + return observableResult; + }); + + private returnUrl: string; + + constructor(private actions$: Actions, + private router: Router, + private auth: AuthService, + private store: Store) { + + this.router.events.subscribe(event => { + if (event instanceof NavigationEnd) { + this.returnUrl = event.url; + } + }); + } +} diff --git a/src/app/core/auth/_effects/permission.effects.ts b/src/app/core/auth/_effects/permission.effects.ts new file mode 100644 index 0000000..6f2ba11 --- /dev/null +++ b/src/app/core/auth/_effects/permission.effects.ts @@ -0,0 +1,40 @@ +// Angular +import { Injectable } from '@angular/core'; +// RxJS +import { mergeMap, map, tap } from 'rxjs/operators'; +import { defer, Observable, of } from 'rxjs'; +// NGRX +import { Effect, Actions, ofType } from '@ngrx/effects'; +import { Action } from '@ngrx/store'; +// Services +import { AuthService } from '../_services'; +// Actions +import { + AllPermissionsLoaded, + AllPermissionsRequested, + PermissionActionTypes +} from '../_actions/permission.actions'; +// Models +import { Permission } from '../_models/permission.model'; + +@Injectable() +export class PermissionEffects { + @Effect() + loadAllPermissions$ = this.actions$ + .pipe( + ofType(PermissionActionTypes.AllPermissionsRequested), + mergeMap(() => this.auth.getAllPermissions()), + map((result: Permission[]) => { + return new AllPermissionsLoaded({ + permissions: result + }); + }) + ); + + @Effect() + init$: Observable = defer(() => { + return of(new AllPermissionsRequested()); + }); + + constructor(private actions$: Actions, private auth: AuthService) { } +} diff --git a/src/app/core/auth/_effects/role.effects.ts b/src/app/core/auth/_effects/role.effects.ts new file mode 100644 index 0000000..de02674 --- /dev/null +++ b/src/app/core/auth/_effects/role.effects.ts @@ -0,0 +1,126 @@ +// Angular +import { Injectable } from '@angular/core'; +// RxJS +import { of, Observable, defer, forkJoin } from 'rxjs'; +import { mergeMap, map, withLatestFrom, filter, tap } from 'rxjs/operators'; +// NGRX +import { Effect, Actions, ofType } from '@ngrx/effects'; +import { Store, select, Action } from '@ngrx/store'; +// CRUD +import { QueryResultsModel, QueryParamsModel } from '../../_base/crud'; +// Services +import { AuthService } from '../_services'; +// State +import { AppState } from '../../../core/reducers'; +// Selectors +import { allRolesLoaded } from '../_selectors/role.selectors'; +// Actions +import { + AllRolesLoaded, + AllRolesRequested, + RoleActionTypes, + RolesPageRequested, + RolesPageLoaded, + RoleUpdated, + RolesPageToggleLoading, + RoleDeleted, + RoleOnServerCreated, + RoleCreated, + RolesActionToggleLoading +} from '../_actions/role.actions'; + +@Injectable() +export class RoleEffects { + showPageLoadingDistpatcher = new RolesPageToggleLoading({ isLoading: true }); + hidePageLoadingDistpatcher = new RolesPageToggleLoading({ isLoading: false }); + + showActionLoadingDistpatcher = new RolesActionToggleLoading({ isLoading: true }); + hideActionLoadingDistpatcher = new RolesActionToggleLoading({ isLoading: false }); + + @Effect() + loadAllRoles$ = this.actions$ + .pipe( + ofType(RoleActionTypes.AllRolesRequested), + withLatestFrom(this.store.pipe(select(allRolesLoaded))), + filter(([action, isAllRolesLoaded]) => !isAllRolesLoaded), + mergeMap(() => this.auth.getAllRoles()), + map(roles => { + return new AllRolesLoaded({roles}); + }) + ); + + @Effect() + loadRolesPage$ = this.actions$ + .pipe( + ofType(RoleActionTypes.RolesPageRequested), + mergeMap(( { payload } ) => { + this.store.dispatch(this.showPageLoadingDistpatcher); + const requestToServer = this.auth.findRoles(payload.page); + const lastQuery = of(payload.page); + return forkJoin(requestToServer, lastQuery); + }), + map(response => { + const result: QueryResultsModel = response[0]; + const lastQuery: QueryParamsModel = response[1]; + this.store.dispatch(this.hidePageLoadingDistpatcher); + + return new RolesPageLoaded({ + roles: result.items, + totalCount: result.totalCount, + page: lastQuery + }); + }), + ); + + @Effect() + deleteRole$ = this.actions$ + .pipe( + ofType(RoleActionTypes.RoleDeleted), + mergeMap(( { payload } ) => { + this.store.dispatch(this.showActionLoadingDistpatcher); + return this.auth.deleteRole(payload.id); + } + ), + map(() => { + return this.hideActionLoadingDistpatcher; + }), + ); + + @Effect() + updateRole$ = this.actions$ + .pipe( + ofType(RoleActionTypes.RoleUpdated), + mergeMap(( { payload } ) => { + this.store.dispatch(this.showActionLoadingDistpatcher); + return this.auth.updateRole(payload.role); + }), + map(() => { + return this.hideActionLoadingDistpatcher; + }), + ); + + + @Effect() + createRole$ = this.actions$ + .pipe( + ofType(RoleActionTypes.RoleOnServerCreated), + mergeMap(( { payload } ) => { + this.store.dispatch(this.showActionLoadingDistpatcher); + return this.auth.createRole(payload.role).pipe( + tap(res => { + this.store.dispatch(new RoleCreated({ role: res })); + }) + ); + }), + map(() => { + return this.hideActionLoadingDistpatcher; + }), + ); + + @Effect() + init$: Observable = defer(() => { + return of(new AllRolesRequested()); + }); + + constructor(private actions$: Actions, private auth: AuthService, private store: Store) { } +} diff --git a/src/app/core/auth/_effects/user.effects.ts b/src/app/core/auth/_effects/user.effects.ts new file mode 100644 index 0000000..f6fcb8d --- /dev/null +++ b/src/app/core/auth/_effects/user.effects.ts @@ -0,0 +1,101 @@ +// Angular +import { Injectable } from '@angular/core'; +// RxJS +import { mergeMap, map, tap } from 'rxjs/operators'; +import { Observable, defer, of, forkJoin } from 'rxjs'; +// NGRX +import { Effect, Actions, ofType } from '@ngrx/effects'; +import { Store, select, Action } from '@ngrx/store'; +// CRUD +import { QueryResultsModel, QueryParamsModel } from '../../_base/crud'; +// Services +import { AuthService } from '../../../core/auth/_services'; +// State +import { AppState } from '../../../core/reducers'; +import { + UserActionTypes, + UsersPageRequested, + UsersPageLoaded, + UserCreated, + UserDeleted, + UserUpdated, + UserOnServerCreated, + UsersActionToggleLoading, + UsersPageToggleLoading +} from '../_actions/user.actions'; + +@Injectable() +export class UserEffects { + showPageLoadingDistpatcher = new UsersPageToggleLoading({ isLoading: true }); + hidePageLoadingDistpatcher = new UsersPageToggleLoading({ isLoading: false }); + + showActionLoadingDistpatcher = new UsersActionToggleLoading({ isLoading: true }); + hideActionLoadingDistpatcher = new UsersActionToggleLoading({ isLoading: false }); + + @Effect() + loadUsersPage$ = this.actions$ + .pipe( + ofType(UserActionTypes.UsersPageRequested), + mergeMap(( { payload } ) => { + this.store.dispatch(this.showPageLoadingDistpatcher); + const requestToServer = this.auth.findUsers(payload.page); + const lastQuery = of(payload.page); + return forkJoin(requestToServer, lastQuery); + }), + map(response => { + const result: QueryResultsModel = response[0]; + const lastQuery: QueryParamsModel = response[1]; + return new UsersPageLoaded({ + users: result.items, + totalCount: result.totalCount, + page: lastQuery + }); + }), + ); + + @Effect() + deleteUser$ = this.actions$ + .pipe( + ofType(UserActionTypes.UserDeleted), + mergeMap(( { payload } ) => { + this.store.dispatch(this.showActionLoadingDistpatcher); + return this.auth.deleteUser(payload.id); + } + ), + map(() => { + return this.hideActionLoadingDistpatcher; + }), + ); + + @Effect() + updateUser$ = this.actions$ + .pipe( + ofType(UserActionTypes.UserUpdated), + mergeMap(( { payload } ) => { + this.store.dispatch(this.showActionLoadingDistpatcher); + return this.auth.updateUser(payload.user); + }), + map(() => { + return this.hideActionLoadingDistpatcher; + }), + ); + + @Effect() + createUser$ = this.actions$ + .pipe( + ofType(UserActionTypes.UserOnServerCreated), + mergeMap(( { payload } ) => { + this.store.dispatch(this.showActionLoadingDistpatcher); + return this.auth.createUser(payload.user).pipe( + tap(res => { + this.store.dispatch(new UserCreated({ user: res })); + }) + ); + }), + map(() => { + return this.hideActionLoadingDistpatcher; + }), + ); + + constructor(private actions$: Actions, private auth: AuthService, private store: Store) { } +} diff --git a/src/app/core/auth/_guards/auth.guard.ts b/src/app/core/auth/_guards/auth.guard.ts new file mode 100644 index 0000000..15fd1b3 --- /dev/null +++ b/src/app/core/auth/_guards/auth.guard.ts @@ -0,0 +1,34 @@ +import {Injectable} from '@angular/core'; +import { + CanActivate, + ActivatedRouteSnapshot, + RouterStateSnapshot, Router, +} from '@angular/router'; +import {NgxPermissionsService} from "ngx-permissions"; +import { AuthService } from '../_services'; + +@Injectable({providedIn: 'root'}) +export class AuthGuard implements CanActivate { + constructor(private authService: AuthService, private router: Router, private pService: NgxPermissionsService) { + } + + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { + let user = this.authService.getUser(); + if(user){ + let permissions = this.authService.getPermission(); + let result = []; + for(let i in permissions){ + if(permissions[i]){ + result.push(i); + } + } + this.pService.loadPermissions(result); + } + + if(!user){ + this.router.navigateByUrl('/auth/login'); + } + + return !!user; + } +} diff --git a/src/app/core/auth/_guards/module.guard.ts b/src/app/core/auth/_guards/module.guard.ts new file mode 100644 index 0000000..27b1ac7 --- /dev/null +++ b/src/app/core/auth/_guards/module.guard.ts @@ -0,0 +1,42 @@ +// Angular +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router'; +// RxJS +import { Observable, of } from 'rxjs'; +import { tap, map } from 'rxjs/operators'; +// NGRX +import { select, Store } from '@ngrx/store'; +// Module reducers and selectors +import { AppState} from '../../../core/reducers/'; +import { currentUserPermissions } from '../_selectors/auth.selectors'; +import { Permission } from '../_models/permission.model'; +import { find } from 'lodash'; + +@Injectable() +export class ModuleGuard implements CanActivate { + constructor(private store: Store, private router: Router) { } + + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + + const moduleName = route.data.moduleName as string; + if (!moduleName) { + return of(false); + } + + return this.store + .pipe( + select(currentUserPermissions), + map((permissions: Permission[]) => { + const _perm = find(permissions, (elem: Permission) => { + return elem.title.toLocaleLowerCase() === moduleName.toLocaleLowerCase(); + }); + return _perm ? true : false; + }), + tap(hasAccess => { + if (!hasAccess) { + this.router.navigateByUrl('/error/403'); + } + }) + ); + } +} diff --git a/src/app/core/auth/_models/access-data.ts b/src/app/core/auth/_models/access-data.ts new file mode 100644 index 0000000..107ef0f --- /dev/null +++ b/src/app/core/auth/_models/access-data.ts @@ -0,0 +1,9 @@ +// Samplce access data +// {"id":1,"username":"admin","password":"demo","email":"admin@demo.com","accessToken":"access-token-0.022563452858263444","refreshToken":"access-token-0.9348573301432961","roles":["ADMIN"],"pic":"./assets/app/media/img/users/user4.jpg","fullname":"Mark Andre"} +export interface AccessData { + token: string; + refreshToken: string; + role: any; + user: any; + permissions: any; +} diff --git a/src/app/core/auth/_models/address.model.ts b/src/app/core/auth/_models/address.model.ts new file mode 100644 index 0000000..69912c4 --- /dev/null +++ b/src/app/core/auth/_models/address.model.ts @@ -0,0 +1,13 @@ +export class Address { + addressLine: string; + city: string; + state: string; + postCode: string; + + clear() { + this.addressLine = ''; + this.city = ''; + this.state = ''; + this.postCode = ''; + } +} diff --git a/src/app/core/auth/_models/permission.model.ts b/src/app/core/auth/_models/permission.model.ts new file mode 100644 index 0000000..cc5ad2a --- /dev/null +++ b/src/app/core/auth/_models/permission.model.ts @@ -0,0 +1,21 @@ +import { BaseModel } from '../../_base/crud'; + +export class Permission extends BaseModel { + id: number; + title: string; + level: number; + parentId: number; + isSelected: boolean; + name: string; + _children: Permission[]; + + clear(): void { + this.id = undefined; + this.title = ''; + this.level = 1; + this.parentId = undefined; + this.isSelected = false; + this.name = ''; + this._children = []; + } +} diff --git a/src/app/core/auth/_models/role.model.ts b/src/app/core/auth/_models/role.model.ts new file mode 100644 index 0000000..3f0f745 --- /dev/null +++ b/src/app/core/auth/_models/role.model.ts @@ -0,0 +1,15 @@ +import { BaseModel } from '../../_base/crud'; + +export class Role extends BaseModel { + id: number; + title: string; + permissions: number[]; + isCoreRole = false; + + clear(): void { + this.id = undefined; + this.title = ''; + this.permissions = []; + this.isCoreRole = false; + } +} diff --git a/src/app/core/auth/_models/social-networks.model.ts b/src/app/core/auth/_models/social-networks.model.ts new file mode 100644 index 0000000..95b409d --- /dev/null +++ b/src/app/core/auth/_models/social-networks.model.ts @@ -0,0 +1,13 @@ +export class SocialNetworks { + linkedIn: string; + facebook: string; + twitter: string; + instagram: string; + + clear() { + this.linkedIn = ''; + this.facebook = ''; + this.twitter = ''; + this.instagram = ''; + } +} diff --git a/src/app/core/auth/_models/user.model.ts b/src/app/core/auth/_models/user.model.ts new file mode 100644 index 0000000..600b6ed --- /dev/null +++ b/src/app/core/auth/_models/user.model.ts @@ -0,0 +1,39 @@ +import { BaseModel } from '../../_base/crud'; +import { Address } from './address.model'; +import { SocialNetworks } from './social-networks.model'; + +export class User extends BaseModel { + id: number; + username: string; + password: string; + email: string; + accessToken: string; + refreshToken: string; + roles: number[]; + pic: string; + fullname: string; + occupation: string; + companyName: string; + phone: string; + address: Address; + socialNetworks: SocialNetworks; + + clear(): void { + this.id = undefined; + this.username = ''; + this.password = ''; + this.email = ''; + this.roles = []; + this.fullname = ''; + this.accessToken = 'access-token-' + Math.random(); + this.refreshToken = 'access-token-' + Math.random(); + this.pic = './assets/media/users/default.jpg'; + this.occupation = ''; + this.companyName = ''; + this.phone = ''; + this.address = new Address(); + this.address.clear(); + this.socialNetworks = new SocialNetworks(); + this.socialNetworks.clear(); + } +} diff --git a/src/app/core/auth/_reducers/auth.reducers.ts b/src/app/core/auth/_reducers/auth.reducers.ts new file mode 100644 index 0000000..84398e5 --- /dev/null +++ b/src/app/core/auth/_reducers/auth.reducers.ts @@ -0,0 +1,57 @@ +// Actions +import { AuthActions, AuthActionTypes } from '../_actions/auth.actions'; +// Models +import { User } from '../_models/user.model'; + +export interface AuthState { + loggedIn: boolean; + authToken: string; + user: User; + isUserLoaded: boolean; +} + +export const initialAuthState: AuthState = { + loggedIn: false, + authToken: undefined, + user: undefined, + isUserLoaded: false +}; + +export function authReducer(state = initialAuthState, action: AuthActions): AuthState { + switch (action.type) { + case AuthActionTypes.Login: { + const _token: string = action.payload.authToken; + return { + loggedIn: true, + authToken: _token, + user: undefined, + isUserLoaded: false + }; + } + + case AuthActionTypes.Register: { + const _token: string = action.payload.authToken; + return { + loggedIn: true, + authToken: _token, + user: undefined, + isUserLoaded: false + }; + } + + case AuthActionTypes.Logout: + return initialAuthState; + + case AuthActionTypes.UserLoaded: { + const _user: User = action.payload.user; + return { + ...state, + user: _user, + isUserLoaded: true + }; + } + + default: + return state; + } +} diff --git a/src/app/core/auth/_reducers/permission.reducers.ts b/src/app/core/auth/_reducers/permission.reducers.ts new file mode 100644 index 0000000..5ad4b9b --- /dev/null +++ b/src/app/core/auth/_reducers/permission.reducers.ts @@ -0,0 +1,42 @@ +// NGRX +import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity'; +import { createFeatureSelector } from '@ngrx/store'; +// Actions +import { PermissionActionTypes, PermissionActions } from '../_actions/permission.actions'; +// Models +import { Permission } from '../_models/permission.model'; + +export interface PermissionsState extends EntityState { + _isAllPermissionsLoaded: boolean; +} + +export const adapter: EntityAdapter = createEntityAdapter(); + +export const initialPermissionsState: PermissionsState = adapter.getInitialState({ + _isAllPermissionsLoaded: false +}); + +export function permissionsReducer(state = initialPermissionsState, action: PermissionActions): PermissionsState { + switch (action.type) { + case PermissionActionTypes.AllPermissionsRequested: + return {...state, + _isAllPermissionsLoaded: false + }; + case PermissionActionTypes.AllPermissionsLoaded: + return adapter.addAll(action.payload.permissions, { + ...state, + _isAllPermissionsLoaded: true + }); + default: + return state; + } +} + +export const getRoleState = createFeatureSelector('permissions'); + +export const { + selectAll, + selectEntities, + selectIds, + selectTotal +} = adapter.getSelectors(); diff --git a/src/app/core/auth/_reducers/role.reducers.ts b/src/app/core/auth/_reducers/role.reducers.ts new file mode 100644 index 0000000..a51ea58 --- /dev/null +++ b/src/app/core/auth/_reducers/role.reducers.ts @@ -0,0 +1,72 @@ +// NGRX +import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity'; +// Actions +import { RoleActions, RoleActionTypes } from '../_actions/role.actions'; +// Models +import { Role } from '../_models/role.model'; +import { QueryParamsModel } from '../../_base/crud'; + +export interface RolesState extends EntityState { + isAllRolesLoaded: boolean; + queryRowsCount: number; + queryResult: Role[]; + lastCreatedRoleId: number; + listLoading: boolean; + actionsloading: boolean; + lastQuery: QueryParamsModel; + showInitWaitingMessage: boolean; +} + +export const adapter: EntityAdapter = createEntityAdapter(); + +export const initialRolesState: RolesState = adapter.getInitialState({ + isAllRolesLoaded: false, + queryRowsCount: 0, + queryResult: [], + lastCreatedRoleId: undefined, + listLoading: false, + actionsloading: false, + lastQuery: new QueryParamsModel({}), + showInitWaitingMessage: true +}); + +export function rolesReducer(state = initialRolesState, action: RoleActions): RolesState { + switch (action.type) { + case RoleActionTypes.RolesPageToggleLoading: return { + ...state, listLoading: action.payload.isLoading, lastCreatedRoleId: undefined + }; + case RoleActionTypes.RolesActionToggleLoading: return { + ...state, actionsloading: action.payload.isLoading + }; + case RoleActionTypes.RoleOnServerCreated: return { + ...state + }; + case RoleActionTypes.RoleCreated: return adapter.addOne(action.payload.role, { + ...state, lastCreatedRoleId: action.payload.role.id + }); + case RoleActionTypes.RoleUpdated: return adapter.updateOne(action.payload.partialrole, state); + case RoleActionTypes.RoleDeleted: return adapter.removeOne(action.payload.id, state); + case RoleActionTypes.AllRolesLoaded: return adapter.addAll(action.payload.roles, { + ...state, isAllRolesLoaded: true + }); + case RoleActionTypes.RolesPageCancelled: return { + ...state, listLoading: false, queryRowsCount: 0, queryResult: [], lastQuery: new QueryParamsModel({}) + }; + case RoleActionTypes.RolesPageLoaded: return adapter.addMany(action.payload.roles, { + ...initialRolesState, + listLoading: false, + queryRowsCount: action.payload.totalCount, + queryResult: action.payload.roles, + lastQuery: action.payload.page, + showInitWaitingMessage: false + }); + default: return state; + } +} + +export const { + selectAll, + selectEntities, + selectIds, + selectTotal +} = adapter.getSelectors(); diff --git a/src/app/core/auth/_reducers/user.reducers.ts b/src/app/core/auth/_reducers/user.reducers.ts new file mode 100644 index 0000000..83965b3 --- /dev/null +++ b/src/app/core/auth/_reducers/user.reducers.ts @@ -0,0 +1,71 @@ +// NGRX +import { createFeatureSelector } from '@ngrx/store'; +import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity'; +// Actions +import { UserActions, UserActionTypes } from '../_actions/user.actions'; +// CRUD +import { QueryParamsModel } from '../../_base/crud'; +// Models +import { User } from '../_models/user.model'; + +// tslint:disable-next-line:no-empty-interface +export interface UsersState extends EntityState { + listLoading: boolean; + actionsloading: boolean; + totalCount: number; + lastCreatedUserId: number; + lastQuery: QueryParamsModel; + showInitWaitingMessage: boolean; +} + +export const adapter: EntityAdapter = createEntityAdapter(); + +export const initialUsersState: UsersState = adapter.getInitialState({ + listLoading: false, + actionsloading: false, + totalCount: 0, + lastQuery: new QueryParamsModel({}), + lastCreatedUserId: undefined, + showInitWaitingMessage: true +}); + +export function usersReducer(state = initialUsersState, action: UserActions): UsersState { + switch (action.type) { + case UserActionTypes.UsersPageToggleLoading: return { + ...state, listLoading: action.payload.isLoading, lastCreatedUserId: undefined + }; + case UserActionTypes.UsersActionToggleLoading: return { + ...state, actionsloading: action.payload.isLoading + }; + case UserActionTypes.UserOnServerCreated: return { + ...state + }; + case UserActionTypes.UserCreated: return adapter.addOne(action.payload.user, { + ...state, lastCreatedUserId: action.payload.user.id + }); + case UserActionTypes.UserUpdated: return adapter.updateOne(action.payload.partialUser, state); + case UserActionTypes.UserDeleted: return adapter.removeOne(action.payload.id, state); + case UserActionTypes.UsersPageCancelled: return { + ...state, listLoading: false, lastQuery: new QueryParamsModel({}) + }; + case UserActionTypes.UsersPageLoaded: { + return adapter.addMany(action.payload.users, { + ...initialUsersState, + totalCount: action.payload.totalCount, + lastQuery: action.payload.page, + listLoading: false, + showInitWaitingMessage: false + }); + } + default: return state; + } +} + +export const getUserState = createFeatureSelector('users'); + +export const { + selectAll, + selectEntities, + selectIds, + selectTotal +} = adapter.getSelectors(); diff --git a/src/app/core/auth/_selectors/auth.selectors.ts b/src/app/core/auth/_selectors/auth.selectors.ts new file mode 100644 index 0000000..0ced0cb --- /dev/null +++ b/src/app/core/auth/_selectors/auth.selectors.ts @@ -0,0 +1,100 @@ +// NGRX +import { createSelector } from '@ngrx/store'; +// Lodash +import { each, find, some } from 'lodash'; +// Selectors +import { selectAllRoles } from './role.selectors'; +import { selectAllPermissions } from './permission.selectors'; +// Models +import { Role } from '../_models/role.model'; +import { Permission } from '../_models/permission.model'; + +export const selectAuthState = state => state.auth; + +export const isLoggedIn = createSelector( + selectAuthState, + auth => auth.loggedIn +); + +export const isLoggedOut = createSelector( + isLoggedIn, + loggedIn => !loggedIn +); + + +export const currentAuthToken = createSelector( + selectAuthState, + auth => auth.authToken +); + +export const isUserLoaded = createSelector( + selectAuthState, + auth => auth.isUserLoaded +); + +export const currentUser = createSelector( + selectAuthState, + auth => auth.user +); + +export const currentUserRoleIds = createSelector( + currentUser, + user => { + if (!user) { + return []; + } + + return user.roles; + } +); + +export const currentUserPermissionsIds = createSelector( + currentUserRoleIds, + selectAllRoles, + (userRoleIds: number[], allRoles: Role[]) => { + const result = getPermissionsIdsFrom(userRoleIds, allRoles); + return result; + } +); + +export const checkHasUserPermission = (permissionId: number) => createSelector( + currentUserPermissionsIds, + (ids: number[]) => { + return ids.some(id => id === permissionId); + } +); + +export const currentUserPermissions = createSelector( + currentUserPermissionsIds, + selectAllPermissions, + (permissionIds: number[], allPermissions: Permission[]) => { + const result: Permission[] = []; + each(permissionIds, id => { + const userPermission = find(allPermissions, elem => elem.id === id); + if (userPermission) { + result.push(userPermission); + } + }); + return result; + } +); + +function getPermissionsIdsFrom(userRolesIds: number[] = [], allRoles: Role[] = []): number[] { + const userRoles: Role[] = []; + each(userRolesIds, (_id: number) => { + const userRole = find(allRoles, (_role: Role) => _role.id === _id); + if (userRole) { + userRoles.push(userRole); + } + }); + + const result: number[] = []; + each(userRoles, (_role: Role) => { + each(_role.permissions, id => { + if (!some(result, _id => _id === id)) { + result.push(id); + } + }); + }); + return result; +} diff --git a/src/app/core/auth/_selectors/permission.selectors.ts b/src/app/core/auth/_selectors/permission.selectors.ts new file mode 100644 index 0000000..c5db85a --- /dev/null +++ b/src/app/core/auth/_selectors/permission.selectors.ts @@ -0,0 +1,27 @@ +// NGRX +import { createFeatureSelector, createSelector } from '@ngrx/store'; +// State +import { PermissionsState } from '../_reducers/permission.reducers'; +import * as fromPermissions from '../_reducers/permission.reducers'; + +export const selectPermissionsState = createFeatureSelector('permissions'); + +export const selectPermissionById = (permissionId: number) => createSelector( + selectPermissionsState, + ps => ps.entities[permissionId] +); + +export const selectAllPermissions = createSelector( + selectPermissionsState, + fromPermissions.selectAll +); + +export const selectAllPermissionsIds = createSelector( + selectPermissionsState, + fromPermissions.selectIds +); + +export const allPermissionsLoaded = createSelector( + selectPermissionsState, + ps => ps._isAllPermissionsLoaded +); diff --git a/src/app/core/auth/_selectors/role.selectors.ts b/src/app/core/auth/_selectors/role.selectors.ts new file mode 100644 index 0000000..1993cdd --- /dev/null +++ b/src/app/core/auth/_selectors/role.selectors.ts @@ -0,0 +1,68 @@ +import { Role } from './../_models/role.model'; + +// NGRX +import { createFeatureSelector, createSelector } from '@ngrx/store'; +// CRUD +import { QueryResultsModel, HttpExtenstionsModel } from '../../_base/crud'; +// State +import { RolesState } from '../_reducers/role.reducers'; +import * as fromRole from '../_reducers/role.reducers'; +import { each } from 'lodash'; + +export const selectRolesState = createFeatureSelector('roles'); + +export const selectRoleById = (roleId: number) => createSelector( + selectRolesState, + rolesState => rolesState.entities[roleId] +); + +export const selectAllRoles = createSelector( + selectRolesState, + fromRole.selectAll +); + +export const selectAllRolesIds = createSelector( + selectRolesState, + fromRole.selectIds +); + +export const allRolesLoaded = createSelector( + selectRolesState, + rolesState => rolesState.isAllRolesLoaded +); + + +export const selectRolesPageLoading = createSelector( + selectRolesState, + rolesState => rolesState.listLoading +); + +export const selectRolesActionLoading = createSelector( + selectRolesState, + rolesState => rolesState.actionsloading +); + +export const selectLastCreatedRoleId = createSelector( + selectRolesState, + rolesState => rolesState.lastCreatedRoleId +); + +export const selectRolesShowInitWaitingMessage = createSelector( + selectRolesState, + rolesState => rolesState.showInitWaitingMessage +); + + +export const selectQueryResult = createSelector( + selectRolesState, + rolesState => { + const items: Role[] = []; + each(rolesState.entities, element => { + items.push(element); + }); + const httpExtension = new HttpExtenstionsModel(); + const result: Role[] = httpExtension.sortArray(items, rolesState.lastQuery.sortField, rolesState.lastQuery.sortOrder); + + return new QueryResultsModel(rolesState.queryResult, rolesState.queryRowsCount); + } +); diff --git a/src/app/core/auth/_selectors/user.selectors.ts b/src/app/core/auth/_selectors/user.selectors.ts new file mode 100644 index 0000000..64640ed --- /dev/null +++ b/src/app/core/auth/_selectors/user.selectors.ts @@ -0,0 +1,67 @@ +// NGRX +import { createFeatureSelector, createSelector } from '@ngrx/store'; +// CRUD +import { QueryResultsModel, HttpExtenstionsModel } from '../../_base/crud'; +// State +import { UsersState } from '../_reducers/user.reducers'; +import { each } from 'lodash'; +import { User } from '../_models/user.model'; + + +export const selectUsersState = createFeatureSelector('users'); + +export const selectUserById = (userId: number) => createSelector( + selectUsersState, + usersState => usersState.entities[userId] +); + +export const selectUsersPageLoading = createSelector( + selectUsersState, + usersState => { + return usersState.listLoading; + } +); + +export const selectUsersActionLoading = createSelector( + selectUsersState, + usersState => usersState.actionsloading +); + +export const selectLastCreatedUserId = createSelector( + selectUsersState, + usersState => usersState.lastCreatedUserId +); + +export const selectUsersPageLastQuery = createSelector( + selectUsersState, + usersState => usersState.lastQuery +); + +export const selectUsersInStore = createSelector( + selectUsersState, + usersState => { + const items: User[] = []; + each(usersState.entities, element => { + items.push(element); + }); + const httpExtension = new HttpExtenstionsModel(); + const result: User[] = httpExtension.sortArray(items, usersState.lastQuery.sortField, usersState.lastQuery.sortOrder); + return new QueryResultsModel(result, usersState.totalCount, ''); + } +); + +export const selectUsersShowInitWaitingMessage = createSelector( + selectUsersState, + usersState => usersState.showInitWaitingMessage +); + +export const selectHasUsersInStore = createSelector( + selectUsersState, + queryResult => { + if (!queryResult.totalCount) { + return false; + } + + return true; + } +); diff --git a/src/app/core/auth/_server/auth.data-context.ts b/src/app/core/auth/_server/auth.data-context.ts new file mode 100644 index 0000000..caa44ed --- /dev/null +++ b/src/app/core/auth/_server/auth.data-context.ts @@ -0,0 +1,10 @@ +import { UsersTable } from './users.table'; +import { PermissionsTable } from './permissions.table'; +import { RolesTable } from './roles.table'; + +// Wrapper class +export class AuthDataContext { + public static users: any = UsersTable.users; + public static roles: any = RolesTable.roles; + public static permissions = PermissionsTable.permissions; +} diff --git a/src/app/core/auth/_server/permissions.table.ts b/src/app/core/auth/_server/permissions.table.ts new file mode 100644 index 0000000..923e603 --- /dev/null +++ b/src/app/core/auth/_server/permissions.table.ts @@ -0,0 +1,85 @@ +export class PermissionsTable { + public static permissions: any = [ + { + id: 1, + name: 'accessToECommerceModule', + level: 1, + title: 'eCommerce module' + }, + { + id: 2, + name: 'accessToAuthModule', + level: 1, + title: 'Users Management module' + }, + { + id: 3, + name: 'accessToMailModule', + level: 1, + title: 'Mail module' + }, + { + id: 4, + name: 'canReadECommerceData', + level: 2, + parentId: 1, + title: 'Read' + }, + { + id: 5, + name: 'canEditECommerceData', + level: 2, + parentId: 1, + title: 'Edit' + }, + { + id: 6, + name: 'canDeleteECommerceData', + level: 2, + parentId: 1, + title: 'Delete' + }, + { + id: 7, + name: 'canReadAuthData', + level: 2, + parentId: 2, + title: 'Read' + }, + { + id: 8, + name: 'canEditAuthData', + level: 2, + parentId: 2, + title: 'Edit' + }, + { + id: 9, + name: 'canDeleteAuthData', + level: 2, + parentId: 2, + title: 'Delete' + }, + { + id: 10, + name: 'canReadMailData', + level: 2, + parentId: 3, + title: 'Read' + }, + { + id: 11, + name: 'canEditMailData', + level: 2, + parentId: 3, + title: 'Edit' + }, + { + id: 12, + name: 'canDeleteMailData', + level: 2, + parentId: 3, + title: 'Delete' + }, + ]; +} diff --git a/src/app/core/auth/_server/roles.table.ts b/src/app/core/auth/_server/roles.table.ts new file mode 100644 index 0000000..74d3296 --- /dev/null +++ b/src/app/core/auth/_server/roles.table.ts @@ -0,0 +1,22 @@ +export class RolesTable { + public static roles: any = [ + { + id: 1, + title: 'Administrator', + isCoreRole: true, + permissions: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] + }, + { + id: 2, + title: 'Manager', + isCoreRole: false, + permissions: [3, 4, 10] + }, + { + id: 3, + title: 'Guest', + isCoreRole: false, + permissions: [] + } + ]; +} diff --git a/src/app/core/auth/_server/users.table.ts b/src/app/core/auth/_server/users.table.ts new file mode 100644 index 0000000..5878f5a --- /dev/null +++ b/src/app/core/auth/_server/users.table.ts @@ -0,0 +1,90 @@ +export class UsersTable { + public static users: any = [ + { + id: 1, + username: 'admin', + password: 'demo', + email: 'admin@demo.com', + accessToken: 'access-token-8f3ae836da744329a6f93bf20594b5cc', + refreshToken: 'access-token-f8c137a2c98743f48b643e71161d90aa', + roles: [1], // Administrator + pic: './assets/media/users/300_25.jpg', + fullname: 'Sean', + occupation: 'CEO', + companyName: 'Keenthemes', + phone: '456669067890', + address: { + addressLine: 'L-12-20 Vertex, Cybersquare', + city: 'San Francisco', + state: 'California', + postCode: '45000' + }, + socialNetworks: { + linkedIn: 'https://linkedin.com/admin', + facebook: 'https://facebook.com/admin', + twitter: 'https://twitter.com/admin', + instagram: 'https://instagram.com/admin' + } + }, + { + id: 2, + username: 'user', + password: 'demo', + email: 'user@demo.com', + accessToken: 'access-token-6829bba69dd3421d8762-991e9e806dbf', + refreshToken: 'access-token-f8e4c61a318e4d618b6c199ef96b9e55', + roles: [2], // Manager + pic: './assets/media/users/100_2.jpg', + fullname: 'Megan', + occupation: 'Deputy Head of Keenthemes in New York office', + companyName: 'Keenthemes', + phone: '456669067891', + address: { + addressLine: '3487 Ingram Road', + city: 'Greensboro', + state: 'North Carolina', + postCode: '27409' + }, + socialNetworks: { + linkedIn: 'https://linkedin.com/user', + facebook: 'https://facebook.com/user', + twitter: 'https://twitter.com/user', + instagram: 'https://instagram.com/user' + } + }, + { + id: 3, + username: 'guest', + password: 'demo', + email: 'guest@demo.com', + accessToken: 'access-token-d2dff7b82f784de584b60964abbe45b9', + refreshToken: 'access-token-c999ccfe74aa40d0aa1a64c5e620c1a5', + roles: [3], // Guest + pic: './assets/media/users/default.jpg', + fullname: 'Ginobili Maccari', + occupation: 'CFO', + companyName: 'Keenthemes', + phone: '456669067892', + address: { + addressLine: '1467 Griffin Street', + city: 'Phoenix', + state: 'Arizona', + postCode: '85012' + }, + socialNetworks: { + linkedIn: 'https://linkedin.com/guest', + facebook: 'https://facebook.com/guest', + twitter: 'https://twitter.com/guest', + instagram: 'https://instagram.com/guest' + } + } + ]; + + public static tokens: any = [ + { + id: 1, + accessToken: 'access-token-' + Math.random(), + refreshToken: 'access-token-' + Math.random() + } + ]; +} diff --git a/src/app/core/auth/_services/auth.service.ts b/src/app/core/auth/_services/auth.service.ts new file mode 100644 index 0000000..9df2026 --- /dev/null +++ b/src/app/core/auth/_services/auth.service.ts @@ -0,0 +1,220 @@ +import {EventEmitter, Injectable, Output} from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Observable, of } from 'rxjs'; +import { User } from '../_models/user.model'; +import { Permission } from '../_models/permission.model'; +import { Role } from '../_models/role.model'; +import {catchError, map, tap} from 'rxjs/operators'; +import { QueryParamsModel, QueryResultsModel } from '../../_base/crud'; +import { environment } from '../../../../environments/environment'; +import {ApiBase} from "../../api/api-base"; +import {AccessData} from "../_models/access-data"; +import {TokenStorage} from "./token-storage.service"; + +const API_USERS_URL = 'api/users'; +const API_PERMISSION_URL = 'api/permissions'; +const API_ROLES_URL = 'api/roles'; + +@Injectable() +export class AuthService extends ApiBase { + @Output() errorEvent: EventEmitter = new EventEmitter(true); + constructor(private http: HttpClient, private tokenStorage: TokenStorage) { + super(); + } + + /** + * Get user roles + * @returns {Observable} + */ + public getUser(): any { + return this.tokenStorage.getUser(); + } + + public getPermission() : any { + return this.tokenStorage.getUserRoles() + } + + /** + * Logout + */ + public logout(refresh?: boolean): void { + this.tokenStorage.clear(); + if (refresh) { + location.reload(); + } + } + + // Authentication/Authorization + login(email: string, password: string): Observable { + let headers = new HttpHeaders({ + 'Application': 'WEB' }); + let options = { headers: headers }; + return this.http.post(environment.API + 'login', {email: email, password: password, options}).pipe( + map((result: any) => { + if (result instanceof Array) { + return result.pop(); + } + return result; + }), + tap(this.saveAccessData.bind(this)), + catchError(this.handleError('login', [])) + ); + } + + private saveAccessData(accessData: AccessData) { + if (typeof accessData !== 'undefined') { + this.tokenStorage + .setAccessToken(accessData.token) + .setRefreshToken(accessData.token) + .setUserRoles(accessData.role.permissions) + .setUser(accessData.user); + } + } + + getUserByToken(): Observable { + const userToken = localStorage.getItem(environment.authTokenKey); + const httpHeaders = new HttpHeaders(); + httpHeaders.set('Authorization', 'Bearer ' + userToken); + return this.http.get(API_USERS_URL, { headers: httpHeaders }); + } + + refreshToken(): Observable { + const userToken = localStorage.getItem('accessTokenDrenax'); + const httpHeaders = new HttpHeaders(); + httpHeaders.set('Authorization', 'Bearer ' + userToken); + return this.http.get(environment.API + 'refresh', { headers: httpHeaders }).pipe( + map((result: any) => { + if (result instanceof Array) { + return result.pop(); + } + return result; + }), + tap(this.setToken.bind(this)), + catchError(this.handleError('refresh', [])) + ); + } + + setToken(accessData: AccessData){ + if (typeof accessData !== 'undefined') { + this.tokenStorage + .setAccessToken(accessData.token) + .setRefreshToken(accessData.token); + } + } + + register(user: User): Observable { + const httpHeaders = new HttpHeaders(); + httpHeaders.set('Content-Type', 'application/json'); + return this.http.post(API_USERS_URL, user, { headers: httpHeaders }) + .pipe( + map((res: User) => { + return res; + }), + catchError(err => { + return null; + }) + ); + } + + /* + * Submit forgot password request + * + * @param {string} email + * @returns {Observable} + */ + public requestPassword(email: string): Observable { + return this.http.get(API_USERS_URL + '/forgot?=' + email) + .pipe(catchError(this.handleError('forgot-password', [])) + ); + } + + + getAllUsers(): Observable { + return this.http.get(API_USERS_URL); + } + + getUserById(userId: number): Observable { + return this.http.get(API_USERS_URL + `/${userId}`); + } + + + // DELETE => delete the user from the server + deleteUser(userId: number) { + const url = `${API_USERS_URL}/${userId}`; + return this.http.delete(url); + } + + // UPDATE => PUT: update the user on the server + updateUser(_user: User): Observable { + const httpHeaders = new HttpHeaders(); + httpHeaders.set('Content-Type', 'application/json'); + return this.http.put(API_USERS_URL, _user, { headers: httpHeaders }); + } + + // CREATE => POST: add a new user to the server + createUser(user: User): Observable { + const httpHeaders = new HttpHeaders(); + httpHeaders.set('Content-Type', 'application/json'); + return this.http.post(API_USERS_URL, user, { headers: httpHeaders}); + } + + // Method from server should return QueryResultsModel(items: any[], totalsCount: number) + // items => filtered/sorted result + findUsers(queryParams: QueryParamsModel): Observable { + const httpHeaders = new HttpHeaders(); + httpHeaders.set('Content-Type', 'application/json'); + return this.http.post(API_USERS_URL + '/findUsers', queryParams, { headers: httpHeaders}); + } + + // Permission + getAllPermissions(): Observable { + return this.http.get(API_PERMISSION_URL); + } + + getRolePermissions(roleId: number): Observable { + return this.http.get(API_PERMISSION_URL + '/getRolePermission?=' + roleId); + } + + // Roles + getAllRoles(): Observable { + return this.http.get(API_ROLES_URL); + } + + getRoleById(roleId: number): Observable { + return this.http.get(API_ROLES_URL + `/${roleId}`); + } + + // CREATE => POST: add a new role to the server + createRole(role: Role): Observable { + // Note: Add headers if needed (tokens/bearer) + const httpHeaders = new HttpHeaders(); + httpHeaders.set('Content-Type', 'application/json'); + return this.http.post(API_ROLES_URL, role, { headers: httpHeaders}); + } + + // UPDATE => PUT: update the role on the server + updateRole(role: Role): Observable { + const httpHeaders = new HttpHeaders(); + httpHeaders.set('Content-Type', 'application/json'); + return this.http.put(API_ROLES_URL, role, { headers: httpHeaders }); + } + + // DELETE => delete the role from the server + deleteRole(roleId: number): Observable { + const url = `${API_ROLES_URL}/${roleId}`; + return this.http.delete(url); + } + + // Check Role Before deletion + isRoleAssignedToUsers(roleId: number): Observable { + return this.http.get(API_ROLES_URL + '/checkIsRollAssignedToUser?roleId=' + roleId); + } + + findRoles(queryParams: QueryParamsModel): Observable { + // This code imitates server calls + const httpHeaders = new HttpHeaders(); + httpHeaders.set('Content-Type', 'application/json'); + return this.http.post(API_ROLES_URL + '/findRoles', queryParams, { headers: httpHeaders}); + } + +} diff --git a/src/app/core/auth/_services/index.ts b/src/app/core/auth/_services/index.ts new file mode 100644 index 0000000..a584764 --- /dev/null +++ b/src/app/core/auth/_services/index.ts @@ -0,0 +1,2 @@ +export { AuthService } from './auth.service'; // You have to comment this, when your real back-end is done +// export { AuthService } from './auth.service'; // You have to uncomment this, when your real back-end is done diff --git a/src/app/core/auth/_services/token-storage.service.ts b/src/app/core/auth/_services/token-storage.service.ts new file mode 100644 index 0000000..ba8a7c4 --- /dev/null +++ b/src/app/core/auth/_services/token-storage.service.ts @@ -0,0 +1,104 @@ +import { Injectable } from '@angular/core'; +import { Observable, of } from 'rxjs'; + +@Injectable() +export class TokenStorage { + /** + * Get access token + * @returns {Observable} + */ + public getAccessToken(): string { + const token: any = localStorage.getItem('accessTokenDrenax'); + try { + return token; + } catch (e) {} + } + + /** + * Get refresh token + * @returns {Observable} + */ + public getRefreshToken(): Observable { + const token: string = localStorage.getItem('refreshTokenDrenax'); + return of(token); + } + + /** + * Get user roles in JSON string + * @returns {Observable} + */ + public getUserRoles(): Observable { + const roles: any = localStorage.getItem('userRolesDrenax'); + try { + return JSON.parse(roles) + } catch (e) {} + } + + /** + * Get user in JSON string + * @returns {Observable} + */ + public getUser(): any { + const user: any = localStorage.getItem('userDrenax'); + + try { + return JSON.parse(user); + } catch (e) {} + } + + /** + * Set access token + * @returns {TokenStorage} + */ + public setAccessToken(token: string): TokenStorage { + localStorage.setItem('accessTokenDrenax', token); + + return this; + } + + /** + * Set refresh token + * @returns {TokenStorage} + */ + public setRefreshToken(token: string): TokenStorage { + localStorage.setItem('refreshTokenDrenax', token); + + return this; + } + + /** + * Set user roles + * @param roles + * @returns {TokenStorage} + */ + public setUserRoles(roles: any): any { + if (roles != null) { + localStorage.setItem('userRolesDrenax', JSON.stringify(roles)); + } + + return this; + } + + /** + * Set user + * @param user + * @returns {TokenStorage} + */ + public setUser(user: any): any { + if (user != null) { + localStorage.setItem('userDrenax', JSON.stringify(user)); + } + + return this; + } + + /** + * Remove tokens + */ + public clear() { + localStorage.removeItem('accessTokenDrenax'); + localStorage.removeItem('refreshTokenDrenax'); + localStorage.removeItem('userRolesDrenax'); + localStorage.removeItem('userDrenax'); + } +} diff --git a/src/app/core/auth/auth-notice/auth-notice.interface.ts b/src/app/core/auth/auth-notice/auth-notice.interface.ts new file mode 100644 index 0000000..f0eb323 --- /dev/null +++ b/src/app/core/auth/auth-notice/auth-notice.interface.ts @@ -0,0 +1,4 @@ +export interface AuthNotice { + type?: string; + message: string; +} diff --git a/src/app/core/auth/auth-notice/auth-notice.service.ts b/src/app/core/auth/auth-notice/auth-notice.service.ts new file mode 100644 index 0000000..32ff37e --- /dev/null +++ b/src/app/core/auth/auth-notice/auth-notice.service.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@angular/core'; +import { BehaviorSubject } from 'rxjs'; +import { AuthNotice } from './auth-notice.interface'; + +@Injectable({ + providedIn: 'root' +}) +export class AuthNoticeService { + onNoticeChanged$: BehaviorSubject; + + constructor() { + this.onNoticeChanged$ = new BehaviorSubject(null); + } + + setNotice(message: string, type?: string) { + const notice: AuthNotice = { + message, + type + }; + this.onNoticeChanged$.next(notice); + } +} diff --git a/src/app/core/auth/index.ts b/src/app/core/auth/index.ts new file mode 100644 index 0000000..3cc1484 --- /dev/null +++ b/src/app/core/auth/index.ts @@ -0,0 +1,114 @@ +// SERVICES +export { AuthService } from './_services'; +export { AuthNoticeService } from './auth-notice/auth-notice.service'; + +// DATA SOURCERS +export { RolesDataSource } from './_data-sources/roles.datasource'; +export { UsersDataSource } from './_data-sources/users.datasource'; + +// ACTIONS +export { + Login, + Logout, + Register, + UserRequested, + UserLoaded, + AuthActionTypes, + AuthActions +} from './_actions/auth.actions'; +export { + AllPermissionsRequested, + AllPermissionsLoaded, + PermissionActionTypes, + PermissionActions +} from './_actions/permission.actions'; +export { + RoleOnServerCreated, + RoleCreated, + RoleUpdated, + RoleDeleted, + RolesPageRequested, + RolesPageLoaded, + RolesPageCancelled, + AllRolesLoaded, + AllRolesRequested, + RoleActionTypes, + RoleActions +} from './_actions/role.actions'; +export { + UserCreated, + UserUpdated, + UserDeleted, + UserOnServerCreated, + UsersPageLoaded, + UsersPageCancelled, + UsersPageToggleLoading, + UsersPageRequested, + UsersActionToggleLoading +} from './_actions/user.actions'; + +// EFFECTS +export { AuthEffects } from './_effects/auth.effects'; +export { PermissionEffects } from './_effects/permission.effects'; +export { RoleEffects } from './_effects/role.effects'; +export { UserEffects } from './_effects/user.effects'; + +// REDUCERS +export { authReducer } from './_reducers/auth.reducers'; +export { permissionsReducer } from './_reducers/permission.reducers'; +export { rolesReducer } from './_reducers/role.reducers'; +export { usersReducer } from './_reducers/user.reducers'; + +// SELECTORS +export { + isLoggedIn, + isLoggedOut, + isUserLoaded, + currentAuthToken, + currentUser, + currentUserRoleIds, + currentUserPermissionsIds, + currentUserPermissions, + checkHasUserPermission +} from './_selectors/auth.selectors'; +export { + selectPermissionById, + selectAllPermissions, + selectAllPermissionsIds, + allPermissionsLoaded +} from './_selectors/permission.selectors'; +export { + selectRoleById, + selectAllRoles, + selectAllRolesIds, + allRolesLoaded, + selectLastCreatedRoleId, + selectRolesPageLoading, + selectQueryResult, + selectRolesActionLoading, + selectRolesShowInitWaitingMessage +} from './_selectors/role.selectors'; +export { + selectUserById, + selectUsersPageLoading, + selectLastCreatedUserId, + selectUsersInStore, + selectHasUsersInStore, + selectUsersPageLastQuery, + selectUsersActionLoading, + selectUsersShowInitWaitingMessage +} from './_selectors/user.selectors'; + +// GUARDS +export { AuthGuard } from './_guards/auth.guard'; +export { ModuleGuard } from './_guards/module.guard'; + +// MODELS +export { User } from './_models/user.model'; +export { Permission } from './_models/permission.model'; +export { Role } from './_models/role.model'; +export { Address } from './_models/address.model'; +export { SocialNetworks } from './_models/social-networks.model'; +export { AuthNotice } from './auth-notice/auth-notice.interface'; + +export { AuthDataContext } from './_server/auth.data-context'; diff --git a/src/app/core/auth/readme.txt b/src/app/core/auth/readme.txt new file mode 100644 index 0000000..ad674f0 --- /dev/null +++ b/src/app/core/auth/readme.txt @@ -0,0 +1,2 @@ +Our Auth module based on NGRX +More details => https://mherman.org/blog/authentication-in-angular-with-ngrx/ \ No newline at end of file diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts new file mode 100644 index 0000000..2b5dd23 --- /dev/null +++ b/src/app/core/core.module.ts @@ -0,0 +1,73 @@ +// Anglar +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +// Layout Directives +// Services +import { + ContentAnimateDirective, + FirstLetterPipe, + GetObjectPipe, + HeaderDirective, + JoinPipe, + MenuDirective, + OffcanvasDirective, + SafePipe, + ScrollTopDirective, + SparklineChartDirective, + StickyDirective, + TabClickEventDirective, + TimeElapsedPipe, + ToggleDirective +} from './_base/layout'; +import {CustomSanitizerPipe} from './custom-pipes/custom-sanitizer.pipe'; +import {FeedbackValidatorsResetComponent} from './api/feedback-validators-reset.component'; +import {FeedbackValidatorsComponent} from './api/feedback-validators.component'; +import {ValidatorsComponent} from './api/validators.component'; + +@NgModule({ + imports: [CommonModule], + declarations: [ + // directives + ScrollTopDirective, + HeaderDirective, + OffcanvasDirective, + ToggleDirective, + MenuDirective, + TabClickEventDirective, + SparklineChartDirective, + ContentAnimateDirective, + StickyDirective, + // pipes + TimeElapsedPipe, + JoinPipe, + GetObjectPipe, + SafePipe, + FirstLetterPipe, + CustomSanitizerPipe, + FeedbackValidatorsResetComponent, + FeedbackValidatorsComponent, + ValidatorsComponent + ], + exports: [ + // directives + ScrollTopDirective, + HeaderDirective, + OffcanvasDirective, + ToggleDirective, + MenuDirective, + TabClickEventDirective, + SparklineChartDirective, + ContentAnimateDirective, + StickyDirective, + // pipes + TimeElapsedPipe, + JoinPipe, + GetObjectPipe, + SafePipe, + FirstLetterPipe, + CustomSanitizerPipe + ], + providers: [] +}) +export class CoreModule { +} diff --git a/src/app/core/custom-pipes/custom-sanitizer.pipe.ts b/src/app/core/custom-pipes/custom-sanitizer.pipe.ts new file mode 100644 index 0000000..eee4060 --- /dev/null +++ b/src/app/core/custom-pipes/custom-sanitizer.pipe.ts @@ -0,0 +1,14 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { DomSanitizer } from '@angular/platform-browser'; + +@Pipe({ + name: 'custom_safe' +}) +export class CustomSanitizerPipe implements PipeTransform { + + constructor(private sanitizer: DomSanitizer) { } + transform(url) { + return this.sanitizer.bypassSecurityTrustResourceUrl(url); + } + +} diff --git a/src/app/core/e-commerce/_actions/customer.actions.ts b/src/app/core/e-commerce/_actions/customer.actions.ts new file mode 100644 index 0000000..5868b57 --- /dev/null +++ b/src/app/core/e-commerce/_actions/customer.actions.ts @@ -0,0 +1,93 @@ +// NGRX +import { Action } from '@ngrx/store'; +import { Update } from '@ngrx/entity'; +// CRUD +import { QueryParamsModel } from '../../_base/crud'; +// Models +import { CustomerModel } from '../_models/customer.model'; + +export enum CustomerActionTypes { + CustomerOnServerCreated = '[Edit Customer Dialog] Customer On Server Created', + CustomerCreated = '[Edit Customer Dialog] Customer Created', + CustomerUpdated = '[Edit Customer Dialog] Customer Updated', + CustomersStatusUpdated = '[Customer List Page] Customers Status Updated', + OneCustomerDeleted = '[Customers List Page] One Customer Deleted', + ManyCustomersDeleted = '[Customers List Page] Many Customer Deleted', + CustomersPageRequested = '[Customers List Page] Customers Page Requested', + CustomersPageLoaded = '[Customers API] Customers Page Loaded', + CustomersPageCancelled = '[Customers API] Customers Page Cancelled', + CustomersPageToggleLoading = '[Customers] Customers Page Toggle Loading', + CustomerActionToggleLoading = '[Customers] Customers Action Toggle Loading' +} + +export class CustomerOnServerCreated implements Action { + readonly type = CustomerActionTypes.CustomerOnServerCreated; + constructor(public payload: { customer: CustomerModel }) { } +} + +export class CustomerCreated implements Action { + readonly type = CustomerActionTypes.CustomerCreated; + constructor(public payload: { customer: CustomerModel }) { } +} + +export class CustomerUpdated implements Action { + readonly type = CustomerActionTypes.CustomerUpdated; + constructor(public payload: { + partialCustomer: Update, // For State update + customer: CustomerModel // For Server update (through service) + }) { } +} + +export class CustomersStatusUpdated implements Action { + readonly type = CustomerActionTypes.CustomersStatusUpdated; + constructor(public payload: { + customers: CustomerModel[], + status: number + }) { } +} + +export class OneCustomerDeleted implements Action { + readonly type = CustomerActionTypes.OneCustomerDeleted; + constructor(public payload: { id: number }) {} +} + +export class ManyCustomersDeleted implements Action { + readonly type = CustomerActionTypes.ManyCustomersDeleted; + constructor(public payload: { ids: number[] }) {} +} + +export class CustomersPageRequested implements Action { + readonly type = CustomerActionTypes.CustomersPageRequested; + constructor(public payload: { page: QueryParamsModel }) { } +} + +export class CustomersPageLoaded implements Action { + readonly type = CustomerActionTypes.CustomersPageLoaded; + constructor(public payload: { customers: CustomerModel[], totalCount: number, page: QueryParamsModel }) { } +} + +export class CustomersPageCancelled implements Action { + readonly type = CustomerActionTypes.CustomersPageCancelled; +} + +export class CustomersPageToggleLoading implements Action { + readonly type = CustomerActionTypes.CustomersPageToggleLoading; + constructor(public payload: { isLoading: boolean }) { } +} + +export class CustomerActionToggleLoading implements Action { + readonly type = CustomerActionTypes.CustomerActionToggleLoading; + constructor(public payload: { isLoading: boolean }) { } +} + +export type CustomerActions = CustomerOnServerCreated +| CustomerCreated +| CustomerUpdated +| CustomersStatusUpdated +| OneCustomerDeleted +| ManyCustomersDeleted +| CustomersPageRequested +| CustomersPageLoaded +| CustomersPageCancelled +| CustomersPageToggleLoading +| CustomerActionToggleLoading; diff --git a/src/app/core/e-commerce/_actions/product-remark.actions.ts b/src/app/core/e-commerce/_actions/product-remark.actions.ts new file mode 100644 index 0000000..d550358 --- /dev/null +++ b/src/app/core/e-commerce/_actions/product-remark.actions.ts @@ -0,0 +1,85 @@ +// NGRX +import { Action } from '@ngrx/store'; +import { Update } from '@ngrx/entity'; +// CRUD +import { QueryParamsModel } from '../../_base/crud'; +// Models +import { ProductRemarkModel } from '../_models/product-remark.model'; + +export enum ProductRemarkActionTypes { + ProductRemarkOnServerCreated = '[Edit ProductRemark Dialog] ProductRemark On Server Created', + ProductRemarkCreated = '[Edit ProductRemark Dialog] ProductRemark Created', + ProductRemarkUpdated = '[Edit ProductRemark Dialog] ProductRemark Updated', + ProductRemarkStoreUpdated = '[Edit ProductRemark Dialog] ProductRemark Updated | Only on storage', + OneProductRemarkDeleted = '[Product Remarks List Page] One Product Remark Deleted', + ManyProductRemarksDeleted = '[Product Remarks List Page] Many Product Remarks Deleted', + ProductRemarksPageRequested = '[Product Remarks List Page] Product Remarks Page Requested', + ProductRemarksPageLoaded = '[Product Remarks API] Product Remarks Page Loaded', + ProductRemarksPageCancelled = '[Product Remarks API] Product Remarks Page Cancelled', + ProductRemarksPageToggleLoading = '[Product Remarks] Product Remarks Page Toggle Loading' +} + +export class ProductRemarkOnServerCreated implements Action { + readonly type = ProductRemarkActionTypes.ProductRemarkOnServerCreated; + constructor(public payload: { productRemark: ProductRemarkModel }) { } +} + +export class ProductRemarkCreated implements Action { + readonly type = ProductRemarkActionTypes.ProductRemarkCreated; + constructor(public payload: { productRemark: ProductRemarkModel }) { } +} + +export class ProductRemarkUpdated implements Action { + readonly type = ProductRemarkActionTypes.ProductRemarkUpdated; + constructor(public payload: { + partialProductRemark: Update, // For State update + productRemark: ProductRemarkModel // For Server update (through service) + }) { } +} + +export class ProductRemarkStoreUpdated implements Action { + readonly type = ProductRemarkActionTypes.ProductRemarkStoreUpdated; + constructor(public payload: { + productRemark: Update, // For State update + }) { } +} + +export class OneProductRemarkDeleted implements Action { + readonly type = ProductRemarkActionTypes.OneProductRemarkDeleted; + constructor(public payload: { id: number }) {} +} + +export class ManyProductRemarksDeleted implements Action { + readonly type = ProductRemarkActionTypes.ManyProductRemarksDeleted; + constructor(public payload: { ids: number[] }) {} +} + +export class ProductRemarksPageRequested implements Action { + readonly type = ProductRemarkActionTypes.ProductRemarksPageRequested; + constructor(public payload: { page: QueryParamsModel, productId: number }) { } +} + +export class ProductRemarksPageLoaded implements Action { + readonly type = ProductRemarkActionTypes.ProductRemarksPageLoaded; + constructor(public payload: { productRemarks: ProductRemarkModel[], totalCount: number }) { } +} + +export class ProductRemarksPageCancelled implements Action { + readonly type = ProductRemarkActionTypes.ProductRemarksPageCancelled; +} + +export class ProductRemarksPageToggleLoading implements Action { + readonly type = ProductRemarkActionTypes.ProductRemarksPageToggleLoading; + constructor(public payload: { isLoading: boolean }) { } +} + +export type ProductRemarkActions = ProductRemarkOnServerCreated +| ProductRemarkStoreUpdated +| ProductRemarkCreated +| ProductRemarkUpdated +| OneProductRemarkDeleted +| ManyProductRemarksDeleted +| ProductRemarksPageRequested +| ProductRemarksPageLoaded +| ProductRemarksPageCancelled +| ProductRemarksPageToggleLoading; diff --git a/src/app/core/e-commerce/_actions/product-specification.actions.ts b/src/app/core/e-commerce/_actions/product-specification.actions.ts new file mode 100644 index 0000000..18ce52b --- /dev/null +++ b/src/app/core/e-commerce/_actions/product-specification.actions.ts @@ -0,0 +1,76 @@ +// NGRX +import { Action } from '@ngrx/store'; +import { Update } from '@ngrx/entity'; +// CRUD +import { QueryParamsModel } from '../../_base/crud'; +// Models +import { ProductSpecificationModel } from '../_models/product-specification.model'; + +export enum ProductSpecificationActionTypes { + ProductSpecificationOnServerCreated = '[Edit ProductSpecification Dialog] Product Specification On Server Created', + ProductSpecificationCreated = '[Edit ProductSpecification Dialog] Product Specification Created', + ProductSpecificationUpdated = '[Edit SpecificationSpecification Dialog] Product Specification Updated', + OneProductSpecificationDeleted = '[Product Specification List Page] One Product Specification Deleted', + ManyProductSpecificationsDeleted = '[Product Specifications List Page] Many Product Specifications Deleted', + ProductSpecificationsPageRequested = '[Product Specifications List Page] Product Specifications Page Requested', + ProductSpecificationsPageLoaded = '[Product Specifications API] Product Specifications Page Loaded', + ProductSpecificationsPageCancelled = '[Product Specifications API] Product Specifications Page Cancelled', + ProductSpecificationsPageToggleLoading = '[Product Specifications] Product Specifications Page Toggle Loading' +} + +export class ProductSpecificationOnServerCreated implements Action { + readonly type = ProductSpecificationActionTypes.ProductSpecificationOnServerCreated; + constructor(public payload: { productSpecification: ProductSpecificationModel }) { } +} + +export class ProductSpecificationCreated implements Action { + readonly type = ProductSpecificationActionTypes.ProductSpecificationCreated; + constructor(public payload: { productSpecification: ProductSpecificationModel }) { } +} + +export class ProductSpecificationUpdated implements Action { + readonly type = ProductSpecificationActionTypes.ProductSpecificationUpdated; + constructor(public payload: { + partialProductSpecification: Update, // For State update + productSpecification: ProductSpecificationModel // For Server update (through service) + }) { } +} + +export class OneProductSpecificationDeleted implements Action { + readonly type = ProductSpecificationActionTypes.OneProductSpecificationDeleted; + constructor(public payload: { id: number }) {} +} + +export class ManyProductSpecificationsDeleted implements Action { + readonly type = ProductSpecificationActionTypes.ManyProductSpecificationsDeleted; + constructor(public payload: { ids: number[] }) {} +} + +export class ProductSpecificationsPageRequested implements Action { + readonly type = ProductSpecificationActionTypes.ProductSpecificationsPageRequested; + constructor(public payload: { page: QueryParamsModel, productId: number }) { } +} + +export class ProductSpecificationsPageLoaded implements Action { + readonly type = ProductSpecificationActionTypes.ProductSpecificationsPageLoaded; + constructor(public payload: { productSpecifications: ProductSpecificationModel[], totalCount: number }) { } +} + +export class ProductSpecificationsPageCancelled implements Action { + readonly type = ProductSpecificationActionTypes.ProductSpecificationsPageCancelled; +} + +export class ProductSpecificationsPageToggleLoading implements Action { + readonly type = ProductSpecificationActionTypes.ProductSpecificationsPageToggleLoading; + constructor(public payload: { isLoading: boolean }) { } +} + +export type ProductSpecificationActions = ProductSpecificationOnServerCreated +| ProductSpecificationCreated +| ProductSpecificationUpdated +| OneProductSpecificationDeleted +| ManyProductSpecificationsDeleted +| ProductSpecificationsPageRequested +| ProductSpecificationsPageLoaded +| ProductSpecificationsPageCancelled +| ProductSpecificationsPageToggleLoading; diff --git a/src/app/core/e-commerce/_actions/product.actions.ts b/src/app/core/e-commerce/_actions/product.actions.ts new file mode 100644 index 0000000..3053d19 --- /dev/null +++ b/src/app/core/e-commerce/_actions/product.actions.ts @@ -0,0 +1,93 @@ +// NGRX +import { Action } from '@ngrx/store'; +// CRUD +import { QueryParamsModel } from '../../_base/crud'; +// Models +import { ProductModel } from '../_models/product.model'; +import { Update } from '@ngrx/entity'; + +export enum ProductActionTypes { + ProductOnServerCreated = '[Edit Product Component] Product On Server Created', + ProductCreated = '[Edit Product Component] Product Created', + ProductUpdated = '[Edit Product Component] Product Updated', + ProductsStatusUpdated = '[Products List Page] Products Status Updated', + OneProductDeleted = '[Products List Page] One Product Deleted', + ManyProductsDeleted = '[Products List Page] Many Selected Products Deleted', + ProductsPageRequested = '[Products List Page] Products Page Requested', + ProductsPageLoaded = '[Products API] Products Page Loaded', + ProductsPageCancelled = '[Products API] Products Page Cancelled', + ProductsPageToggleLoading = '[Products] Products Page Toggle Loading', + ProductsActionToggleLoading = '[Products] Products Action Toggle Loading' +} + +export class ProductOnServerCreated implements Action { + readonly type = ProductActionTypes.ProductOnServerCreated; + constructor(public payload: { product: ProductModel }) { } +} + +export class ProductCreated implements Action { + readonly type = ProductActionTypes.ProductCreated; + constructor(public payload: { product: ProductModel }) { } +} + +export class ProductUpdated implements Action { + readonly type = ProductActionTypes.ProductUpdated; + constructor(public payload: { + partialProduct: Update, // For State update + product: ProductModel // For Server update (through service) + }) { } +} + +export class ProductsStatusUpdated implements Action { + readonly type = ProductActionTypes.ProductsStatusUpdated; + constructor(public payload: { + products: ProductModel[], + status: number + }) { } +} + +export class OneProductDeleted implements Action { + readonly type = ProductActionTypes.OneProductDeleted; + constructor(public payload: { id: number }) {} +} + +export class ManyProductsDeleted implements Action { + readonly type = ProductActionTypes.ManyProductsDeleted; + constructor(public payload: { ids: number[] }) {} +} + +export class ProductsPageRequested implements Action { + readonly type = ProductActionTypes.ProductsPageRequested; + constructor(public payload: { page: QueryParamsModel }) { } +} + +export class ProductsPageLoaded implements Action { + readonly type = ProductActionTypes.ProductsPageLoaded; + constructor(public payload: { products: ProductModel[], totalCount: number, page: QueryParamsModel }) { } +} + +export class ProductsPageCancelled implements Action { + readonly type = ProductActionTypes.ProductsPageCancelled; +} + +export class ProductsPageToggleLoading implements Action { + readonly type = ProductActionTypes.ProductsPageToggleLoading; + constructor(public payload: { isLoading: boolean }) { } +} + +export class ProductsActionToggleLoading implements Action { + readonly type = ProductActionTypes.ProductsActionToggleLoading; + constructor(public payload: { isLoading: boolean }) { } +} + +export type ProductActions = ProductOnServerCreated +| ProductCreated +| ProductUpdated +| ProductsStatusUpdated +| OneProductDeleted +| ManyProductsDeleted +| ProductsPageRequested +| ProductsPageLoaded +| ProductsPageCancelled +| ProductsPageToggleLoading +| ProductsActionToggleLoading; diff --git a/src/app/core/e-commerce/_consts/specification.dictionary.ts b/src/app/core/e-commerce/_consts/specification.dictionary.ts new file mode 100644 index 0000000..513779d --- /dev/null +++ b/src/app/core/e-commerce/_consts/specification.dictionary.ts @@ -0,0 +1,12 @@ +export const SPECIFICATIONS_DICTIONARY: string[] = [ + 'Seats', + 'Fuel Type', + 'Stock', + 'Door count', + 'Engine', + 'Transmission', + 'Drivetrain', + 'Combined MPG', + 'Warranty', + 'Wheels' +]; diff --git a/src/app/core/e-commerce/_data-sources/customers.datasource.ts b/src/app/core/e-commerce/_data-sources/customers.datasource.ts new file mode 100644 index 0000000..2f623cc --- /dev/null +++ b/src/app/core/e-commerce/_data-sources/customers.datasource.ts @@ -0,0 +1,31 @@ +import { mergeMap, tap } from 'rxjs/operators'; +// RxJS +import { delay, distinctUntilChanged, skip, filter, take, map } from 'rxjs/operators'; +// NGRX +import { Store, select } from '@ngrx/store'; +// CRUD +import { BaseDataSource, QueryResultsModel } from '../../_base/crud'; +// State +import { AppState } from '../../reducers'; +import { selectCustomersInStore, selectCustomersPageLoading, selectCustomersShowInitWaitingMessage } from '../_selectors/customer.selectors'; + +export class CustomersDataSource extends BaseDataSource { + constructor(private store: Store) { + super(); + + this.loading$ = this.store.pipe( + select(selectCustomersPageLoading), + ); + + this.isPreloadTextViewed$ = this.store.pipe( + select(selectCustomersShowInitWaitingMessage) + ); + + this.store.pipe( + select(selectCustomersInStore), + ).subscribe((response: QueryResultsModel) => { + this.paginatorTotalSubject.next(response.totalCount); + this.entitySubject.next(response.items); + }); + } +} diff --git a/src/app/core/e-commerce/_data-sources/product-remarks.datasource.ts b/src/app/core/e-commerce/_data-sources/product-remarks.datasource.ts new file mode 100644 index 0000000..4df286b --- /dev/null +++ b/src/app/core/e-commerce/_data-sources/product-remarks.datasource.ts @@ -0,0 +1,28 @@ +// RxJS +import { debounceTime } from 'rxjs/operators'; +// NGRX +import { Store, select } from '@ngrx/store'; +// CRUD +import { BaseDataSource, QueryResultsModel } from '../../_base/crud'; +// State +import { AppState } from '../../reducers'; +import { selectProductRemarksInStore, selectProductRemarksPageLoading, selectPRShowInitWaitingMessage } from '../_selectors/product-remark.selectors'; +export class ProductRemarksDataSource extends BaseDataSource { + constructor(private store: Store) { + super(); + + this.store.pipe( + select(selectProductRemarksInStore), + debounceTime(600) + ).subscribe((response: QueryResultsModel) => { + this.entitySubject.next(response.items); + this.paginatorTotalSubject.next(response.totalCount); + }); + + this.isPreloadTextViewed$ = this.store.pipe( + select(selectPRShowInitWaitingMessage) + ); + + this.loading$ = this.store.pipe(select(selectProductRemarksPageLoading)); + } +} diff --git a/src/app/core/e-commerce/_data-sources/product-specifications.datasource.ts b/src/app/core/e-commerce/_data-sources/product-specifications.datasource.ts new file mode 100644 index 0000000..adb75df --- /dev/null +++ b/src/app/core/e-commerce/_data-sources/product-specifications.datasource.ts @@ -0,0 +1,28 @@ +// RxJS +import { debounceTime } from 'rxjs/operators'; +// NGRX +import { Store, select } from '@ngrx/store'; +// CRUD +import { BaseDataSource, QueryResultsModel } from '../../_base/crud'; +// State +import { AppState } from '../../reducers'; +import { selectProductSpecificationsInStore, selectProductSpecificationsPageLoading, selectPSShowInitWaitingMessage } from '../_selectors/product-specification.selectors'; +export class ProductSpecificationsDataSource extends BaseDataSource { + constructor(private store: Store) { + super(); + + this.store.pipe( + select(selectProductSpecificationsInStore), + debounceTime(600) + ).subscribe((response: QueryResultsModel) => { + this.entitySubject.next(response.items); + this.paginatorTotalSubject.next(response.totalCount); + }); + + this.isPreloadTextViewed$ = this.store.pipe( + select(selectPSShowInitWaitingMessage) + ); + + this.loading$ = this.store.pipe(select(selectProductSpecificationsPageLoading)); + } +} diff --git a/src/app/core/e-commerce/_data-sources/products.datasource.ts b/src/app/core/e-commerce/_data-sources/products.datasource.ts new file mode 100644 index 0000000..d9b020c --- /dev/null +++ b/src/app/core/e-commerce/_data-sources/products.datasource.ts @@ -0,0 +1,30 @@ +import { selectProductsInitWaitingMessage } from './../_selectors/product.selectors'; +// RxJS +import { delay, distinctUntilChanged } from 'rxjs/operators'; +// CRUD +import { QueryResultsModel, BaseDataSource } from '../../_base/crud'; +// State +import { Store, select } from '@ngrx/store'; +import { AppState } from '../../reducers'; +// Selectors +import { selectProductsInStore, selectProductsPageLoading } from '../_selectors/product.selectors'; + +export class ProductsDataSource extends BaseDataSource { + constructor(private store: Store) { + super(); + this.loading$ = this.store.pipe( + select(selectProductsPageLoading) + ); + + this.isPreloadTextViewed$ = this.store.pipe( + select(selectProductsInitWaitingMessage) + ); + + this.store.pipe( + select(selectProductsInStore) + ).subscribe((response: QueryResultsModel) => { + this.paginatorTotalSubject.next(response.totalCount); + this.entitySubject.next(response.items); + }); + } +} diff --git a/src/app/core/e-commerce/_effects/customer.effects.ts b/src/app/core/e-commerce/_effects/customer.effects.ts new file mode 100644 index 0000000..a544c0d --- /dev/null +++ b/src/app/core/e-commerce/_effects/customer.effects.ts @@ -0,0 +1,131 @@ +import { QueryParamsModel } from './../../_base/crud/models/query-models/query-params.model'; +import { forkJoin } from 'rxjs'; +// Angular +import { Injectable } from '@angular/core'; +// RxJS +import { mergeMap, map, tap, delay } from 'rxjs/operators'; +// NGRX +import { Effect, Actions, ofType } from '@ngrx/effects'; +import { Store } from '@ngrx/store'; +// CRUD +import { QueryResultsModel } from '../../_base/crud'; +// Services +import { CustomersService } from '../_services/'; +// State +import { AppState } from '../../../core/reducers'; +// Actions +import { + CustomerActionTypes, + CustomersPageRequested, + CustomersPageLoaded, + ManyCustomersDeleted, + OneCustomerDeleted, + CustomerActionToggleLoading, + CustomersPageToggleLoading, + CustomerUpdated, + CustomersStatusUpdated, + CustomerCreated, + CustomerOnServerCreated +} from '../_actions/customer.actions'; +import { of } from 'rxjs'; + +@Injectable() +export class CustomerEffects { + showPageLoadingDistpatcher = new CustomersPageToggleLoading({ isLoading: true }); + showActionLoadingDistpatcher = new CustomerActionToggleLoading({ isLoading: true }); + hideActionLoadingDistpatcher = new CustomerActionToggleLoading({ isLoading: false }); + + @Effect() + loadCustomersPage$ = this.actions$.pipe( + ofType(CustomerActionTypes.CustomersPageRequested), + mergeMap(( { payload } ) => { + this.store.dispatch(this.showPageLoadingDistpatcher); + const requestToServer = this.customersService.findCustomers(payload.page); + const lastQuery = of(payload.page); + return forkJoin(requestToServer, lastQuery); + }), + map(response => { + const result: QueryResultsModel = response[0]; + const lastQuery: QueryParamsModel = response[1]; + const pageLoadedDispatch = new CustomersPageLoaded({ + customers: result.items, + totalCount: result.totalCount, + page: lastQuery + }); + return pageLoadedDispatch; + }) + ); + + @Effect() + deleteCustomer$ = this.actions$ + .pipe( + ofType(CustomerActionTypes.OneCustomerDeleted), + mergeMap(( { payload } ) => { + this.store.dispatch(this.showActionLoadingDistpatcher); + return this.customersService.deleteCustomer(payload.id); + } + ), + map(() => { + return this.hideActionLoadingDistpatcher; + }), + ); + + @Effect() + deleteCustomers$ = this.actions$ + .pipe( + ofType(CustomerActionTypes.ManyCustomersDeleted), + mergeMap(( { payload } ) => { + this.store.dispatch(this.showActionLoadingDistpatcher); + return this.customersService.deleteCustomers(payload.ids); + } + ), + map(() => { + return this.hideActionLoadingDistpatcher; + }), + ); + + @Effect() + updateCustomer$ = this.actions$ + .pipe( + ofType(CustomerActionTypes.CustomerUpdated), + mergeMap(( { payload } ) => { + this.store.dispatch(this.showActionLoadingDistpatcher); + return this.customersService.updateCustomer(payload.customer); + }), + map(() => { + return this.hideActionLoadingDistpatcher; + }) + ); + + @Effect() + updateCustomersStatus$ = this.actions$ + .pipe( + ofType(CustomerActionTypes.CustomersStatusUpdated), + mergeMap(( { payload } ) => { + this.store.dispatch(this.showActionLoadingDistpatcher); + return this.customersService.updateStatusForCustomer(payload.customers, payload.status); + }), + map(() => { + return this.hideActionLoadingDistpatcher; + }) + ); + + @Effect() + createCustomer$ = this.actions$ + .pipe( + ofType(CustomerActionTypes.CustomerOnServerCreated), + mergeMap(( { payload } ) => { + this.store.dispatch(this.showActionLoadingDistpatcher); + return this.customersService.createCustomer(payload.customer).pipe( + tap(res => { + this.store.dispatch(new CustomerCreated({ customer: res })); + }) + ); + }), + map(() => { + return this.hideActionLoadingDistpatcher; + }), + ); + + constructor(private actions$: Actions, private customersService: CustomersService, private store: Store) { } +} diff --git a/src/app/core/e-commerce/_effects/product-remark.effects.ts b/src/app/core/e-commerce/_effects/product-remark.effects.ts new file mode 100644 index 0000000..49108e8 --- /dev/null +++ b/src/app/core/e-commerce/_effects/product-remark.effects.ts @@ -0,0 +1,107 @@ +// Angular +import { Injectable } from '@angular/core'; +// RxJS +import { of } from 'rxjs'; +import { mergeMap, map, catchError, tap } from 'rxjs/operators'; +// NGRX +import { Effect, Actions, ofType } from '@ngrx/effects'; +import { Store } from '@ngrx/store'; +// CRUD +import { QueryResultsModel } from '../../_base/crud'; +// Services +import { ProductRemarksService } from '../_services/'; +// State +import { AppState } from '../../../core/reducers'; +// Actions +import { + ProductRemarkActionTypes, + ProductRemarksPageRequested, + ProductRemarksPageLoaded, + ManyProductRemarksDeleted, + OneProductRemarkDeleted, + ProductRemarksPageToggleLoading, + ProductRemarkUpdated, + ProductRemarkCreated, + ProductRemarkOnServerCreated +} from '../_actions/product-remark.actions'; + +@Injectable() +export class ProductRemarkEffects { + // showLoadingDistpatcher = new ProcutRemarksPageToggleLoading({ isLoading: true }); + hideLoadingDistpatcher = new ProductRemarksPageToggleLoading({ isLoading: false }); + + @Effect() + loadProductRemarksPage$ = this.actions$ + .pipe( + ofType(ProductRemarkActionTypes.ProductRemarksPageRequested), + mergeMap(( { payload } ) => { + return this.productRemarksService.findProductRemarks(payload.page, payload.productId); + }), + map((result: QueryResultsModel) => { + return new ProductRemarksPageLoaded({ + productRemarks: result.items, + totalCount: result.totalCount + }); + }), + ); + + @Effect() + deleteProductRemark$ = this.actions$ + .pipe( + ofType(ProductRemarkActionTypes.OneProductRemarkDeleted), + mergeMap(( { payload } ) => { + this.store.dispatch(new ProductRemarksPageToggleLoading({ isLoading: true })); + return this.productRemarksService.deleteProductRemark(payload.id); + } + ), + map(() => { + return this.hideLoadingDistpatcher; + }), + ); + + @Effect() + deleteProductRemarks$ = this.actions$ + .pipe( + ofType(ProductRemarkActionTypes.ManyProductRemarksDeleted), + mergeMap(( { payload } ) => { + this.store.dispatch(new ProductRemarksPageToggleLoading({ isLoading: true })); + return this.productRemarksService.deleteProductRemarks(payload.ids); + } + ), + map(() => { + return this.hideLoadingDistpatcher; + }), + ); + + @Effect() + updateProductRemark$ = this.actions$ + .pipe( + ofType(ProductRemarkActionTypes.ProductRemarkUpdated), + mergeMap(( { payload } ) => { + this.store.dispatch(new ProductRemarksPageToggleLoading({ isLoading: true })); + return this.productRemarksService.updateProductRemark(payload.productRemark); + }), + map(() => { + return this.hideLoadingDistpatcher; + }), + ); + + @Effect() + createProductRemark$ = this.actions$ + .pipe( + ofType(ProductRemarkActionTypes.ProductRemarkOnServerCreated), + mergeMap(( { payload } ) => { + this.store.dispatch(new ProductRemarksPageToggleLoading({ isLoading: true })); + return this.productRemarksService.createProductRemark(payload.productRemark).pipe( + tap(res => { + this.store.dispatch(new ProductRemarkCreated({ productRemark: res })); + }) + ); + }), + map(() => { + return this.hideLoadingDistpatcher; + }), + ); + + constructor(private actions$: Actions, private productRemarksService: ProductRemarksService, private store: Store) { } +} diff --git a/src/app/core/e-commerce/_effects/product-specification.effects.ts b/src/app/core/e-commerce/_effects/product-specification.effects.ts new file mode 100644 index 0000000..9cf8426 --- /dev/null +++ b/src/app/core/e-commerce/_effects/product-specification.effects.ts @@ -0,0 +1,105 @@ +// Angular +import { Injectable } from '@angular/core'; +// RxJS +import { of } from 'rxjs'; +import { mergeMap, map, catchError, tap } from 'rxjs/operators'; +// NGRX +import { Effect, Actions, ofType } from '@ngrx/effects'; +import { Store } from '@ngrx/store'; +// CRUD +import { QueryResultsModel } from '../../_base/crud'; +// Services +import { ProductSpecificationsService } from '../_services/'; +// State +import { AppState } from '../../../core/reducers'; +// Actions +import { + ProductSpecificationActionTypes, + ProductSpecificationsPageRequested, + ProductSpecificationsPageLoaded, + ManyProductSpecificationsDeleted, + OneProductSpecificationDeleted, + ProductSpecificationsPageToggleLoading, + ProductSpecificationUpdated, + ProductSpecificationCreated, + ProductSpecificationOnServerCreated +} from '../_actions/product-specification.actions'; + +@Injectable() +export class ProductSpecificationEffects { + // showLoadingDistpatcher = new ProcutSpecificationsPageToggleLoading({ isLoading: true }); + hideLoadingDistpatcher = new ProductSpecificationsPageToggleLoading({ isLoading: false }); + + @Effect() + loadProductSpecificationsPage$ = this.actions$ + .pipe( + ofType(ProductSpecificationActionTypes.ProductSpecificationsPageRequested), + mergeMap(( { payload } ) => this.productSpecificationsService.findProductSpecs(payload.page, payload.productId)), + map((result: QueryResultsModel) => { + return new ProductSpecificationsPageLoaded({ + productSpecifications: result.items, + totalCount: result.totalCount + }); + }), + ); + + @Effect() + deleteProductSpecification$ = this.actions$ + .pipe( + ofType(ProductSpecificationActionTypes.OneProductSpecificationDeleted), + mergeMap(( { payload } ) => { + this.store.dispatch(new ProductSpecificationsPageToggleLoading({ isLoading: true })); + return this.productSpecificationsService.deleteProductSpec(payload.id); + } + ), + map(() => { + return this.hideLoadingDistpatcher; + }), + ); + + @Effect() + deleteProductSpecifications$ = this.actions$ + .pipe( + ofType(ProductSpecificationActionTypes.ManyProductSpecificationsDeleted), + mergeMap(( { payload } ) => { + this.store.dispatch(new ProductSpecificationsPageToggleLoading({ isLoading: true })); + return this.productSpecificationsService.deleteProductSpecifications(payload.ids); + } + ), + map(() => { + return this.hideLoadingDistpatcher; + }), + ); + + @Effect() + updateProductSpecification$ = this.actions$ + .pipe( + ofType(ProductSpecificationActionTypes.ProductSpecificationUpdated), + mergeMap(( { payload } ) => { + this.store.dispatch(new ProductSpecificationsPageToggleLoading({ isLoading: true })); + return this.productSpecificationsService.updateProductSpec(payload.productSpecification); + }), + map(() => { + return this.hideLoadingDistpatcher; + }), + ); + + @Effect() + createProductSpecification$ = this.actions$ + .pipe( + ofType(ProductSpecificationActionTypes.ProductSpecificationOnServerCreated), + mergeMap(( { payload } ) => { + this.store.dispatch(new ProductSpecificationsPageToggleLoading({ isLoading: true })); + return this.productSpecificationsService.createProductSpec(payload.productSpecification).pipe( + tap(res => { + this.store.dispatch(new ProductSpecificationCreated({ productSpecification: res })); + }) + ); + }), + map(() => { + return this.hideLoadingDistpatcher; + }), + ); + + constructor(private actions$: Actions, private productSpecificationsService: ProductSpecificationsService, private store: Store) { } +} diff --git a/src/app/core/e-commerce/_effects/product.effects.ts b/src/app/core/e-commerce/_effects/product.effects.ts new file mode 100644 index 0000000..624daf3 --- /dev/null +++ b/src/app/core/e-commerce/_effects/product.effects.ts @@ -0,0 +1,135 @@ +import { forkJoin } from 'rxjs'; +// Angular +import { Injectable } from '@angular/core'; +// RxJS +import { mergeMap, map, tap } from 'rxjs/operators'; +// NGRX +import { Effect, Actions, ofType } from '@ngrx/effects'; +import { Store, Action } from '@ngrx/store'; +// CRUD +import { QueryResultsModel, QueryParamsModel } from '../../_base/crud'; +// Services +import { ProductsService } from '../_services/'; +// State +import { AppState } from '../../../core/reducers'; +// Actions +import { + ProductActionTypes, + ProductsPageRequested, + ProductsPageLoaded, + ManyProductsDeleted, + OneProductDeleted, + ProductsPageToggleLoading, + ProductsStatusUpdated, + ProductUpdated, + ProductCreated, + ProductOnServerCreated +} from '../_actions/product.actions'; +import { defer, Observable, of } from 'rxjs'; + +@Injectable() +export class ProductEffects { + showPageLoadingDistpatcher = new ProductsPageToggleLoading({ isLoading: true }); + showLoadingDistpatcher = new ProductsPageToggleLoading({ isLoading: true }); + hideActionLoadingDistpatcher = new ProductsPageToggleLoading({ isLoading: false }); + + @Effect() + loadProductsPage$ = this.actions$ + .pipe( + ofType(ProductActionTypes.ProductsPageRequested), + mergeMap(( { payload } ) => { + this.store.dispatch(this.showPageLoadingDistpatcher); + const requestToServer = this.productsService.findProducts(payload.page); + const lastQuery = of(payload.page); + return forkJoin(requestToServer, lastQuery); + }), + map(response => { + const result: QueryResultsModel = response[0]; + const lastQuery: QueryParamsModel = response[1]; + return new ProductsPageLoaded({ + products: result.items, + totalCount: result.totalCount, + page: lastQuery + }); + }), + ); + + @Effect() + deleteProduct$ = this.actions$ + .pipe( + ofType(ProductActionTypes.OneProductDeleted), + mergeMap(( { payload } ) => { + this.store.dispatch(this.showLoadingDistpatcher); + return this.productsService.deleteProduct(payload.id); + } + ), + map(() => { + return this.hideActionLoadingDistpatcher; + }), + ); + + @Effect() + deleteProducts$ = this.actions$ + .pipe( + ofType(ProductActionTypes.ManyProductsDeleted), + mergeMap(( { payload } ) => { + this.store.dispatch(this.showLoadingDistpatcher); + return this.productsService.deleteProducts(payload.ids); + } + ), + map(() => { + return this.hideActionLoadingDistpatcher; + }), + ); + + @Effect() + updateProductsStatus$ = this.actions$ + .pipe( + ofType(ProductActionTypes.ProductsStatusUpdated), + mergeMap(( { payload } ) => { + this.store.dispatch(this.showLoadingDistpatcher); + return this.productsService.updateStatusForProduct(payload.products, payload.status); + }), + map(() => { + return this.hideActionLoadingDistpatcher; + }), + ); + + @Effect() + updateProduct$ = this.actions$ + .pipe( + ofType(ProductActionTypes.ProductUpdated), + mergeMap(( { payload } ) => { + this.store.dispatch(this.showLoadingDistpatcher); + return this.productsService.updateProduct(payload.product); + }), + map(() => { + return this.hideActionLoadingDistpatcher; + }), + ); + + @Effect() + createProduct$ = this.actions$ + .pipe( + ofType(ProductActionTypes.ProductOnServerCreated), + mergeMap(( { payload } ) => { + this.store.dispatch(this.showLoadingDistpatcher); + return this.productsService.createProduct(payload.product).pipe( + tap(res => { + this.store.dispatch(new ProductCreated({ product: res })); + }) + ); + }), + map(() => { + return this.hideActionLoadingDistpatcher; + }), + ); + + // @Effect() + // init$: Observable = defer(() => { + // const queryParams = new QueryParamsModel({}); + // return of(new ProductsPageRequested({ page: queryParams })); + // }); + + constructor(private actions$: Actions, private productsService: ProductsService, private store: Store) { } +} diff --git a/src/app/core/e-commerce/_models/customer.model.ts b/src/app/core/e-commerce/_models/customer.model.ts new file mode 100644 index 0000000..6af1ba5 --- /dev/null +++ b/src/app/core/e-commerce/_models/customer.model.ts @@ -0,0 +1,27 @@ +import { BaseModel } from '../../_base/crud'; + +export class CustomerModel extends BaseModel { + id: number; + firstName: string; + lastName: string; + email: string; + userName: string; + gender: string; + status: number; // 0 = Active | 1 = Suspended | Pending = 2 + dateOfBbirth: string; + dob: Date; + ipAddress: string; + type: number; // 0 = Business | 1 = Individual + + clear() { + this.dob = new Date(); + this.firstName = ''; + this.lastName = ''; + this.email = ''; + this.userName = ''; + this.gender = 'Female'; + this.ipAddress = ''; + this.type = 1; + this.status = 1; + } +} diff --git a/src/app/core/e-commerce/_models/product-remark.model.ts b/src/app/core/e-commerce/_models/product-remark.model.ts new file mode 100644 index 0000000..7b9dfc2 --- /dev/null +++ b/src/app/core/e-commerce/_models/product-remark.model.ts @@ -0,0 +1,22 @@ +import { BaseModel } from '../../_base/crud'; + +export class ProductRemarkModel extends BaseModel { + id: number; + carId: number; + text: string; + type: number; // Info, Note, Reminder + dueDate: string; + _isEditMode: boolean; + + // Refs + _carName: string; + + clear(carId: number) { + this.id = undefined; + this.carId = carId; + this.text = ''; + this.type = 0; + this.dueDate = ''; + this._isEditMode = false; + } +} diff --git a/src/app/core/e-commerce/_models/product-specification.model.ts b/src/app/core/e-commerce/_models/product-specification.model.ts new file mode 100644 index 0000000..aefdc57 --- /dev/null +++ b/src/app/core/e-commerce/_models/product-specification.model.ts @@ -0,0 +1,20 @@ +import { BaseModel } from '../../_base/crud'; + +export class ProductSpecificationModel extends BaseModel { + id: number; + carId: number; + specId: number; + value: string; + + // Refs + _carName: string; + _specificationName: string; + + clear(carId: number) { + this.id = undefined; + this.carId = carId; + this._specificationName = ''; + this.value = ''; + this.specId = undefined; + } +} diff --git a/src/app/core/e-commerce/_models/product.model.ts b/src/app/core/e-commerce/_models/product.model.ts new file mode 100644 index 0000000..7deff3a --- /dev/null +++ b/src/app/core/e-commerce/_models/product.model.ts @@ -0,0 +1,33 @@ +import { BaseModel } from '../../_base/crud'; +import { ProductSpecificationModel } from './product-specification.model'; +import { ProductRemarkModel } from './product-remark.model'; + +export class ProductModel extends BaseModel { + id: number; + model: string; + manufacture: string; + modelYear: number; + mileage: number; + description: string; + color: string; + price: number; + condition: number; + status: number; + VINCode: string; + + _specs: ProductSpecificationModel[]; + _remarks: ProductRemarkModel[]; + + clear() { + this.model = ''; + this.manufacture = ''; + this.modelYear = 2000; + this.mileage = 0; + this.description = ''; + this.color = 'Black'; + this.price = 1000; + this.condition = 0; + this.status = 0; + this.VINCode = ''; + } +} diff --git a/src/app/core/e-commerce/_reducers/customer.reducers.ts b/src/app/core/e-commerce/_reducers/customer.reducers.ts new file mode 100644 index 0000000..4df081a --- /dev/null +++ b/src/app/core/e-commerce/_reducers/customer.reducers.ts @@ -0,0 +1,90 @@ +// NGRX +import { createFeatureSelector } from '@ngrx/store'; +import { EntityState, EntityAdapter, createEntityAdapter, Update } from '@ngrx/entity'; +// Actions +import { CustomerActions, CustomerActionTypes } from '../_actions/customer.actions'; +// Models +import { CustomerModel } from '../_models/customer.model'; +import { QueryParamsModel } from '../../_base/crud'; + +export interface CustomersState extends EntityState { + listLoading: boolean; + actionsloading: boolean; + totalCount: number; + lastCreatedCustomerId: number; + lastQuery: QueryParamsModel; + showInitWaitingMessage: boolean; +} + +export const adapter: EntityAdapter = createEntityAdapter(); + +export const initialCustomersState: CustomersState = adapter.getInitialState({ + customerForEdit: null, + listLoading: false, + actionsloading: false, + totalCount: 0, + lastCreatedCustomerId: undefined, + lastQuery: new QueryParamsModel({}), + showInitWaitingMessage: true +}); + +export function customersReducer(state = initialCustomersState, action: CustomerActions): CustomersState { + switch (action.type) { + case CustomerActionTypes.CustomersPageToggleLoading: { + return { + ...state, listLoading: action.payload.isLoading, lastCreatedCustomerId: undefined + }; + } + case CustomerActionTypes.CustomerActionToggleLoading: { + return { + ...state, actionsloading: action.payload.isLoading + }; + } + case CustomerActionTypes.CustomerOnServerCreated: return { + ...state + }; + case CustomerActionTypes.CustomerCreated: return adapter.addOne(action.payload.customer, { + ...state, lastCreatedCustomerId: action.payload.customer.id + }); + case CustomerActionTypes.CustomerUpdated: return adapter.updateOne(action.payload.partialCustomer, state); + case CustomerActionTypes.CustomersStatusUpdated: { + const _partialCustomers: Update[] = []; + // tslint:disable-next-line:prefer-const + for (let i = 0; i < action.payload.customers.length; i++) { + _partialCustomers.push({ + id: action.payload.customers[i].id, + changes: { + status: action.payload.status + } + }); + } + return adapter.updateMany(_partialCustomers, state); + } + case CustomerActionTypes.OneCustomerDeleted: return adapter.removeOne(action.payload.id, state); + case CustomerActionTypes.ManyCustomersDeleted: return adapter.removeMany(action.payload.ids, state); + case CustomerActionTypes.CustomersPageCancelled: { + return { + ...state, listLoading: false, lastQuery: new QueryParamsModel({}) + }; + } + case CustomerActionTypes.CustomersPageLoaded: { + return adapter.addMany(action.payload.customers, { + ...initialCustomersState, + totalCount: action.payload.totalCount, + listLoading: false, + lastQuery: action.payload.page, + showInitWaitingMessage: false + }); + } + default: return state; + } +} + +export const getCustomerState = createFeatureSelector('customers'); + +export const { + selectAll, + selectEntities, + selectIds, + selectTotal +} = adapter.getSelectors(); diff --git a/src/app/core/e-commerce/_reducers/product-remark.reducers.ts b/src/app/core/e-commerce/_reducers/product-remark.reducers.ts new file mode 100644 index 0000000..294999c --- /dev/null +++ b/src/app/core/e-commerce/_reducers/product-remark.reducers.ts @@ -0,0 +1,78 @@ +// NGRX +import { createFeatureSelector } from '@ngrx/store'; +import { EntityState, EntityAdapter, createEntityAdapter, Update } from '@ngrx/entity'; +// Actions +import { ProductRemarkActions, ProductRemarkActionTypes } from '../_actions/product-remark.actions'; +// Models +import { ProductRemarkModel } from '../_models/product-remark.model'; +import { QueryParamsModel } from '../../_base/crud'; + +export interface ProductRemarksState extends EntityState { + productId: number; + loading: boolean; + totalCount: number; + lastCreatedProductRemarkId: number; + lastQuery: QueryParamsModel; + showInitWaitingMessage: boolean; +} + +export const adapter: EntityAdapter = createEntityAdapter(); + +export const initialProductRemarksState: ProductRemarksState = adapter.getInitialState({ + loading: false, + totalCount: 0, + productId: undefined, + lastCreatedProductRemarkId: undefined, + lastQuery: new QueryParamsModel({}), + showInitWaitingMessage: true +}); + +export function productRemarksReducer(state = initialProductRemarksState, action: ProductRemarkActions): ProductRemarksState { + switch (action.type) { + case ProductRemarkActionTypes.ProductRemarksPageToggleLoading: + return { + ...state, + loading: action.payload.isLoading, + lastCreatedProductRemarkId: undefined + }; + case ProductRemarkActionTypes.ProductRemarkOnServerCreated: + return {...state, loading: true}; + case ProductRemarkActionTypes.ProductRemarkCreated: + return adapter.addOne(action.payload.productRemark, { + ...state, + lastCreatedProductRemarkId: action.payload.productRemark.id + }); + case ProductRemarkActionTypes.ProductRemarkUpdated: + return adapter.updateOne(action.payload.partialProductRemark, state); + case ProductRemarkActionTypes.ProductRemarkStoreUpdated: + return adapter.updateOne(action.payload.productRemark, state); + case ProductRemarkActionTypes.OneProductRemarkDeleted: + return adapter.removeOne(action.payload.id, state); + case ProductRemarkActionTypes.ManyProductRemarksDeleted: + return adapter.removeMany(action.payload.ids, state); + case ProductRemarkActionTypes.ProductRemarksPageCancelled: + return { ...state, totalCount: 0, loading: false, productId: undefined, lastQuery: new QueryParamsModel({}) }; + case ProductRemarkActionTypes.ProductRemarksPageRequested: + return { ...state, totalCount: 0, loading: true, productId: action.payload.productId, lastQuery: action.payload.page }; + case ProductRemarkActionTypes.ProductRemarksPageLoaded: + return adapter.addMany(action.payload.productRemarks, { + ...initialProductRemarksState, + totalCount: action.payload.totalCount, + loading: false, + productId: state.productId, + lastQuery: state.lastQuery, + showInitWaitingMessage: false + }); + default: + return state; + } +} + +export const getProductRemarlState = createFeatureSelector('productRemarks'); + +export const { + selectAll, + selectEntities, + selectIds, + selectTotal +} = adapter.getSelectors(); diff --git a/src/app/core/e-commerce/_reducers/product-specification.reducers.ts b/src/app/core/e-commerce/_reducers/product-specification.reducers.ts new file mode 100644 index 0000000..a2386c1 --- /dev/null +++ b/src/app/core/e-commerce/_reducers/product-specification.reducers.ts @@ -0,0 +1,76 @@ +// NGRX +import { createFeatureSelector } from '@ngrx/store'; +import { EntityState, EntityAdapter, createEntityAdapter, Update } from '@ngrx/entity'; +// Actions +import { ProductSpecificationActions, ProductSpecificationActionTypes } from '../_actions/product-specification.actions'; +// Models +import { ProductSpecificationModel } from '../_models/product-specification.model'; +import { QueryParamsModel } from '../../_base/crud'; + +export interface ProductSpecificationsState extends EntityState { + productId: number; + loading: boolean; + totalCount: number; + lastCreatedProductSpecificationId: number; + lastQuery: QueryParamsModel; + showInitWaitingMessage: boolean; +} + +export const adapter: EntityAdapter = createEntityAdapter(); + +export const initialProductSpecificationsState: ProductSpecificationsState = adapter.getInitialState({ + loading: false, + totalCount: 0, + productId: undefined, + lastCreatedProductSpecificationId: undefined, + lastQuery: new QueryParamsModel({}), + showInitWaitingMessage: true +}); + +export function productSpecificationsReducer(state = initialProductSpecificationsState, action: ProductSpecificationActions): ProductSpecificationsState { + switch (action.type) { + case ProductSpecificationActionTypes.ProductSpecificationsPageToggleLoading: + return { + ...state, + loading: action.payload.isLoading, + lastCreatedProductSpecificationId: undefined + }; + case ProductSpecificationActionTypes.ProductSpecificationOnServerCreated: + return {...state, loading: true}; + case ProductSpecificationActionTypes.ProductSpecificationCreated: + return adapter.addOne(action.payload.productSpecification, { + ...state, + lastCreatedProductSpecificationId: action.payload.productSpecification.id + }); + case ProductSpecificationActionTypes.ProductSpecificationUpdated: + return adapter.updateOne(action.payload.partialProductSpecification, state); + case ProductSpecificationActionTypes.OneProductSpecificationDeleted: + return adapter.removeOne(action.payload.id, state); + case ProductSpecificationActionTypes.ManyProductSpecificationsDeleted: + return adapter.removeMany(action.payload.ids, state); + case ProductSpecificationActionTypes.ProductSpecificationsPageCancelled: + return { ...state, totalCount: 0, loading: false, productId: undefined, lastQuery: new QueryParamsModel({}) }; + case ProductSpecificationActionTypes.ProductSpecificationsPageRequested: + return { ...state, totalCount: 0, loading: true, productId: action.payload.productId, lastQuery: action.payload.page }; + case ProductSpecificationActionTypes.ProductSpecificationsPageLoaded: + return adapter.addMany(action.payload.productSpecifications, { + ...initialProductSpecificationsState, + totalCount: action.payload.totalCount, + loading: false, + productId: state.productId, + lastQuery: state.lastQuery, + showInitWaitingMessage: false + }); + default: + return state; + } +} + +export const getProductRemarlState = createFeatureSelector('productSpecifications'); + +export const { + selectAll, + selectEntities, + selectIds, + selectTotal +} = adapter.getSelectors(); diff --git a/src/app/core/e-commerce/_reducers/product.reducers.ts b/src/app/core/e-commerce/_reducers/product.reducers.ts new file mode 100644 index 0000000..62b5dcd --- /dev/null +++ b/src/app/core/e-commerce/_reducers/product.reducers.ts @@ -0,0 +1,83 @@ + +// NGRX +import { createFeatureSelector } from '@ngrx/store'; +import { EntityState, EntityAdapter, createEntityAdapter, Update } from '@ngrx/entity'; +// Actions +import { ProductActions, ProductActionTypes } from '../_actions/product.actions'; +// CRUD +import { QueryParamsModel } from '../../_base/crud'; +// Models +import { ProductModel } from '../_models/product.model'; + +export interface ProductsState extends EntityState { + listLoading: boolean; + actionsloading: boolean; + totalCount: number; + lastQuery: QueryParamsModel; + lastCreatedProductId: number; + showInitWaitingMessage: boolean; +} + +export const adapter: EntityAdapter = createEntityAdapter(); + +export const initialProductsState: ProductsState = adapter.getInitialState({ + listLoading: false, + actionsloading: false, + totalCount: 0, + lastQuery: new QueryParamsModel({}), + lastCreatedProductId: undefined, + showInitWaitingMessage: true +}); + +export function productsReducer(state = initialProductsState, action: ProductActions): ProductsState { + switch (action.type) { + case ProductActionTypes.ProductsPageToggleLoading: return { + ...state, listLoading: action.payload.isLoading, lastCreatedProductId: undefined + }; + case ProductActionTypes.ProductsActionToggleLoading: return { + ...state, actionsloading: action.payload.isLoading + }; + case ProductActionTypes.ProductOnServerCreated: return { + ...state + }; + case ProductActionTypes.ProductCreated: return adapter.addOne(action.payload.product, { + ...state, lastCreatedProductId: action.payload.product.id + }); + case ProductActionTypes.ProductUpdated: return adapter.updateOne(action.payload.partialProduct, state); + case ProductActionTypes.ProductsStatusUpdated: { + const _partialProducts: Update[] = []; + for (let i = 0; i < action.payload.products.length; i++) { + _partialProducts.push({ + id: action.payload.products[i].id, + changes: { + status: action.payload.status + } + }); + } + return adapter.updateMany(_partialProducts, state); + } + case ProductActionTypes.OneProductDeleted: return adapter.removeOne(action.payload.id, state); + case ProductActionTypes.ManyProductsDeleted: return adapter.removeMany(action.payload.ids, state); + case ProductActionTypes.ProductsPageCancelled: return { + ...state, listLoading: false, lastQuery: new QueryParamsModel({}) + }; + case ProductActionTypes.ProductsPageLoaded: + return adapter.addMany(action.payload.products, { + ...initialProductsState, + totalCount: action.payload.totalCount, + listLoading: false, + lastQuery: action.payload.page, + showInitWaitingMessage: false + }); + default: return state; + } +} + +export const getProductState = createFeatureSelector('products'); + +export const { + selectAll, + selectEntities, + selectIds, + selectTotal +} = adapter.getSelectors(); diff --git a/src/app/core/e-commerce/_selectors/customer.selectors.ts b/src/app/core/e-commerce/_selectors/customer.selectors.ts new file mode 100644 index 0000000..11e2289 --- /dev/null +++ b/src/app/core/e-commerce/_selectors/customer.selectors.ts @@ -0,0 +1,49 @@ +// NGRX +import { createFeatureSelector, createSelector } from '@ngrx/store'; +// Lodash +import { each } from 'lodash'; +// CRUD +import { QueryResultsModel, HttpExtenstionsModel } from '../../_base/crud'; +// State +import { CustomersState } from '../_reducers/customer.reducers'; +import { CustomerModel } from '../_models/customer.model'; + +export const selectCustomersState = createFeatureSelector('customers'); + +export const selectCustomerById = (customerId: number) => createSelector( + selectCustomersState, + customersState => customersState.entities[customerId] +); + +export const selectCustomersPageLoading = createSelector( + selectCustomersState, + customersState => customersState.listLoading +); + +export const selectCustomersActionLoading = createSelector( + selectCustomersState, + customersState => customersState.actionsloading +); + +export const selectLastCreatedCustomerId = createSelector( + selectCustomersState, + customersState => customersState.lastCreatedCustomerId +); + +export const selectCustomersShowInitWaitingMessage = createSelector( + selectCustomersState, + customersState => customersState.showInitWaitingMessage +); + +export const selectCustomersInStore = createSelector( + selectCustomersState, + customersState => { + const items: CustomerModel[] = []; + each(customersState.entities, element => { + items.push(element); + }); + const httpExtension = new HttpExtenstionsModel(); + const result: CustomerModel[] = httpExtension.sortArray(items, customersState.lastQuery.sortField, customersState.lastQuery.sortOrder); + return new QueryResultsModel(result, customersState.totalCount, ''); + } +); diff --git a/src/app/core/e-commerce/_selectors/product-remark.selectors.ts b/src/app/core/e-commerce/_selectors/product-remark.selectors.ts new file mode 100644 index 0000000..16281d1 --- /dev/null +++ b/src/app/core/e-commerce/_selectors/product-remark.selectors.ts @@ -0,0 +1,50 @@ +// NGRX +import { createFeatureSelector, createSelector } from '@ngrx/store'; +// Lodash +import { each } from 'lodash'; +// CRUD +import { QueryResultsModel, HttpExtenstionsModel } from '../../_base/crud'; +// State +import { ProductRemarksState } from '../_reducers/product-remark.reducers'; +import { ProductRemarkModel } from '../_models/product-remark.model'; + +export const selectProductRemarksState = createFeatureSelector('productRemarks'); + +export const selectProductRemarkById = (productRemarkId: number) => createSelector( + selectProductRemarksState, + productRemarksState => productRemarksState.entities[productRemarkId] +); + +export const selectProductRemarksPageLoading = createSelector( + selectProductRemarksState, + productRemarksState => productRemarksState.loading +); + +export const selectCurrentProductIdInStoreForProductRemarks = createSelector( + selectProductRemarksState, + productRemarksState => productRemarksState.productId +); + +export const selectLastCreatedProductRemarkId = createSelector( + selectProductRemarksState, + productRemarksState => productRemarksState.lastCreatedProductRemarkId +); + +export const selectPRShowInitWaitingMessage = createSelector( + selectProductRemarksState, + productRemarksState => productRemarksState.showInitWaitingMessage +); + +export const selectProductRemarksInStore = createSelector( + selectProductRemarksState, + productRemarksState => { + const items: ProductRemarkModel[] = []; + each(productRemarksState.entities, element => { + items.push(element); + }); + const httpExtension = new HttpExtenstionsModel(); + const result: ProductRemarkModel[] = httpExtension.sortArray(items, productRemarksState.lastQuery.sortField, productRemarksState.lastQuery.sortOrder); + + return new QueryResultsModel(items, productRemarksState.totalCount, ''); + } +); diff --git a/src/app/core/e-commerce/_selectors/product-specification.selectors.ts b/src/app/core/e-commerce/_selectors/product-specification.selectors.ts new file mode 100644 index 0000000..25f961d --- /dev/null +++ b/src/app/core/e-commerce/_selectors/product-specification.selectors.ts @@ -0,0 +1,50 @@ +// NGRX +import { createFeatureSelector, createSelector } from '@ngrx/store'; +// Lodash +import { each } from 'lodash'; +// CRUD +import { QueryResultsModel, HttpExtenstionsModel } from '../../_base/crud'; +// State +import { ProductSpecificationsState } from '../_reducers/product-specification.reducers'; +import { ProductSpecificationModel } from '../_models/product-specification.model'; + +export const selectProductSpecificationsState = createFeatureSelector('productSpecifications'); + +export const selectProductSpecificationById = (productSpecificationId: number) => createSelector( + selectProductSpecificationsState, + productSpecificationsState => productSpecificationsState.entities[productSpecificationId] +); + +export const selectProductSpecificationsPageLoading = createSelector( + selectProductSpecificationsState, + productSpecificationsState => productSpecificationsState.loading +); + +export const selectCurrentProductIdInStoreForProductSpecs = createSelector( + selectProductSpecificationsState, + productSpecificationsState => productSpecificationsState.productId +); + +export const selectLastCreatedProductSpecificationId = createSelector( + selectProductSpecificationsState, + productSpecificationsState => productSpecificationsState.lastCreatedProductSpecificationId +); + +export const selectPSShowInitWaitingMessage = createSelector( + selectProductSpecificationsState, + productSpecificationsState => productSpecificationsState.showInitWaitingMessage +); + +export const selectProductSpecificationsInStore = createSelector( + selectProductSpecificationsState, + productSpecificationsState => { + const items: ProductSpecificationModel[] = []; + each(productSpecificationsState.entities, element => { + items.push(element); + }); + const httpExtension = new HttpExtenstionsModel(); + const result: ProductSpecificationModel[] = httpExtension.sortArray(items, productSpecificationsState.lastQuery.sortField, productSpecificationsState.lastQuery.sortOrder); + return new QueryResultsModel(result, productSpecificationsState.totalCount, ''); + } +); + diff --git a/src/app/core/e-commerce/_selectors/product.selectors.ts b/src/app/core/e-commerce/_selectors/product.selectors.ts new file mode 100644 index 0000000..befa06c --- /dev/null +++ b/src/app/core/e-commerce/_selectors/product.selectors.ts @@ -0,0 +1,65 @@ +// NGRX +import { createFeatureSelector, createSelector } from '@ngrx/store'; +// Lodash +import { each } from 'lodash'; +// CRUD +import { QueryResultsModel, HttpExtenstionsModel } from '../../_base/crud'; +// State +import { ProductsState } from '../_reducers/product.reducers'; +import { ProductModel } from '../_models/product.model'; + +export const selectProductsState = createFeatureSelector('products'); + +export const selectProductById = (productId: number) => createSelector( + selectProductsState, + productsState => productsState.entities[productId] +); + +export const selectProductsPageLoading = createSelector( + selectProductsState, + productsState => productsState.listLoading +); + +export const selectProductsActionLoading = createSelector( + selectProductsState, + customersState => customersState.actionsloading +); + +export const selectProductsPageLastQuery = createSelector( + selectProductsState, + productsState => productsState.lastQuery +); + +export const selectLastCreatedProductId = createSelector( + selectProductsState, + productsState => productsState.lastCreatedProductId +); + +export const selectProductsInitWaitingMessage = createSelector( + selectProductsState, + productsState => productsState.showInitWaitingMessage +); + +export const selectProductsInStore = createSelector( + selectProductsState, + productsState => { + const items: ProductModel[] = []; + each(productsState.entities, element => { + items.push(element); + }); + const httpExtension = new HttpExtenstionsModel(); + const result: ProductModel[] = httpExtension.sortArray(items, productsState.lastQuery.sortField, productsState.lastQuery.sortOrder); + return new QueryResultsModel(result, productsState.totalCount, ''); + } +); + +export const selectHasProductsInStore = createSelector( + selectProductsInStore, + queryResult => { + if (!queryResult.totalCount) { + return false; + } + + return true; + } +); diff --git a/src/app/core/e-commerce/_server/_e-commerce.data-context.ts b/src/app/core/e-commerce/_server/_e-commerce.data-context.ts new file mode 100644 index 0000000..458bb52 --- /dev/null +++ b/src/app/core/e-commerce/_server/_e-commerce.data-context.ts @@ -0,0 +1,23 @@ +import { CustomersTable } from './customers.table'; +import { CarsTable } from './cars.table'; +import { RemarksTable } from './remarks.table'; +import { CarSpecificationsTable } from './car-specifications.table'; +import { OrdersTable } from './orders.table'; + +// Wrapper class +export class ECommerceDataContext { + public static customers: any = CustomersTable.customers; + + public static cars: any = CarsTable.cars; + + // e-commerce car remarks + // one => many relations + public static remarks = RemarksTable.remarks; + + // e-commerce car specifications + // one => many relations + public static carSpecs = CarSpecificationsTable.carSpecifications; + + + public static orders = OrdersTable.orders; +} diff --git a/src/app/core/e-commerce/_server/car-specifications.table.ts b/src/app/core/e-commerce/_server/car-specifications.table.ts new file mode 100644 index 0000000..0099064 --- /dev/null +++ b/src/app/core/e-commerce/_server/car-specifications.table.ts @@ -0,0 +1,805 @@ +// Sub category for cars +export class CarSpecificationsTable { + public static carSpecifications: any = [ + { + id: 1, + carId: 1, + specId: 1, + value: 'purus sit amet nulla', + _userId: 1, + _createdDate: '07/14/2011', + _updatedDate: '07/27/2013' + }, { + id: 2, + carId: 1, + specId: 2, + value: 'nulla sed vel enim', + _userId: 2, + _createdDate: '09/29/2012', + _updatedDate: '09/25/2013' + }, { + id: 3, + carId: 1, + specId: 3, + value: 'id ornare', + _userId: 1, + _createdDate: '01/13/2016', + _updatedDate: '07/08/2010' + }, { + id: 4, + carId: 1, + specId: 4, + value: 'orci luctus et', + _userId: 1, + _createdDate: '06/20/2013', + _updatedDate: '05/09/2013' + }, { + id: 5, + carId: 1, + specId: 5, + value: 'convallis duis consequat dui nec', + _userId: 1, + _createdDate: '02/24/2014', + _updatedDate: '04/26/2016' + }, { + id: 6, + carId: 2, + specId: 6, + value: 'augue luctus', + _userId: 1, + _createdDate: '03/16/2017', + _updatedDate: '02/01/2018' + }, { + id: 7, + carId: 2, + specId: 7, + value: 'in tempus sit amet', + _userId: 1, + _createdDate: '01/24/2012', + _updatedDate: '03/14/2015' + }, { + id: 8, + carId: 2, + specId: 8, + value: 'venenatis turpis enim blandit mi', + _userId: 1, + _createdDate: '10/02/2017', + _updatedDate: '05/20/2011' + }, { + id: 9, + carId: 2, + specId: 9, + value: 'sed magna at nunc commodo', + _userId: 2, + _createdDate: '02/29/2012', + _updatedDate: '06/30/2015' + }, { + id: 10, + carId: 2, + specId: 0, + value: 'nascetur', + _userId: 1, + _createdDate: '11/26/2013', + _updatedDate: '12/03/2013' + }, { + id: 11, + carId: 3, + specId: 1, + value: 'magna vestibulum aliquet', + _userId: 2, + _createdDate: '06/23/2014', + _updatedDate: '07/11/2014' + }, { + id: 12, + carId: 3, + specId: 1, + value: 'bibendum imperdiet nullam orci', + _userId: 2, + _createdDate: '08/14/2013', + _updatedDate: '06/22/2017' + }, { + id: 13, + carId: 3, + specId: 2, + value: 'ligula pellentesque ultrices phasellus', + _userId: 2, + _createdDate: '05/03/2016', + _updatedDate: '06/08/2012' + }, { + id: 14, + carId: 3, + specId: 3, + value: 'in faucibus orci luctus', + _userId: 2, + _createdDate: '04/10/2016', + _updatedDate: '11/23/2011' + }, { + id: 15, + carId: 3, + specId: 4, + value: 'quis turpis sed ante', + _userId: 2, + _createdDate: '12/28/2015', + _updatedDate: '02/11/2011' + }, { + id: 16, + carId: 4, + specId: 5, + value: 'proin risus praesent lectus', + _userId: 2, + _createdDate: '04/25/2011', + _updatedDate: '08/26/2014' + }, { + id: 17, + carId: 4, + specId: 6, + value: 'morbi sem mauris laoreet', + _userId: 2, + _createdDate: '09/23/2012', + _updatedDate: '05/17/2018' + }, { + id: 18, + carId: 4, + specId: 7, + value: 'erat curabitur gravida', + _userId: 2, + _createdDate: '02/26/2015', + _updatedDate: '01/07/2014' + }, { + id: 19, + carId: 4, + specId: 8, + value: 'tellus nulla ut', + _userId: 1, + _createdDate: '12/08/2016', + _updatedDate: '10/08/2015' + }, { + id: 20, + carId: 4, + specId: 9, + value: 'tempus sit amet sem fusce', + _userId: 2, + _createdDate: '05/09/2011', + _updatedDate: '11/07/2011' + }, { + id: 21, + carId: 5, + specId: 0, + value: 'pellentesque ultrices phasellus', + _userId: 1, + _createdDate: '03/22/2011', + _updatedDate: '07/04/2010' + }, { + id: 22, + carId: 5, + specId: 1, + value: 'gravida', + _userId: 1, + _createdDate: '01/09/2018', + _updatedDate: '02/15/2011' + }, { + id: 23, + carId: 5, + specId: 1, + value: 'nulla', + _userId: 1, + _createdDate: '11/13/2012', + _updatedDate: '06/25/2017' + }, { + id: 24, + carId: 5, + specId: 2, + value: 'et ultrices posuere cubilia', + _userId: 2, + _createdDate: '02/24/2014', + _updatedDate: '12/11/2011' + }, { + id: 25, + carId: 5, + specId: 3, + value: 'nulla quisque arcu', + _userId: 2, + _createdDate: '12/16/2012', + _updatedDate: '02/08/2012' + }, { + id: 26, + carId: 6, + specId: 4, + value: 'orci eget orci vehicula', + _userId: 2, + _createdDate: '09/21/2015', + _updatedDate: '05/05/2014' + }, { + id: 27, + carId: 6, + specId: 5, + value: 'lobortis convallis', + _userId: 2, + _createdDate: '08/28/2014', + _updatedDate: '05/18/2011' + }, { + id: 28, + carId: 6, + specId: 6, + value: 'ipsum praesent blandit lacinia', + _userId: 1, + _createdDate: '06/14/2015', + _updatedDate: '12/28/2012' + }, { + id: 29, + carId: 6, + specId: 7, + value: 'tempus semper est quam pharetra', + _userId: 1, + _createdDate: '08/30/2017', + _updatedDate: '08/17/2016' + }, { + id: 30, + carId: 6, + specId: 8, + value: 'in felis eu sapien', + _userId: 2, + _createdDate: '11/18/2010', + _updatedDate: '09/20/2016' + }, { + id: 31, + carId: 7, + specId: 9, + value: 'nam', + _userId: 2, + _createdDate: '06/28/2015', + _updatedDate: '04/19/2011' + }, { + id: 32, + carId: 7, + specId: 0, + value: 'metus arcu', + _userId: 1, + _createdDate: '06/15/2017', + _updatedDate: '08/05/2012' + }, { + id: 33, + carId: 7, + specId: 1, + value: 'libero nullam', + _userId: 1, + _createdDate: '12/15/2014', + _updatedDate: '03/28/2013' + }, { + id: 34, + carId: 7, + specId: 1, + value: 'diam nam', + _userId: 1, + _createdDate: '08/28/2017', + _updatedDate: '08/24/2015' + }, { + id: 35, + carId: 7, + specId: 2, + value: 'iaculis congue vivamus metus', + _userId: 1, + _createdDate: '06/26/2010', + _updatedDate: '01/27/2012' + }, { + id: 36, + carId: 8, + specId: 3, + value: 'cum sociis natoque', + _userId: 1, + _createdDate: '07/04/2016', + _updatedDate: '12/24/2013' + }, { + id: 37, + carId: 8, + specId: 4, + value: 'odio odio elementum eu', + _userId: 1, + _createdDate: '06/03/2017', + _updatedDate: '11/21/2017' + }, { + id: 38, + carId: 8, + specId: 5, + value: 'at ipsum ac tellus', + _userId: 1, + _createdDate: '06/03/2014', + _updatedDate: '07/18/2014' + }, { + id: 39, + carId: 8, + specId: 6, + value: 'quis', + _userId: 2, + _createdDate: '12/25/2015', + _updatedDate: '10/10/2012' + }, { + id: 40, + carId: 8, + specId: 7, + value: 'justo aliquam quis turpis', + _userId: 2, + _createdDate: '04/22/2017', + _updatedDate: '01/16/2018' + }, { + id: 41, + carId: 9, + specId: 8, + value: 'adipiscing elit proin risus', + _userId: 2, + _createdDate: '02/26/2012', + _updatedDate: '03/07/2017' + }, { + id: 42, + carId: 9, + specId: 9, + value: 'nibh ligula nec sem duis', + _userId: 1, + _createdDate: '09/16/2013', + _updatedDate: '11/13/2011' + }, { + id: 43, + carId: 9, + specId: 0, + value: 'purus aliquet at feugiat', + _userId: 2, + _createdDate: '05/23/2018', + _updatedDate: '10/05/2014' + }, { + id: 44, + carId: 9, + specId: 1, + value: 'eros suspendisse accumsan tortor quis', + _userId: 2, + _createdDate: '10/14/2014', + _updatedDate: '08/02/2014' + }, { + id: 45, + carId: 9, + specId: 1, + value: 'eget rutrum', + _userId: 2, + _createdDate: '01/23/2017', + _updatedDate: '09/28/2012' + }, { + id: 46, + carId: 10, + specId: 2, + value: 'hendrerit at vulputate', + _userId: 1, + _createdDate: '10/20/2011', + _updatedDate: '10/09/2010' + }, { + id: 47, + carId: 10, + specId: 3, + value: 'et', + _userId: 1, + _createdDate: '12/25/2015', + _updatedDate: '08/26/2015' + }, { + id: 48, + carId: 10, + specId: 4, + value: 'volutpat in congue etiam', + _userId: 2, + _createdDate: '09/17/2010', + _updatedDate: '04/12/2016' + }, { + id: 49, + carId: 10, + specId: 5, + value: 'odio elementum eu', + _userId: 2, + _createdDate: '10/19/2015', + _updatedDate: '11/10/2017' + }, { + id: 50, + carId: 10, + specId: 6, + value: 'donec odio justo', + _userId: 2, + _createdDate: '06/18/2016', + _updatedDate: '01/26/2011' + }, { + id: 51, + carId: 11, + specId: 7, + value: 'nulla suspendisse potenti cras in', + _userId: 2, + _createdDate: '11/18/2010', + _updatedDate: '05/30/2017' + }, { + id: 52, + carId: 11, + specId: 8, + value: 'nisl', + _userId: 2, + _createdDate: '10/26/2010', + _updatedDate: '05/14/2015' + }, { + id: 53, + carId: 11, + specId: 9, + value: 'tincidunt ante', + _userId: 2, + _createdDate: '06/29/2016', + _updatedDate: '09/05/2010' + }, { + id: 54, + carId: 11, + specId: 0, + value: 'condimentum curabitur', + _userId: 1, + _createdDate: '05/25/2011', + _updatedDate: '09/29/2014' + }, { + id: 55, + carId: 11, + specId: 1, + value: 'mi nulla', + _userId: 2, + _createdDate: '12/06/2014', + _updatedDate: '05/20/2018' + }, { + id: 56, + carId: 12, + specId: 1, + value: 'tortor risus', + _userId: 1, + _createdDate: '09/26/2016', + _updatedDate: '08/07/2010' + }, { + id: 57, + carId: 12, + specId: 2, + value: 'quisque erat eros', + _userId: 1, + _createdDate: '03/18/2012', + _updatedDate: '03/27/2016' + }, { + id: 58, + carId: 12, + specId: 3, + value: 'ultrices posuere cubilia curae nulla', + _userId: 2, + _createdDate: '08/11/2010', + _updatedDate: '01/10/2013' + }, { + id: 59, + carId: 12, + specId: 4, + value: 'dapibus', + _userId: 1, + _createdDate: '02/15/2015', + _updatedDate: '10/19/2010' + }, { + id: 60, + carId: 12, + specId: 5, + value: 'pharetra magna vestibulum', + _userId: 2, + _createdDate: '05/30/2015', + _updatedDate: '11/13/2011' + }, { + id: 61, + carId: 13, + specId: 6, + value: 'lectus', + _userId: 2, + _createdDate: '07/20/2012', + _updatedDate: '03/10/2015' + }, { + id: 62, + carId: 13, + specId: 7, + value: 'eget vulputate', + _userId: 1, + _createdDate: '04/30/2017', + _updatedDate: '03/11/2016' + }, { + id: 63, + carId: 13, + specId: 8, + value: 'feugiat et eros', + _userId: 2, + _createdDate: '04/21/2018', + _updatedDate: '09/11/2011' + }, { + id: 64, + carId: 13, + specId: 9, + value: 'dis parturient', + _userId: 1, + _createdDate: '02/09/2011', + _updatedDate: '02/06/2011' + }, { + id: 65, + carId: 13, + specId: 0, + value: 'gravida', + _userId: 1, + _createdDate: '08/22/2013', + _updatedDate: '09/02/2012' + }, { + id: 66, + carId: 14, + specId: 1, + value: 'sed', + _userId: 1, + _createdDate: '09/18/2010', + _updatedDate: '06/10/2015' + }, { + id: 67, + carId: 14, + specId: 1, + value: 'in blandit', + _userId: 2, + _createdDate: '11/21/2017', + _updatedDate: '06/22/2016' + }, { + id: 68, + carId: 14, + specId: 2, + value: 'id', + _userId: 2, + _createdDate: '04/23/2014', + _updatedDate: '02/13/2018' + }, { + id: 69, + carId: 14, + specId: 3, + value: 'sapien', + _userId: 1, + _createdDate: '09/04/2011', + _updatedDate: '04/21/2012' + }, { + id: 70, + carId: 14, + specId: 4, + value: 'nec nisi volutpat eleifend donec', + _userId: 2, + _createdDate: '05/07/2017', + _updatedDate: '12/28/2015' + }, { + id: 71, + carId: 15, + specId: 5, + value: 'non', + _userId: 2, + _createdDate: '05/29/2017', + _updatedDate: '08/15/2014' + }, { + id: 72, + carId: 15, + specId: 6, + value: 'pharetra magna ac consequat metus', + _userId: 2, + _createdDate: '06/13/2016', + _updatedDate: '12/22/2014' + }, { + id: 73, + carId: 15, + specId: 7, + value: 'erat quisque erat eros', + _userId: 2, + _createdDate: '02/27/2013', + _updatedDate: '07/15/2012' + }, { + id: 74, + carId: 15, + specId: 8, + value: 'diam nam tristique tortor eu', + _userId: 1, + _createdDate: '01/07/2017', + _updatedDate: '09/24/2014' + }, { + id: 75, + carId: 15, + specId: 9, + value: 'semper sapien a libero nam', + _userId: 1, + _createdDate: '02/03/2016', + _updatedDate: '04/26/2015' + }, { + id: 76, + carId: 16, + specId: 0, + value: 'consequat varius', + _userId: 1, + _createdDate: '04/06/2014', + _updatedDate: '04/21/2013' + }, { + id: 77, + carId: 16, + specId: 1, + value: 'mauris morbi non', + _userId: 2, + _createdDate: '11/15/2017', + _updatedDate: '02/10/2017' + }, { + id: 78, + carId: 16, + specId: 1, + value: 'iaculis justo in hac habitasse', + _userId: 1, + _createdDate: '01/11/2013', + _updatedDate: '12/20/2010' + }, { + id: 79, + carId: 16, + specId: 2, + value: 'dui', + _userId: 1, + _createdDate: '02/29/2016', + _updatedDate: '04/20/2014' + }, { + id: 80, + carId: 16, + specId: 3, + value: 'pulvinar nulla pede ullamcorper augue', + _userId: 2, + _createdDate: '10/31/2013', + _updatedDate: '12/06/2010' + }, { + id: 81, + carId: 17, + specId: 4, + value: 'congue elementum', + _userId: 1, + _createdDate: '07/17/2013', + _updatedDate: '01/28/2014' + }, { + id: 82, + carId: 17, + specId: 5, + value: 'dapibus nulla suscipit ligula', + _userId: 2, + _createdDate: '08/24/2012', + _updatedDate: '02/04/2018' + }, { + id: 83, + carId: 17, + specId: 6, + value: 'donec ut dolor', + _userId: 1, + _createdDate: '01/10/2012', + _updatedDate: '06/07/2010' + }, { + id: 84, + carId: 17, + specId: 7, + value: 'non lectus aliquam sit amet', + _userId: 2, + _createdDate: '01/26/2014', + _updatedDate: '02/06/2016' + }, { + id: 85, + carId: 17, + specId: 8, + value: 'sapien iaculis congue vivamus', + _userId: 2, + _createdDate: '01/01/2018', + _updatedDate: '10/20/2012' + }, { + id: 86, + carId: 18, + specId: 9, + value: 'dui vel sem', + _userId: 1, + _createdDate: '04/04/2016', + _updatedDate: '01/19/2015' + }, { + id: 87, + carId: 18, + specId: 0, + value: 'posuere cubilia curae', + _userId: 2, + _createdDate: '06/03/2015', + _updatedDate: '12/22/2014' + }, { + id: 88, + carId: 18, + specId: 1, + value: 'nascetur ridiculus', + _userId: 1, + _createdDate: '03/05/2018', + _updatedDate: '08/04/2015' + }, { + id: 89, + carId: 18, + specId: 1, + value: 'vestibulum sagittis sapien cum sociis', + _userId: 1, + _createdDate: '12/26/2017', + _updatedDate: '07/08/2017' + }, { + id: 90, + carId: 18, + specId: 2, + value: 'neque vestibulum eget vulputate ut', + _userId: 2, + _createdDate: '09/22/2014', + _updatedDate: '06/08/2015' + }, { + id: 91, + carId: 19, + specId: 3, + value: 'habitasse platea', + _userId: 2, + _createdDate: '10/06/2011', + _updatedDate: '07/03/2017' + }, { + id: 92, + carId: 19, + specId: 4, + value: 'tortor sollicitudin', + _userId: 2, + _createdDate: '03/20/2014', + _updatedDate: '10/20/2015' + }, { + id: 93, + carId: 19, + specId: 5, + value: 'posuere cubilia curae nulla dapibus', + _userId: 1, + _createdDate: '04/27/2012', + _updatedDate: '08/03/2012' + }, { + id: 94, + carId: 19, + specId: 6, + value: 'nulla', + _userId: 1, + _createdDate: '08/16/2016', + _updatedDate: '11/02/2016' + }, { + id: 95, + carId: 19, + specId: 7, + value: 'vel dapibus at diam nam', + _userId: 2, + _createdDate: '08/24/2013', + _updatedDate: '03/02/2011' + }, { + id: 96, + carId: 20, + specId: 8, + value: 'ultrices posuere cubilia', + _userId: 1, + _createdDate: '07/04/2010', + _updatedDate: '06/07/2010' + }, { + id: 97, + carId: 20, + specId: 9, + value: 'ut blandit non interdum', + _userId: 2, + _createdDate: '04/25/2018', + _updatedDate: '06/24/2013' + }, { + id: 98, + carId: 20, + specId: 0, + value: 'amet erat', + _userId: 2, + _createdDate: '07/13/2017', + _updatedDate: '12/28/2014' + }, { + id: 99, + carId: 20, + specId: 1, + value: 'ligula', + _userId: 1, + _createdDate: '03/18/2015', + _updatedDate: '09/14/2012' + }, { + id: 100, + carId: 20, + specId: 1, + value: 'id', + _userId: 1, + _createdDate: '04/02/2011', + _updatedDate: '02/16/2017' + }]; +} diff --git a/src/app/core/e-commerce/_server/cars.table.ts b/src/app/core/e-commerce/_server/cars.table.ts new file mode 100644 index 0000000..6faa3d6 --- /dev/null +++ b/src/app/core/e-commerce/_server/cars.table.ts @@ -0,0 +1,583 @@ +export class CarsTable { + public static cars: any = [ + { + id: 1, + model: 'Elise', + manufacture: 'Lotus', + modelYear: 2004, + mileage: 116879, + // tslint:disable-next-line:max-line-length + description: `The Lotus Elise first appeared in 1996 and revolutionised small sports car design with its lightweight extruded aluminium chassis and composite body. There have been many variations, but the basic principle remain the same.`, + color: 'Red', + price: 18347, + condition: 1, + createdDate: '09/30/2017', + status: 0, + VINCode: '1FTWX3D52AE575540', + _userId: 1, + _createdDate: '03/31/2015', + _updatedDate: '05/08/2015' + }, { + id: 2, + model: 'Sunbird', + manufacture: 'Pontiac', + modelYear: 1984, + mileage: 99515, + // tslint:disable-next-line:max-line-length + description: `The Pontiac Sunbird is an automobile that was produced by Pontiac, initially as a subcompact for the 1976 to 1980 model years,and later as a compact for the 1982 to 1994 model years. The Sunbird badge ran for 18 years (with a hiatus during the 1981 and 1982 model years, as the 1982 model was called J2000) and was then replaced in 1995 by the Pontiac Sunfire. Through the years the Sunbird was available in notchback coupé, sedan, hatchback, station wagon, and convertible body styles.`, + color: 'Khaki', + price: 165956, + condition: 0, + createdDate: '03/22/2018', + status: 1, + VINCode: 'JM1NC2EF8A0293556', + _userId: 1, + _createdDate: '11/11/2016', + _updatedDate: '09/01/2016' + }, { + id: 3, + model: 'Amigo', + manufacture: 'Isuzu', + modelYear: 1993, + mileage: 138027, + // tslint:disable-next-line:max-line-length + description: `The Isuzu MU is a mid-size SUV that was produced by the Japan-based manufacturer Isuzu. The three-door MU was introduced in 1989, followed in 1990 by the five-door version called Isuzu MU Wizard, both of which stopped production in 1998 to be replaced by a second generation. This time, the five-door version dropped the "MU" prefix, to become the Isuzu Wizard. The acronym "MU" is short for "Mysterious Utility". Isuzu manufactured several variations to the MU and its derivates for sale in other countries.`, + color: 'Aquamarine', + price: 45684, + condition: 0, + createdDate: '03/06/2018', + status: 0, + VINCode: '1G6DG8E56C0973889', + _userId: 1, + _createdDate: '08/14/2012', + _updatedDate: '03/21/2013' + }, { + id: 4, + model: 'LS', + manufacture: 'Lexus', + modelYear: 2004, + mileage: 183068, + // tslint:disable-next-line:max-line-length + description: `The Lexus LS (Japanese: レクサス・LS, Rekusasu LS) is a full-size luxury car (F-segment in Europe) serving as the flagship model of Lexus, the luxury division of Toyota. For the first four generations, all LS models featured V8 engines and were predominantly rear-wheel-drive, with Lexus also offering all-wheel-drive, hybrid, and long-wheelbase variants. The fifth generation changed to using a V6 engine with no V8 option, and the long wheelbase variant was removed entirely.`, + color: 'Mauv', + price: 95410, + condition: 1, + createdDate: '02/03/2018', + status: 1, + VINCode: '2T1BU4EE6DC859114', + _userId: 2, + _createdDate: '11/25/2012', + _updatedDate: '08/15/2013' + }, { + id: 5, + model: 'Paseo', + manufacture: 'Toyota', + modelYear: 1997, + mileage: 74884, + // tslint:disable-next-line:max-line-length + description: `The Toyota Paseo (known as the Cynos in Japan and other regions) is a sports styled compact car sold from 1991–1999 and was loosely based on the Tercel. It was available as a coupe and in later models as a convertible. Toyota stopped selling the car in the United States in 1997, however the car continued to be sold in Canada, Europe and Japan until 1999, but had no direct replacement. The Paseo, like the Tercel, shares a platform with the Starlet. Several parts are interchangeable between the three`, + color: 'Pink', + price: 24796, + condition: 1, + createdDate: '08/13/2017', + status: 0, + VINCode: '1D7RB1GP0AS597432', + _userId: 1, + _createdDate: '11/21/2016', + _updatedDate: '10/09/2012' + }, { + id: 6, + model: 'M', + manufacture: 'Infiniti', + modelYear: 2009, + mileage: 194846, + // tslint:disable-next-line:max-line-length + description: `The Infiniti M is a line of mid-size luxury (executive) cars from the Infiniti luxury division of Nissan.\r\nThe first iteration was the M30 Coupe/Convertible, which were rebadged JDM Nissan Leopard.\r\nAfter a long hiatus, the M nameplate was used for Infiniti's mid-luxury sedans (executive cars). First was the short-lived M45 sedan, a rebadged version of the Japanese-spec Nissan Gloria. The next generations, the M35/45 and M37/56/35h/30d, became the flagship of the Infiniti brand and are based on the JDM Nissan Fuga.`, + color: 'Puce', + price: 30521, + condition: 1, + createdDate: '01/27/2018', + status: 0, + VINCode: 'YV1940AS1D1542424', + _userId: 2, + _createdDate: '03/13/2016', + _updatedDate: '12/14/2013' + }, { + id: 7, + model: 'Phantom', + manufacture: 'Rolls-Royce', + modelYear: 2008, + mileage: 164124, + // tslint:disable-next-line:max-line-length + description: `The Rolls-Royce Phantom VIII is a luxury saloon car manufactured by Rolls-Royce Motor Cars. It is the eighth and current generation of Rolls-Royce Phantom, and the second launched by Rolls-Royce under BMW ownership. It is offered in two wheelbase lengths`, + color: 'Purple', + price: 196247, + condition: 1, + createdDate: '09/28/2017', + status: 1, + VINCode: '3VWML7AJ1DM234625', + _userId: 2, + _createdDate: '03/31/2012', + _updatedDate: '06/27/2014' + }, { + id: 8, + model: 'QX', + manufacture: 'Infiniti', + modelYear: 2002, + mileage: 57410, + // tslint:disable-next-line:max-line-length + description: `The Infiniti QX80 (called the Infiniti QX56 until 2013) is a full-size luxury SUV built by Nissan Motor Company's Infiniti division. The naming convention originally adhered to the current trend of using a numeric designation derived from the engine's displacement, thus QX56 since the car has a 5.6-liter engine. From the 2014 model year, the car was renamed the QX80, as part of Infiniti's model name rebranding. The new name carries no meaning beyond suggesting that the vehicle is larger than smaller models such as the QX60`, + color: 'Green', + price: 185775, + condition: 1, + createdDate: '11/15/2017', + status: 0, + VINCode: 'WDDHF2EB9CA161524', + _userId: 1, + _createdDate: '03/17/2013', + _updatedDate: '09/05/2014' + }, { + id: 9, + model: 'Daytona', + manufacture: 'Dodge', + modelYear: 1993, + mileage: 4444, + // tslint:disable-next-line:max-line-length + description: `The Dodge Daytona was an automobile which was produced by the Chrysler Corporation under their Dodge division from 1984 to 1993. It was a front-wheel drive hatchback based on the Chrysler G platform, which was derived from the Chrysler K platform. The Chrysler Laser was an upscale rebadged version of the Daytona. The Daytona was restyled for 1987, and again for 1992. It replaced the Mitsubishi Galant-based Challenger, and slotted between the Charger and the Conquest. The Daytona was replaced by the 1995 Dodge Avenger, which was built by Mitsubishi Motors. The Daytona derives its name mainly from the Dodge Charger Daytona, which itself was named after the Daytona 500 race in Daytona Beach, Florida.`, + color: 'Maroon', + price: 171898, + condition: 0, + createdDate: '12/24/2017', + status: 1, + VINCode: 'WBAET37422N752051', + _userId: 2, + _createdDate: '11/17/2012', + _updatedDate: '03/17/2018' + }, { + id: 10, + model: '1500 Silverado', + manufacture: 'Chevrolet', + modelYear: 1999, + mileage: 195310, + // tslint:disable-next-line:max-line-length + description: `The Chevrolet Silverado, and its mechanically identical cousin, the GMC Sierra, are a series of full-size and heavy-duty pickup trucks manufactured by General Motors and introduced in 1998 as the successor to the long-running Chevrolet C/K line. The Silverado name was taken from a trim level previously used on its predecessor, the Chevrolet C/K pickup truck from 1975 through 1998. General Motors continues to offer a GMC-badged variant of the Chevrolet full-size pickup under the GMC Sierra name, first used in 1987 for its variant of the GMT400 platform trucks.`, + color: 'Blue', + price: 25764, + condition: 0, + createdDate: '08/30/2017', + status: 1, + VINCode: '1N6AF0LX6EN590806', + _userId: 2, + _createdDate: '10/06/2013', + _updatedDate: '03/27/2017' + }, { + id: 11, + model: 'CTS', + manufacture: 'Cadillac', + modelYear: 2012, + mileage: 170862, + // tslint:disable-next-line:max-line-length + description: `The Cadillac CTS is a mid-size luxury car / executive car designed, engineered, manufactured and marketed by General Motors, and now in its third generation. \r\nInitially available only as a 4-door sedan on the GM Sigma platform, GM had offered the second generation CTS in three body styles: 4-door sedan, 2-door coupe, and 5-door sport wagon also using the Sigma platform — and the third generation in coupe and sedan configurations, using a stretched version of the GM Alpha platform.\r\nWayne Cherry and Kip Wasenko designed the exterior of the first generation CTS, marking the production debut of a design language (marketed as "Art and Science") first seen on the Evoq concept car. Bob Boniface and Robin Krieg designed the exterior of the third generation CTS`, + color: 'Crimson', + price: 80588, + condition: 0, + createdDate: '02/15/2018', + status: 0, + VINCode: '1G4HR54KX4U506530', + _userId: 2, + _createdDate: '09/04/2016', + _updatedDate: '09/17/2012' + }, { + id: 12, + model: 'Astro', + manufacture: 'Chevrolet', + modelYear: 1995, + mileage: 142137, + // tslint:disable-next-line:max-line-length + description: `The Chevrolet Astro was a rear-wheel drive van/minivan manufactured and marketed by the American automaker Chevrolet from 1985 to 2005 and over two build generations. Along with its rebadged variant, the GMC Safari, the Astro was marketed in passenger as well as cargo and livery configurations—featuring a V6 engine, unibody construction with a separate front engine/suspension sub-frame, leaf-spring rear suspension, rear bi-parting doors, and a seating capacity of up to eight passengers`, + color: 'Teal', + price: 72430, + condition: 1, + createdDate: '07/31/2017', + status: 0, + VINCode: 'KMHGH4JH2DU676107', + _userId: 1, + _createdDate: '02/12/2013', + _updatedDate: '01/26/2017' + }, { + id: 13, + model: 'XL7', + manufacture: 'Suzuki', + modelYear: 2009, + mileage: 165165, + // tslint:disable-next-line:max-line-length + description: `The Suzuki XL-7 (styled as XL7 for the second generation) is Suzuki's mid-sized SUV that was made from 1998 to 2009, over two generations. It was slotted above the Grand Vitara in Suzuki's lineup.`, + color: 'Puce', + price: 118667, + condition: 0, + createdDate: '02/04/2018', + status: 0, + VINCode: '1N6AF0LX9EN733005', + _userId: 2, + _createdDate: '10/31/2015', + _updatedDate: '08/24/2015' + }, { + id: 14, + model: 'SJ 410', + manufacture: 'Suzuki', + modelYear: 1984, + mileage: 176074, + // tslint:disable-next-line:max-line-length + description: `The SJ-Series was introduced to the United States (Puerto Rico (SJ-410) and Canada earlier) in 1985 for the 1986 model year. It was priced at $6200 and 47,000 were sold in its first year. The Samurai had a 1.3 liter, 63 hp (47 kW), 4-cylinder engine and was available as a convertible or a hardtop, and with or without a rear seat. The Suzuki Samurai became intensely popular within the serious 4WD community for its good off-road performance and reliability compared to other 4WDs of the time. This is due to the fact that while very compact and light, it is a real 4WD vehicle equipped with a transfer case, switchable 4WD and low range. Its lightness makes it a very nimble off-roader less prone to sinking in softer ground than heavier types. It is also considered a great beginner off-roader due to its simple design and ease of engine and suspension modifications.`, + color: 'Orange', + price: 84325, + condition: 0, + createdDate: '12/22/2017', + status: 0, + VINCode: '2C3CDYBT6DH183756', + _userId: 1, + _createdDate: '05/30/2010', + _updatedDate: '01/02/2014' + }, { + id: 15, + model: 'F-Series', + manufacture: 'Ford', + modelYear: 1995, + mileage: 53030, + // tslint:disable-next-line:max-line-length + description: `The Ford F-Series is a series of light-duty trucks and medium-duty trucks (Class 2-7) that have been marketed and manufactured by Ford Motor Company since 1948. While most variants of the F-Series trucks are full-size pickup trucks, the F-Series also includes chassis cab trucks and commercial vehicles. The Ford F-Series has been the best-selling vehicle in the United States since 1986 and the best-selling pickup since 1977.[1][2] It is also the best selling vehicle in Canada.[3] As of the 2018 model year, the F-Series generates $41.0 billion in annual revenue for Ford, making the F-Series brand more valuable than Coca-Cola and Nike.`, + color: 'Aquamarine', + price: 77108, + condition: 0, + createdDate: '01/09/2018', + status: 0, + VINCode: 'WBAVB33526P873481', + _userId: 1, + _createdDate: '12/29/2016', + _updatedDate: '02/14/2012' + }, { + id: 16, + model: 'HS', + manufacture: 'Lexus', + modelYear: 2011, + mileage: 84718, + // tslint:disable-next-line:max-line-length + description: `The Lexus HS (Japanese: レクサス・HS, Rekusasu HS) is a dedicated hybrid vehicle introduced by Lexus as a new entry-level luxury compact sedan in 2009.[2] Built on the Toyota New MC platform,[3] it is classified as a compact under Japanese regulations concerning vehicle exterior dimensions and engine displacement. Unveiled at the North American International Auto Show in January 2009, the HS 250h went on sale in July 2009 in Japan, followed by the United States in August 2009 as a 2010 model. The HS 250h represented the first dedicated hybrid vehicle in the Lexus lineup, as well as the first offered with an inline-four gasoline engine.[4] Bioplastic materials are used for the vehicle interior.[5] With a total length of 184.8 inches, the Lexus HS is slightly larger than the Lexus IS, but still smaller than the mid-size Lexus ES.`, + color: 'Purple', + price: 140170, + condition: 0, + createdDate: '11/14/2017', + status: 1, + VINCode: '1FTWF3A56AE545514', + _userId: 1, + _createdDate: '12/19/2014', + _updatedDate: '11/09/2014' + }, { + id: 17, + model: 'Land Cruiser', + manufacture: 'Toyota', + modelYear: 2008, + mileage: 157019, + // tslint:disable-next-line:max-line-length + description: `Production of the first generation Land Cruiser began in 1951 (90 units) as Toyota's version of a Jeep-like vehicle.[2][3] The Land Cruiser has been produced in convertible, hardtop, station wagon and cab chassis versions. The Land Cruiser's reliability and longevity has led to huge popularity, especially in Australia where it is the best-selling body-on-frame, four-wheel drive vehicle.[4] Toyota also extensively tests the Land Cruiser in the Australian outback – considered to be one of the toughest operating environments in both temperature and terrain. In Japan, the Land Cruiser is exclusive to Toyota Japanese dealerships called Toyota Store.`, + color: 'Crimson', + price: 72638, + condition: 1, + createdDate: '08/08/2017', + status: 1, + VINCode: '3C3CFFDR2FT957799', + _userId: 1, + _createdDate: '05/30/2010', + _updatedDate: '11/06/2012' + }, { + id: 18, + model: 'Wrangler', + manufacture: 'Jeep', + modelYear: 1994, + mileage: 55857, + // tslint:disable-next-line:max-line-length + description: `The Jeep Wrangler is a series of compact and mid-size (Wrangler Unlimited and Wrangler 4-door JL) four-wheel drive off-road vehicle models, manufactured by Jeep since 1986, and currently migrating from its third into its fourth generation. The Wrangler JL was unveiled in late 2017 and will be produced at Jeep's Toledo Complex.`, + color: 'Red', + price: 193523, + condition: 0, + createdDate: '02/28/2018', + status: 1, + VINCode: '3C4PDCAB7FT652291', + _userId: 1, + _createdDate: '10/26/2011', + _updatedDate: '10/04/2016' + }, { + id: 19, + model: 'Sunbird', + manufacture: 'Pontiac', + modelYear: 1994, + mileage: 165202, + // tslint:disable-next-line:max-line-length + description: `The Pontiac Sunbird is an automobile that was produced by Pontiac, initially as a subcompact for the 1976 to 1980 model years, and later as a compact for the 1982 to 1994 model years. The Sunbird badge ran for 18 years (with a hiatus during the 1981 and 1982 model years, as the 1982 model was called J2000) and was then replaced in 1995 by the Pontiac Sunfire. Through the years the Sunbird was available in notchback coupé, sedan, hatchback, station wagon, and convertible body styles.`, + color: 'Blue', + price: 198739, + condition: 0, + createdDate: '05/13/2017', + status: 1, + VINCode: '1GD22XEG9FZ103872', + _userId: 2, + _createdDate: '07/24/2013', + _updatedDate: '10/03/2013' + }, { + id: 20, + model: 'A4', + manufacture: 'Audi', + modelYear: 1998, + mileage: 117958, + // tslint:disable-next-line:max-line-length + description: `The A4 has been built in five generations and is based on the Volkswagen Group B platform. The first generation A4 succeeded the Audi 80. The automaker's internal numbering treats the A4 as a continuation of the Audi 80 lineage, with the initial A4 designated as the B5-series, followed by the B6, B7, B8 and the B9. The B8 and B9 versions of the A4 are built on the Volkswagen Group MLB platform shared with many other Audi models and potentially one Porsche model within Volkswagen Group`, + color: 'Yellow', + price: 159377, + condition: 0, + createdDate: '12/15/2017', + status: 1, + VINCode: '2C3CDXCT2FH350366', + _userId: 2, + _createdDate: '12/04/2014', + _updatedDate: '03/07/2014' + }, { + id: 21, + model: 'Camry Solara', + manufacture: 'Toyota', + modelYear: 2006, + mileage: 22436, + // tslint:disable-next-line:max-line-length + description: `The Toyota Camry Solara, popularly known as the Toyota Solara, is a mid-size coupe/convertible built by Toyota. The Camry Solara is mechanically based on the Toyota Camry and effectively replaced the discontinued Camry Coupe (XV10); however, in contrast with its predecessor's conservative design, the Camry Solara was designed with a greater emphasis on sportiness, with more rakish styling, and uprated suspension and engine tuning intended to provide a sportier feel.[5] The coupe was launched in late 1998 as a 1999 model.[1] In 2000, the convertible was introduced, effectively replacing the Celica convertible in Toyota's North American lineup`, + color: 'Green', + price: 122562, + condition: 0, + createdDate: '07/11/2017', + status: 0, + VINCode: '3C3CFFHH6DT874066', + _userId: 2, + _createdDate: '03/21/2018', + _updatedDate: '02/23/2014' + }, { + id: 22, + model: 'Tribeca', + manufacture: 'Subaru', + modelYear: 2007, + mileage: 127958, + // tslint:disable-next-line:max-line-length + description: `The Subaru Tribeca is a mid-size crossover SUV made from 2005 to 2014. Released in some markets, including Canada, as the Subaru B9 Tribeca, the name "Tribeca" derives from the Tribeca neighborhood of New York City.[1] Built on the Subaru Legacy platform and sold in five- and seven-seat configurations, the Tribeca was intended to be sold alongside a slightly revised version known as the Saab 9-6. Saab, at the time a subsidiary of General Motors (GM), abandoned the 9-6 program just prior to its release subsequent to GM's 2005 divestiture of its 20 percent stake in FHI.`, + color: 'Yellow', + price: 90221, + condition: 1, + createdDate: '11/12/2017', + status: 0, + VINCode: 'WVWGU7AN9AE957575', + _userId: 1, + _createdDate: '07/04/2011', + _updatedDate: '08/25/2013' + }, { + id: 23, + model: '1500 Club Coupe', + manufacture: 'GMC', + modelYear: 1997, + mileage: 95783, + // tslint:disable-next-line:max-line-length + description: `GMC (General Motors Truck Company), formally the GMC Division of General Motors LLC, is a division of the American automobile manufacturer General Motors (GM) that primarily focuses on trucks and utility vehicles. GMC sells pickup and commercial trucks, buses, vans, military vehicles, and sport utility vehicles marketed worldwide by General Motors.`, + color: 'Teal', + price: 64376, + condition: 1, + createdDate: '06/28/2017', + status: 0, + VINCode: 'SCFBF04BX7G920997', + _userId: 2, + _createdDate: '02/21/2017', + _updatedDate: '01/29/2015' + }, { + id: 24, + model: 'Firebird', + manufacture: 'Pontiac', + modelYear: 2002, + mileage: 74063, + // tslint:disable-next-line:max-line-length + description: `The Pontiac Firebird is an American automobile built by Pontiac from the 1967 to the 2002 model years. Designed as a pony car to compete with the Ford Mustang, it was introduced 23 February 1967, the same model year as GM's Chevrolet division platform-sharing Camaro.[1] This also coincided with the release of the 1967 Mercury Cougar, Ford's upscale, platform-sharing version of the Mustang. The name "Firebird" was also previously used by GM for the General Motors Firebird 1950s and early-1960s`, + color: 'Puce', + price: 94178, + condition: 1, + createdDate: '09/13/2017', + status: 0, + VINCode: '3C63D2JL5CG563879', + _userId: 2, + _createdDate: '05/11/2014', + _updatedDate: '11/24/2012' + }, { + id: 25, + model: 'RAV4', + manufacture: 'Toyota', + modelYear: 1996, + mileage: 99461, + // tslint:disable-next-line:max-line-length + description: `The Toyota RAV4 (Japanese: トヨタ RAV4 Toyota Ravufō) is a compact crossover SUV (sport utility vehicle) produced by the Japanese automobile manufacturer Toyota. This was the first compact crossover SUV;[1] it made its debut in Japan and Europe in 1994,[2] and in North America in 1995. The vehicle was designed for consumers wanting a vehicle that had most of the benefits of SUVs, such as increased cargo room, higher visibility, and the option of full-time four-wheel drive, along with the maneuverability and fuel economy of a compact car. Although not all RAV4s are four-wheel-drive, RAV4 stands for "Recreational Activity Vehicle: 4-wheel drive", because the aforementioned equipment is an option in select countries`, + color: 'Goldenrod', + price: 48342, + condition: 0, + createdDate: '12/29/2017', + status: 0, + VINCode: '2C4RDGDG6DR836144', + _userId: 2, + _createdDate: '04/23/2011', + _updatedDate: '07/19/2016' + }, { + id: 26, + model: 'Amanti / Opirus', + manufacture: 'Kia', + modelYear: 2007, + mileage: 189651, + // tslint:disable-next-line:max-line-length + description: `The Kia Opirus was an executive car manufactured and marketed by Kia Motors that was launched in April 2003 and was marketed globally under various nameplates, prominently as the Amanti. It was considered to be Kia's flagship vehicle.`, + color: 'Indigo', + price: 44292, + condition: 1, + createdDate: '09/01/2017', + status: 1, + VINCode: '1C4SDHCT2CC055294', + _userId: 2, + _createdDate: '04/09/2018', + _updatedDate: '04/17/2014' + }, { + id: 27, + model: 'S60', + manufacture: 'Volvo', + modelYear: 2001, + mileage: 78963, + // tslint:disable-next-line:max-line-length + description: `First introduced in 2004, Volvo's S60 R used a Haldex all-wheel-drive system mated to a 300 PS (221 kW; 296 hp) / 400 N⋅m (300 lbf⋅ft) inline-5. The 2004–2005 models came with a 6-speed manual transmission, or an available 5-speed automatic which allowed only 258 lb⋅ft (350 N⋅m) torque in 1st and 2nd gears. The 2006–2007 models came with a 6-speed manual or 6-speed automatic transmission (which was no longer torque-restricted)`, + color: 'Goldenrod', + price: 9440, + condition: 0, + createdDate: '11/06/2017', + status: 0, + VINCode: '3C6TD5CT5CG316067', + _userId: 2, + _createdDate: '01/11/2016', + _updatedDate: '04/18/2013' + }, { + id: 28, + model: 'Grand Marquis', + manufacture: 'Mercury', + modelYear: 1984, + mileage: 153027, + // tslint:disable-next-line:max-line-length + description: `The Mercury Grand Marquis is an automobile that was sold by the Mercury division of Ford Motor Company from 1975 to 2011. From 1975 to 1982, it was the premium model of the Mercury Marquis model line, becoming a standalone model line in 1983. For its entire production run, the Grand Marquis served as the flagship of the Mercury line, with the Ford (LTD) Crown Victoria serving as its Ford counterpart. In addition, from 1979 to 2011, the Grand Marquis shared the rear-wheel drive Panther platform alongside the Lincoln Town Car`, + color: 'Goldenrod', + price: 76027, + condition: 0, + createdDate: '12/16/2017', + status: 1, + VINCode: '3C3CFFJH2DT871398', + _userId: 1, + _createdDate: '04/04/2014', + _updatedDate: '08/24/2017' + }, { + id: 29, + model: 'Talon', + manufacture: 'Eagle', + modelYear: 1991, + mileage: 111234, + // tslint:disable-next-line:max-line-length + description: `Cosmetically, differences between the three were found in wheels, availability of colors, tail lights, front and rear bumpers, and spoilers. The Talon featured two-tone body color with a black 'greenhouse' (roof, pillars, door-mounted mirrors) regardless of the body color. The variants featured 5-speed manual or 4-speed automatic transmissions and a hood bulge on the left-hand side of the car in order for camshaft clearance on the 4G63 engine. The base model DL did not use this engine but still had a bulge as evident in the 1992 Talon brochure. 2nd Generation cars all had such a bulge, even with the inclusion of the 420A engine`, + color: 'Teal', + price: 157216, + condition: 0, + createdDate: '05/08/2017', + status: 1, + VINCode: 'YV1902FH1D2957659', + _userId: 1, + _createdDate: '04/16/2017', + _updatedDate: '01/14/2011' + }, { + id: 30, + model: 'Passport', + manufacture: 'Honda', + modelYear: 2002, + mileage: 3812, + // tslint:disable-next-line:max-line-length + description: `The Passport was a part of a partnership between Isuzu and Honda in the 1990s, which saw an exchange of passenger vehicles from Honda to Isuzu, such as the Isuzu Oasis, and trucks from Isuzu to Honda, such as the Passport and Acura SLX. This arrangement was convenient for both companies, as Isuzu discontinued passenger car production in 1993 after a corporate restructuring, and Honda was in desperate need a SUV, a segment that was growing in popularity in North America as well as Japan during the 1990s. The partnership ended in 2002 with the discontinuation of the Passport in favor of the Honda-engineered Pilot`, + color: 'Puce', + price: 41299, + condition: 1, + createdDate: '03/08/2018', + status: 0, + VINCode: 'WVWEU9AN4AE524071', + _userId: 2, + _createdDate: '07/31/2015', + _updatedDate: '07/03/2017' + }, { + id: 31, + model: 'H3', + manufacture: 'Hummer', + modelYear: 2006, + mileage: 196321, + // tslint:disable-next-line:max-line-length + description: `The Hummer H3 is a sport utility vehicle/off-road vehicle from Hummer that was produced from 2005 to 2010. Introduced for the 2006 model year, it was based on a highly modified GMT355 underpinning the Chevrolet Colorado/GMC Canyon compact pickup trucks that were also built at GM's Shreveport Operations in Shreveport, Louisiana and the Port Elizabeth plant in South Africa. The H3 was actually the smallest among the Hummer models. It was available either as a traditional midsize SUV or as a midsize pickup known as the H3T`, + color: 'Pink', + price: 186964, + condition: 1, + createdDate: '06/04/2017', + status: 1, + VINCode: '4T1BF1FK4FU746230', + _userId: 2, + _createdDate: '03/09/2014', + _updatedDate: '02/10/2017' + }, { + id: 32, + model: 'Comanche', + manufacture: 'Jeep', + modelYear: 1992, + mileage: 72285, + // tslint:disable-next-line:max-line-length + description: `The Jeep Comanche (designated MJ) is a pickup truck variant of the Cherokee compact SUV (1984–2001)[3] manufactured and marketed by Jeep for model years 1986-1992 in rear wheel (RWD) and four-wheel drive (4WD) models as well as two cargo bed lengths: six-feet (1.83 metres) and seven-feet (2.13 metres)`, + color: 'Mauv', + price: 145971, + condition: 1, + createdDate: '09/01/2017', + status: 0, + VINCode: '1J4PN2GK1BW745045', + _userId: 2, + _createdDate: '07/27/2013', + _updatedDate: '09/23/2016' + }, { + id: 33, + model: 'Blazer', + manufacture: 'Chevrolet', + modelYear: 1993, + mileage: 189804, + // tslint:disable-next-line:max-line-length + description: `The 2014 – 2nd generation, MY14 Duramax 2.8L diesel engines have several new parts, namely a new water-cooled variable-geometry turbocharger, a new high-pressure common-rail fuel delivery system, a new exhaust gas recirculation (EGR) system, a new intake manifold, a new cylinder head, a new cylinder block, a new balance shaft unit and a new Engine Control Module (ECM). and now produce 197 hp and 369 Ft/Lbs of torque`, + color: 'Indigo', + price: 154594, + condition: 0, + createdDate: '09/13/2017', + status: 0, + VINCode: '1G6KD57Y43U482896', + _userId: 1, + _createdDate: '05/27/2017', + _updatedDate: '05/17/2016' + }, { + id: 34, + model: 'Envoy XUV', + manufacture: 'GMC', + modelYear: 2004, + mileage: 187960, + // tslint:disable-next-line:max-line-length + description: `The GMC Envoy is a mid-size SUV that was produced by General Motors. It was introduced for the 1998 model year. After the first generation Envoy was discontinued after the 2000 model year, but the Envoy was reintroduced and redesigned for the 2002 model year, and it was available in the GMC line of vehicles from the 2002 to 2009 model years`, + color: 'Turquoise', + price: 185103, + condition: 1, + createdDate: '12/07/2017', + status: 0, + VINCode: '5GAER23D09J658030', + _userId: 2, + _createdDate: '12/08/2017', + _updatedDate: '06/15/2011' + } + ]; +} diff --git a/src/app/core/e-commerce/_server/customers.table.ts b/src/app/core/e-commerce/_server/customers.table.ts new file mode 100644 index 0000000..e3bff7a --- /dev/null +++ b/src/app/core/e-commerce/_server/customers.table.ts @@ -0,0 +1,1504 @@ +export class CustomersTable { + public static customers: any = [ + { + id: 1, + firstName: 'Sonni', + lastName: 'Gabotti', + email: 'sgabotti0@wsj.com', + userName: 'sgabotti0', + gender: 'Female', + status: 0, + dateOfBbirth: '10/14/1950', + ipAddress: '251.237.126.210', + type: 1, + _userId: 1, + _createdDate: '09/07/2016', + _updatedDate: '05/31/2013' + }, + { + id: 2, + firstName: 'Abie', + lastName: 'Cowperthwaite', + email: 'acowperthwaite1@storify.com', + userName: 'acowperthwaite1', + gender: 'Male', + status: 1, + dateOfBbirth: '12/31/1998', + ipAddress: '239.176.5.218', + type: 1, + _userId: 2, + _createdDate: '03/18/2014', + _updatedDate: '08/17/2016' + }, + { + id: 3, + firstName: 'Melody', + lastName: 'Stodd', + email: 'mstodd2@twitpic.com', + userName: 'mstodd2', + gender: 'Female', + status: 0, + dateOfBbirth: '7/3/1957', + ipAddress: '14.80.25.15', + type: 1, + _userId: 1, + _createdDate: '07/03/2015', + _updatedDate: '01/28/2015' + }, + { + id: 4, + firstName: 'Naomi', + lastName: 'Galbreth', + email: 'ngalbreth3@springer.com', + userName: 'ngalbreth3', + gender: 'Female', + status: 2, + dateOfBbirth: '12/30/1976', + ipAddress: '239.198.18.122', + type: 0, + _userId: 2, + _createdDate: '06/22/2013', + _updatedDate: '01/31/2011' + }, + { + id: 5, + firstName: 'Ashley', + lastName: 'Jandl', + email: 'ajandl4@mapy.cz', + userName: 'ajandl4', + gender: 'Female', + status: 1, + dateOfBbirth: '11/23/1996', + ipAddress: '11.19.64.48', + type: 1, + _userId: 1, + _createdDate: '01/30/2018', + _updatedDate: '05/22/2014' + }, + { + id: 6, + firstName: 'Mildrid', + lastName: 'Duplan', + email: 'mduplan5@msn.com', + userName: 'mduplan5', + gender: 'Female', + status: 1, + dateOfBbirth: '4/21/1954', + ipAddress: '104.18.128.93', + type: 1, + _userId: 1, + _createdDate: '03/27/2011', + _updatedDate: '09/02/2015' + }, + { + id: 7, + firstName: 'Dall', + lastName: 'Stow', + email: 'dstow6@vistaprint.com', + userName: 'dstow6', + gender: 'Male', + status: 2, + dateOfBbirth: '4/14/1998', + ipAddress: '168.199.143.20', + type: 1, + _userId: 1, + _createdDate: '09/05/2011', + _updatedDate: '06/21/2012' + }, + { + id: 8, + firstName: 'Burton', + lastName: 'Dering', + email: 'bdering7@europa.eu', + userName: 'bdering7', + gender: 'Male', + status: 1, + dateOfBbirth: '8/15/1963', + ipAddress: '204.7.174.42', + type: 0, + _userId: 1, + _createdDate: '09/09/2017', + _updatedDate: '06/27/2011' + }, + { + id: 9, + firstName: 'Wolf', + lastName: 'Blackaller', + email: 'wblackaller8@biblegateway.com', + userName: 'wblackaller8', + gender: 'Male', + status: 0, + dateOfBbirth: '5/20/1997', + ipAddress: '12.229.194.195', + type: 0, + _userId: 1, + _createdDate: '07/16/2011', + _updatedDate: '05/24/2014' + }, + { + id: 10, + firstName: 'Adham', + lastName: 'Hurtic', + email: 'ahurtic9@friendfeed.com', + userName: 'ahurtic9', + gender: 'Male', + status: 1, + dateOfBbirth: '3/15/1971', + ipAddress: '236.147.173.25', + type: 0, + _userId: 2, + _createdDate: '03/25/2011', + _updatedDate: '12/13/2015' + }, + { + id: 11, + firstName: 'Carlina', + lastName: 'Scudders', + email: 'cscuddersa@shareasale.com', + userName: 'cscuddersa', + gender: 'Female', + status: 1, + dateOfBbirth: '2/18/1970', + ipAddress: '189.61.76.155', + type: 0, + _userId: 1, + _createdDate: '11/01/2015', + _updatedDate: '02/16/2013' + }, + { + id: 12, + firstName: 'Roderich', + lastName: 'Landsberg', + email: 'rlandsbergb@deliciousdays.com', + userName: 'rlandsbergb', + gender: 'Male', + status: 0, + dateOfBbirth: '12/7/1963', + ipAddress: '75.200.18.136', + type: 0, + _userId: 2, + _createdDate: '12/12/2017', + _updatedDate: '02/22/2013' + }, + { + id: 13, + firstName: 'Mychal', + lastName: 'Tremblett', + email: 'mtremblettc@printfriendly.com', + userName: 'mtremblettc', + gender: 'Male', + status: 0, + dateOfBbirth: '7/14/1996', + ipAddress: '85.132.155.112', + type: 0, + _userId: 1, + _createdDate: '08/14/2014', + _updatedDate: '08/03/2014' + }, + { + id: 14, + firstName: 'Corine', + lastName: 'Rajchert', + email: 'crajchertd@google.com', + userName: 'crajchertd', + gender: 'Female', + status: 1, + dateOfBbirth: '9/13/1966', + ipAddress: '47.164.200.96', + type: 0, + _userId: 2, + _createdDate: '12/07/2010', + _updatedDate: '09/24/2012' + }, + { + id: 15, + firstName: 'Worth', + lastName: 'McFarlane', + email: 'wmcfarlanee@cocolog-nifty.com', + userName: 'wmcfarlanee', + gender: 'Male', + status: 2, + dateOfBbirth: '10/13/1968', + ipAddress: '56.209.4.81', + type: 0, + _userId: 1, + _createdDate: '02/23/2013', + _updatedDate: '09/24/2016' + }, + { + id: 16, + firstName: 'Ogden', + lastName: 'Danielski', + email: 'odanielskif@goo.ne.jp', + userName: 'odanielskif', + gender: 'Male', + status: 0, + dateOfBbirth: '10/5/1984', + ipAddress: '181.198.149.89', + type: 0, + _userId: 1, + _createdDate: '09/08/2012', + _updatedDate: '10/29/2017' + }, + { + id: 17, + firstName: 'Laurette', + lastName: 'Tift', + email: 'ltiftg@about.me', + userName: 'ltiftg', + gender: 'Female', + status: 1, + dateOfBbirth: '7/29/1964', + ipAddress: '218.236.252.255', + type: 1, + _userId: 2, + _createdDate: '05/03/2016', + _updatedDate: '08/02/2011' + }, + { + id: 18, + firstName: 'Eleanora', + lastName: 'Jackson', + email: 'ejacksonh@geocities.jp', + userName: 'ejacksonh', + gender: 'Female', + status: 0, + dateOfBbirth: '1/1/1993', + ipAddress: '166.210.135.66', + type: 1, + _userId: 1, + _createdDate: '09/25/2017', + _updatedDate: '01/08/2012' + }, + { + id: 19, + firstName: 'Manon', + lastName: 'Perott', + email: 'mperotti@nyu.edu', + userName: 'mperotti', + gender: 'Female', + status: 1, + dateOfBbirth: '11/6/1994', + ipAddress: '44.43.119.22', + type: 1, + _userId: 2, + _createdDate: '04/26/2013', + _updatedDate: '02/24/2012' + }, + { + id: 20, + firstName: 'Karney', + lastName: 'Damerell', + email: 'kdamerellj@booking.com', + userName: 'kdamerellj', + gender: 'Male', + status: 0, + dateOfBbirth: '11/22/1996', + ipAddress: '253.195.21.217', + type: 1, + _userId: 2, + _createdDate: '11/28/2014', + _updatedDate: '10/11/2012' + }, + { + id: 21, + firstName: 'Chelsea', + lastName: 'Bruce', + email: 'cbrucek@icq.com', + userName: 'cbrucek', + gender: 'Female', + status: 1, + dateOfBbirth: '12/1/1983', + ipAddress: '28.184.81.169', + type: 0, + _userId: 1, + _createdDate: '07/29/2013', + _updatedDate: '12/01/2017' + }, + { + id: 22, + firstName: 'Barny', + lastName: 'Verny', + email: 'bvernyl@bing.com', + userName: 'bvernyl', + gender: 'Male', + status: 0, + dateOfBbirth: '8/13/1957', + ipAddress: '7.26.116.49', + type: 0, + _userId: 1, + _createdDate: '06/14/2011', + _updatedDate: '06/28/2011' + }, + { + id: 23, + firstName: 'Elita', + lastName: 'Matuszewski', + email: 'ematuszewskim@businesswire.com', + userName: 'ematuszewskim', + gender: 'Female', + status: 1, + dateOfBbirth: '6/6/1985', + ipAddress: '82.223.2.228', + type: 0, + _userId: 2, + _createdDate: '05/19/2016', + _updatedDate: '09/12/2011' + }, + { + id: 24, + firstName: 'Chelsey', + lastName: 'Scullard', + email: 'cscullardn@buzzfeed.com', + userName: 'cscullardn', + gender: 'Female', + status: 0, + dateOfBbirth: '11/20/1960', + ipAddress: '68.177.196.151', + type: 0, + _userId: 1, + _createdDate: '02/09/2013', + _updatedDate: '12/11/2011' + }, + { + id: 25, + firstName: 'Jodi', + lastName: 'Olphert', + email: 'jolpherto@elpais.com', + userName: 'jolpherto', + gender: 'Female', + status: 0, + dateOfBbirth: '4/20/2000', + ipAddress: '32.219.74.161', + type: 0, + _userId: 2, + _createdDate: '07/28/2017', + _updatedDate: '05/03/2017' + }, + { + id: 26, + firstName: 'Micah', + lastName: 'Searchfield', + email: 'msearchfieldp@instagram.com', + userName: 'msearchfieldp', + gender: 'Male', + status: 1, + dateOfBbirth: '8/15/1993', + ipAddress: '99.205.47.226', + type: 1, + _userId: 1, + _createdDate: '07/05/2011', + _updatedDate: '02/19/2013' + }, + { + id: 27, + firstName: 'Freeland', + lastName: 'O\'Dougherty', + email: 'fodoughertyq@cbsnews.com', + userName: 'fodoughertyq', + gender: 'Male', + status: 1, + dateOfBbirth: '5/19/1956', + ipAddress: '91.116.249.149', + type: 0, + _userId: 1, + _createdDate: '06/09/2012', + _updatedDate: '03/15/2014' + }, + { + id: 28, + firstName: 'Marna', + lastName: 'Dacre', + email: 'mdacrer@tmall.com', + userName: 'mdacrer', + gender: 'Female', + status: 0, + dateOfBbirth: '10/26/1959', + ipAddress: '127.23.103.102', + type: 0, + _userId: 2, + _createdDate: '12/30/2011', + _updatedDate: '03/24/2016' + }, + { + id: 29, + firstName: 'Carlita', + lastName: 'Calwell', + email: 'ccalwells@1688.com', + userName: 'ccalwells', + gender: 'Female', + status: 0, + dateOfBbirth: '7/28/1961', + ipAddress: '3.205.16.120', + type: 0, + _userId: 2, + _createdDate: '02/28/2016', + _updatedDate: '02/25/2013' + }, + { + id: 30, + firstName: 'Deonne', + lastName: 'Castellan', + email: 'dcastellant@gizmodo.com', + userName: 'dcastellant', + gender: 'Female', + status: 2, + dateOfBbirth: '10/21/1955', + ipAddress: '213.3.222.52', + type: 1, + _userId: 2, + _createdDate: '03/12/2011', + _updatedDate: '03/26/2017' + }, + { + id: 31, + firstName: 'Cesare', + lastName: 'Chestnutt', + email: 'cchestnuttu@cornell.edu', + userName: 'cchestnuttu', + gender: 'Male', + status: 2, + dateOfBbirth: '4/14/1979', + ipAddress: '218.107.75.113', + type: 1, + _userId: 1, + _createdDate: '03/06/2012', + _updatedDate: '09/08/2012' + }, + { + id: 32, + firstName: 'Gauthier', + lastName: 'Luparto', + email: 'glupartov@wordpress.org', + userName: 'glupartov', + gender: 'Male', + status: 0, + dateOfBbirth: '11/28/1952', + ipAddress: '148.234.79.85', + type: 1, + _userId: 2, + _createdDate: '04/28/2013', + _updatedDate: '02/26/2016' + }, + { + id: 33, + firstName: 'Kimmi', + lastName: 'Corde', + email: 'kcordew@kickstarter.com', + userName: 'kcordew', + gender: 'Female', + status: 1, + dateOfBbirth: '8/7/1978', + ipAddress: '94.85.235.54', + type: 0, + _userId: 2, + _createdDate: '10/21/2012', + _updatedDate: '10/31/2017' + }, + { + id: 34, + firstName: 'Riordan', + lastName: 'Rosenbush', + email: 'rrosenbushx@wix.com', + userName: 'rrosenbushx', + gender: 'Male', + status: 1, + dateOfBbirth: '11/28/1957', + ipAddress: '236.15.158.122', + type: 0, + _userId: 2, + _createdDate: '08/28/2011', + _updatedDate: '08/14/2015' + }, + { + id: 35, + firstName: 'Daune', + lastName: 'Sellek', + email: 'dselleky@amazon.co.jp', + userName: 'dselleky', + gender: 'Female', + status: 1, + dateOfBbirth: '10/12/1995', + ipAddress: '163.229.197.138', + type: 1, + _userId: 2, + _createdDate: '03/28/2018', + _updatedDate: '03/01/2017' + }, + { + id: 36, + firstName: 'Myriam', + lastName: 'Marshland', + email: 'mmarshlandz@army.mil', + userName: 'mmarshlandz', + gender: 'Female', + status: 2, + dateOfBbirth: '8/1/1961', + ipAddress: '153.40.246.134', + type: 0, + _userId: 1, + _createdDate: '05/15/2017', + _updatedDate: '08/12/2016' + }, + { + id: 37, + firstName: 'Laryssa', + lastName: 'Hynard', + email: 'lhynard10@squidoo.com', + userName: 'lhynard10', + gender: 'Female', + status: 1, + dateOfBbirth: '1/6/1998', + ipAddress: '186.155.125.145', + type: 0, + _userId: 2, + _createdDate: '01/16/2012', + _updatedDate: '10/09/2012' + }, + { + id: 38, + firstName: 'Evelin', + lastName: 'Poate', + email: 'epoate11@cnet.com', + userName: 'epoate11', + gender: 'Male', + status: 2, + dateOfBbirth: '9/11/1957', + ipAddress: '76.53.54.233', + type: 0, + _userId: 1, + _createdDate: '01/07/2012', + _updatedDate: '01/18/2018' + }, + { + id: 39, + firstName: 'Cesar', + lastName: 'D\'Orsay', + email: 'cdorsay12@ezinearticles.com', + userName: 'cdorsay12', + gender: 'Male', + status: 0, + dateOfBbirth: '10/20/1992', + ipAddress: '101.137.215.28', + type: 1, + _userId: 1, + _createdDate: '10/20/2010', + _updatedDate: '07/14/2012' + }, + { + id: 40, + firstName: 'Jareb', + lastName: 'Luberto', + email: 'jluberto13@apple.com', + userName: 'jluberto13', + gender: 'Male', + status: 1, + dateOfBbirth: '12/22/1951', + ipAddress: '69.111.152.125', + type: 0, + _userId: 1, + _createdDate: '01/11/2012', + _updatedDate: '01/20/2018' + }, + { + id: 41, + firstName: 'Kerry', + lastName: 'Glawsop', + email: 'kglawsop14@wp.com', + userName: 'kglawsop14', + gender: 'Male', + status: 1, + dateOfBbirth: '11/28/1953', + ipAddress: '105.245.81.58', + type: 1, + _userId: 2, + _createdDate: '02/23/2015', + _updatedDate: '03/14/2012' + }, + { + id: 42, + firstName: 'Brose', + lastName: 'Conti', + email: 'bconti15@smh.com.au', + userName: 'bconti15', + gender: 'Male', + status: 2, + dateOfBbirth: '8/13/1967', + ipAddress: '109.92.204.48', + type: 1, + _userId: 1, + _createdDate: '08/04/2012', + _updatedDate: '11/01/2011' + }, + { + id: 43, + firstName: 'Shannah', + lastName: 'Ceeley', + email: 'sceeley16@sogou.com', + userName: 'sceeley16', + gender: 'Female', + status: 1, + dateOfBbirth: '6/10/1962', + ipAddress: '57.218.60.216', + type: 0, + _userId: 2, + _createdDate: '05/28/2014', + _updatedDate: '03/16/2018' + }, + { + id: 44, + firstName: 'Rudolf', + lastName: 'Stallworthy', + email: 'rstallworthy17@theatlantic.com', + userName: 'rstallworthy17', + gender: 'Male', + status: 1, + dateOfBbirth: '10/15/1966', + ipAddress: '74.223.255.220', + type: 1, + _userId: 2, + _createdDate: '06/01/2015', + _updatedDate: '10/25/2013' + }, + { + id: 45, + firstName: 'Egor', + lastName: 'Scotson', + email: 'escotson18@weather.com', + userName: 'escotson18', + gender: 'Male', + status: 0, + dateOfBbirth: '1/17/1956', + ipAddress: '70.189.158.38', + type: 0, + _userId: 1, + _createdDate: '03/25/2011', + _updatedDate: '12/05/2010' + }, + { + id: 46, + firstName: 'Selie', + lastName: 'Dugue', + email: 'sdugue19@meetup.com', + userName: 'sdugue19', + gender: 'Female', + status: 0, + dateOfBbirth: '11/9/1981', + ipAddress: '54.129.221.70', + type: 1, + _userId: 1, + _createdDate: '06/09/2013', + _updatedDate: '08/10/2016' + }, + { + id: 47, + firstName: 'Gene', + lastName: 'Kirkbright', + email: 'gkirkbright1a@wp.com', + userName: 'gkirkbright1a', + gender: 'Female', + status: 0, + dateOfBbirth: '5/9/1972', + ipAddress: '217.224.216.105', + type: 0, + _userId: 1, + _createdDate: '02/02/2016', + _updatedDate: '03/30/2014' + }, + { + id: 48, + firstName: 'Reagan', + lastName: 'Colloby', + email: 'rcolloby1b@usgs.gov', + userName: 'rcolloby1b', + gender: 'Male', + status: 2, + dateOfBbirth: '9/21/1997', + ipAddress: '32.53.20.172', + type: 0, + _userId: 2, + _createdDate: '04/08/2016', + _updatedDate: '01/25/2014' + }, + { + id: 49, + firstName: 'Saidee', + lastName: 'Kivelle', + email: 'skivelle1c@newsvine.com', + userName: 'skivelle1c', + gender: 'Female', + status: 1, + dateOfBbirth: '10/23/1994', + ipAddress: '79.152.227.238', + type: 1, + _userId: 1, + _createdDate: '12/26/2015', + _updatedDate: '09/17/2011' + }, + { + id: 50, + firstName: 'Mychal', + lastName: 'Karlowicz', + email: 'mkarlowicz1d@opera.com', + userName: 'mkarlowicz1d', + gender: 'Male', + status: 2, + dateOfBbirth: '10/20/1971', + ipAddress: '70.175.193.245', + type: 0, + _userId: 2, + _createdDate: '10/10/2011', + _updatedDate: '03/02/2012' + }, + { + id: 51, + firstName: 'Nessie', + lastName: 'Casassa', + email: 'ncasassa1e@pinterest.com', + userName: 'ncasassa1e', + gender: 'Female', + status: 2, + dateOfBbirth: '3/9/1983', + ipAddress: '17.128.173.230', + type: 1, + _userId: 1, + _createdDate: '01/09/2018', + _updatedDate: '08/05/2015' + }, + { + id: 52, + firstName: 'Myrvyn', + lastName: 'Coots', + email: 'mcoots1f@sourceforge.net', + userName: 'mcoots1f', + gender: 'Male', + status: 2, + dateOfBbirth: '4/5/1972', + ipAddress: '253.21.191.36', + type: 0, + _userId: 1, + _createdDate: '01/13/2015', + _updatedDate: '04/30/2011' + }, + { + id: 53, + firstName: 'Liuka', + lastName: 'Monard', + email: 'lmonard1g@wikipedia.org', + userName: 'lmonard1g', + gender: 'Female', + status: 2, + dateOfBbirth: '6/6/1999', + ipAddress: '33.46.177.2', + type: 1, + _userId: 1, + _createdDate: '11/17/2012', + _updatedDate: '02/18/2011' + }, + { + id: 54, + firstName: 'Alis', + lastName: 'Nozzolii', + email: 'anozzolii1h@google.com.br', + userName: 'anozzolii1h', + gender: 'Female', + status: 2, + dateOfBbirth: '7/25/1953', + ipAddress: '242.76.135.219', + type: 1, + _userId: 1, + _createdDate: '10/16/2012', + _updatedDate: '09/17/2012' + }, + { + id: 55, + firstName: 'Gage', + lastName: 'Slamaker', + email: 'gslamaker1i@people.com.cn', + userName: 'gslamaker1i', + gender: 'Male', + status: 1, + dateOfBbirth: '3/19/1959', + ipAddress: '179.85.197.219', + type: 0, + _userId: 2, + _createdDate: '04/20/2015', + _updatedDate: '07/02/2014' + }, + { + id: 56, + firstName: 'Jamal', + lastName: 'Glasard', + email: 'jglasard1j@google.ru', + userName: 'jglasard1j', + gender: 'Male', + status: 2, + dateOfBbirth: '9/21/1968', + ipAddress: '163.99.109.106', + type: 0, + _userId: 1, + _createdDate: '08/24/2017', + _updatedDate: '12/09/2012' + }, + { + id: 57, + firstName: 'Antone', + lastName: 'Christophersen', + email: 'achristophersen1k@slashdot.org', + userName: 'achristophersen1k', + gender: 'Male', + status: 0, + dateOfBbirth: '8/5/1953', + ipAddress: '42.207.110.255', + type: 1, + _userId: 1, + _createdDate: '12/30/2012', + _updatedDate: '04/07/2013' + }, + { + id: 58, + firstName: 'Glenn', + lastName: 'Gentle', + email: 'ggentle1l@imdb.com', + userName: 'ggentle1l', + gender: 'Female', + status: 0, + dateOfBbirth: '8/4/1959', + ipAddress: '82.135.105.157', + type: 1, + _userId: 2, + _createdDate: '01/16/2017', + _updatedDate: '10/04/2017' + }, + { + id: 59, + firstName: 'Jerrilyn', + lastName: 'Prujean', + email: 'jprujean1m@csmonitor.com', + userName: 'jprujean1m', + gender: 'Female', + status: 2, + dateOfBbirth: '12/22/1961', + ipAddress: '45.111.98.145', + type: 1, + _userId: 2, + _createdDate: '08/22/2014', + _updatedDate: '09/01/2014' + }, + { + id: 60, + firstName: 'Becki', + lastName: 'Mucklestone', + email: 'bmucklestone1n@wiley.com', + userName: 'bmucklestone1n', + gender: 'Female', + status: 0, + dateOfBbirth: '10/15/1970', + ipAddress: '208.63.250.181', + type: 0, + _userId: 1, + _createdDate: '03/08/2018', + _updatedDate: '08/09/2016' + }, + { + id: 61, + firstName: 'Kingsly', + lastName: 'Sawday', + email: 'ksawday1o@patch.com', + userName: 'ksawday1o', + gender: 'Male', + status: 0, + dateOfBbirth: '1/20/1978', + ipAddress: '196.38.7.53', + type: 0, + _userId: 2, + _createdDate: '07/15/2016', + _updatedDate: '10/28/2012' + }, + { + id: 62, + firstName: 'Austen', + lastName: 'Possel', + email: 'apossel1p@blogtalkradio.com', + userName: 'apossel1p', + gender: 'Male', + status: 0, + dateOfBbirth: '5/8/1960', + ipAddress: '162.0.150.104', + type: 1, + _userId: 2, + _createdDate: '12/20/2017', + _updatedDate: '04/20/2018' + }, + { + id: 63, + firstName: 'Rudie', + lastName: 'Southouse', + email: 'rsouthouse1q@mapy.cz', + userName: 'rsouthouse1q', + gender: 'Male', + status: 0, + dateOfBbirth: '12/2/1950', + ipAddress: '67.123.229.124', + type: 1, + _userId: 2, + _createdDate: '09/24/2012', + _updatedDate: '07/02/2014' + }, + { + id: 64, + firstName: 'Julienne', + lastName: 'Le Noury', + email: 'jlenoury1r@cnet.com', + userName: 'jlenoury1r', + gender: 'Female', + status: 1, + dateOfBbirth: '10/30/1976', + ipAddress: '208.192.238.241', + type: 1, + _userId: 1, + _createdDate: '06/29/2012', + _updatedDate: '11/26/2016' + }, + { + id: 65, + firstName: 'Bernard', + lastName: 'Levicount', + email: 'blevicount1s@angelfire.com', + userName: 'blevicount1s', + gender: 'Male', + status: 2, + dateOfBbirth: '12/6/1982', + ipAddress: '123.229.51.62', + type: 1, + _userId: 2, + _createdDate: '04/11/2013', + _updatedDate: '05/14/2013' + }, + { + id: 66, + firstName: 'Katine', + lastName: 'Glazyer', + email: 'kglazyer1t@unblog.fr', + userName: 'kglazyer1t', + gender: 'Female', + status: 2, + dateOfBbirth: '8/20/1954', + ipAddress: '165.87.178.12', + type: 0, + _userId: 1, + _createdDate: '03/20/2015', + _updatedDate: '06/18/2015' + }, + { + id: 67, + firstName: 'Rem', + lastName: 'Crichten', + email: 'rcrichten1u@patch.com', + userName: 'rcrichten1u', + gender: 'Male', + status: 0, + dateOfBbirth: '6/19/1950', + ipAddress: '184.177.108.6', + type: 1, + _userId: 1, + _createdDate: '11/12/2014', + _updatedDate: '04/12/2011' + }, + { + id: 68, + firstName: 'Colman', + lastName: 'Simnor', + email: 'csimnor1v@reddit.com', + userName: 'csimnor1v', + gender: 'Male', + status: 1, + dateOfBbirth: '1/3/2000', + ipAddress: '19.3.156.170', + type: 0, + _userId: 2, + _createdDate: '05/06/2013', + _updatedDate: '05/23/2014' + }, + { + id: 69, + firstName: 'Arin', + lastName: 'Hanscombe', + email: 'ahanscombe1w@blogspot.com', + userName: 'ahanscombe1w', + gender: 'Male', + status: 2, + dateOfBbirth: '9/21/1955', + ipAddress: '154.59.243.61', + type: 0, + _userId: 2, + _createdDate: '06/23/2013', + _updatedDate: '11/10/2011' + }, + { + id: 70, + firstName: 'Emogene', + lastName: 'Gruszka', + email: 'egruszka1x@cmu.edu', + userName: 'egruszka1x', + gender: 'Female', + status: 1, + dateOfBbirth: '7/3/1971', + ipAddress: '105.138.138.125', + type: 1, + _userId: 2, + _createdDate: '07/26/2016', + _updatedDate: '10/28/2013' + }, + { + id: 71, + firstName: 'Rosina', + lastName: 'Kauffman', + email: 'rkauffman1y@google.com.hk', + userName: 'rkauffman1y', + gender: 'Female', + status: 2, + dateOfBbirth: '11/21/1953', + ipAddress: '131.87.248.164', + type: 0, + _userId: 1, + _createdDate: '10/16/2016', + _updatedDate: '07/24/2015' + }, + { + id: 72, + firstName: 'Fran', + lastName: 'MacGill', + email: 'fmacgill1z@pinterest.com', + userName: 'fmacgill1z', + gender: 'Female', + status: 1, + dateOfBbirth: '3/16/1991', + ipAddress: '155.41.152.146', + type: 1, + _userId: 1, + _createdDate: '11/23/2012', + _updatedDate: '09/03/2016' + }, + { + id: 73, + firstName: 'Marinna', + lastName: 'Allington', + email: 'mallington20@icio.us', + userName: 'mallington20', + gender: 'Female', + status: 0, + dateOfBbirth: '3/15/1964', + ipAddress: '120.145.107.78', + type: 0, + _userId: 2, + _createdDate: '09/07/2011', + _updatedDate: '12/26/2017' + }, + { + id: 74, + firstName: 'Irv', + lastName: 'Rishbrook', + email: 'irishbrook21@tripod.com', + userName: 'irishbrook21', + gender: 'Male', + status: 0, + dateOfBbirth: '11/25/1966', + ipAddress: '127.115.28.247', + type: 1, + _userId: 1, + _createdDate: '08/25/2014', + _updatedDate: '06/16/2013' + }, + { + id: 75, + firstName: 'Riordan', + lastName: 'Durran', + email: 'rdurran22@hubpages.com', + userName: 'rdurran22', + gender: 'Male', + status: 1, + dateOfBbirth: '3/3/1952', + ipAddress: '246.102.6.88', + type: 1, + _userId: 1, + _createdDate: '04/02/2017', + _updatedDate: '01/30/2011' + }, + { + id: 76, + firstName: 'Phillie', + lastName: 'Elward', + email: 'pelward23@parallels.com', + userName: 'pelward23', + gender: 'Female', + status: 2, + dateOfBbirth: '9/15/1965', + ipAddress: '75.220.58.105', + type: 1, + _userId: 1, + _createdDate: '06/23/2014', + _updatedDate: '08/20/2016' + }, + { + id: 77, + firstName: 'Hadlee', + lastName: 'Haddow', + email: 'hhaddow24@nationalgeographic.com', + userName: 'hhaddow24', + gender: 'Male', + status: 0, + dateOfBbirth: '10/2/1973', + ipAddress: '155.40.18.171', + type: 0, + _userId: 2, + _createdDate: '03/05/2016', + _updatedDate: '07/03/2017' + }, + { + id: 78, + firstName: 'Luciano', + lastName: 'Pittford', + email: 'lpittford25@europa.eu', + userName: 'lpittford25', + gender: 'Male', + status: 0, + dateOfBbirth: '6/14/1963', + ipAddress: '131.175.149.47', + type: 0, + _userId: 2, + _createdDate: '05/01/2014', + _updatedDate: '08/02/2011' + }, + { + id: 79, + firstName: 'Zelma', + lastName: 'Cumberpatch', + email: 'zcumberpatch26@multiply.com', + userName: 'zcumberpatch26', + gender: 'Female', + status: 1, + dateOfBbirth: '7/16/1956', + ipAddress: '145.155.37.45', + type: 1, + _userId: 1, + _createdDate: '11/07/2015', + _updatedDate: '12/03/2014' + }, + { + id: 80, + firstName: 'Thornton', + lastName: 'Smuth', + email: 'tsmuth27@go.com', + userName: 'tsmuth27', + gender: 'Male', + status: 0, + dateOfBbirth: '5/9/1989', + ipAddress: '146.151.187.52', + type: 1, + _userId: 2, + _createdDate: '12/25/2011', + _updatedDate: '12/31/2010' + }, + { + id: 81, + firstName: 'Bunnie', + lastName: 'Ealden', + email: 'bealden28@gravatar.com', + userName: 'bealden28', + gender: 'Female', + status: 0, + dateOfBbirth: '10/2/1999', + ipAddress: '184.116.180.222', + type: 1, + _userId: 2, + _createdDate: '04/09/2015', + _updatedDate: '12/07/2013' + }, + { + id: 82, + firstName: 'Pearl', + lastName: 'Robeson', + email: 'probeson29@moonfruit.com', + userName: 'probeson29', + gender: 'Female', + status: 0, + dateOfBbirth: '8/20/1980', + ipAddress: '235.213.39.68', + type: 0, + _userId: 1, + _createdDate: '07/13/2016', + _updatedDate: '03/07/2012' + }, + { + id: 83, + firstName: 'Charlie', + lastName: 'Marvelley', + email: 'cmarvelley2a@archive.org', + userName: 'cmarvelley2a', + gender: 'Male', + status: 0, + dateOfBbirth: '11/22/1969', + ipAddress: '158.224.240.173', + type: 0, + _userId: 2, + _createdDate: '03/25/2012', + _updatedDate: '11/20/2012' + }, + { + id: 84, + firstName: 'Vere', + lastName: 'McCartan', + email: 'vmccartan2b@about.me', + userName: 'vmccartan2b', + gender: 'Female', + status: 1, + dateOfBbirth: '3/24/1956', + ipAddress: '235.57.57.54', + type: 0, + _userId: 2, + _createdDate: '06/21/2016', + _updatedDate: '05/17/2015' + }, + { + id: 85, + firstName: 'Deni', + lastName: 'Frostdicke', + email: 'dfrostdicke2c@jigsy.com', + userName: 'dfrostdicke2c', + gender: 'Female', + status: 1, + dateOfBbirth: '7/31/1964', + ipAddress: '108.183.237.176', + type: 1, + _userId: 1, + _createdDate: '03/13/2013', + _updatedDate: '11/12/2017' + }, + { + id: 86, + firstName: 'Poppy', + lastName: 'Pech', + email: 'ppech2d@wsj.com', + userName: 'ppech2d', + gender: 'Female', + status: 1, + dateOfBbirth: '2/24/1976', + ipAddress: '221.35.18.213', + type: 1, + _userId: 1, + _createdDate: '09/10/2015', + _updatedDate: '02/13/2013' + }, + { + id: 87, + firstName: 'Dasya', + lastName: 'O\'Nion', + email: 'donion2e@addthis.com', + userName: 'donion2e', + gender: 'Female', + status: 1, + dateOfBbirth: '7/5/1993', + ipAddress: '28.25.44.40', + type: 0, + _userId: 1, + _createdDate: '04/12/2013', + _updatedDate: '08/24/2012' + }, + { + id: 88, + firstName: 'Marco', + lastName: 'Izhakov', + email: 'mizhakov2f@si.edu', + userName: 'mizhakov2f', + gender: 'Male', + status: 1, + dateOfBbirth: '2/28/1999', + ipAddress: '155.123.153.36', + type: 0, + _userId: 1, + _createdDate: '06/04/2012', + _updatedDate: '03/06/2017' + }, + { + id: 89, + firstName: 'Jane', + lastName: 'Meneux', + email: 'jmeneux2g@bluehost.com', + userName: 'jmeneux2g', + gender: 'Female', + status: 1, + dateOfBbirth: '3/15/1962', + ipAddress: '216.200.223.149', + type: 1, + _userId: 2, + _createdDate: '11/24/2015', + _updatedDate: '02/08/2012' + }, + { + id: 90, + firstName: 'Audry', + lastName: 'Glasheen', + email: 'aglasheen2h@booking.com', + userName: 'aglasheen2h', + gender: 'Female', + status: 2, + dateOfBbirth: '10/24/1962', + ipAddress: '186.134.95.243', + type: 0, + _userId: 1, + _createdDate: '09/13/2016', + _updatedDate: '04/28/2014' + }, + { + id: 91, + firstName: 'Florida', + lastName: 'Lawleff', + email: 'flawleff2i@livejournal.com', + userName: 'flawleff2i', + gender: 'Female', + status: 1, + dateOfBbirth: '2/3/1960', + ipAddress: '88.32.51.173', + type: 0, + _userId: 1, + _createdDate: '03/22/2018', + _updatedDate: '11/28/2010' + }, + { + id: 92, + firstName: 'Christoforo', + lastName: 'Pinchon', + email: 'cpinchon2j@bloglovin.com', + userName: 'cpinchon2j', + gender: 'Male', + status: 2, + dateOfBbirth: '2/26/1995', + ipAddress: '244.162.142.84', + type: 0, + _userId: 2, + _createdDate: '11/14/2017', + _updatedDate: '11/19/2016' + }, + { + id: 93, + firstName: 'Bertie', + lastName: 'Antognazzi', + email: 'bantognazzi2k@ow.ly', + userName: 'bantognazzi2k', + gender: 'Male', + status: 2, + dateOfBbirth: '6/7/1955', + ipAddress: '108.174.189.179', + type: 0, + _userId: 2, + _createdDate: '08/03/2016', + _updatedDate: '01/27/2018' + }, + { + id: 94, + firstName: 'Clevey', + lastName: 'Grima', + email: 'cgrima2l@cmu.edu', + userName: 'cgrima2l', + gender: 'Male', + status: 0, + dateOfBbirth: '7/7/1981', + ipAddress: '255.186.178.211', + type: 1, + _userId: 2, + _createdDate: '03/23/2014', + _updatedDate: '02/10/2011' + }, + { + id: 95, + firstName: 'Herbie', + lastName: 'Symper', + email: 'hsymper2m@ca.gov', + userName: 'hsymper2m', + gender: 'Male', + status: 0, + dateOfBbirth: '7/16/1993', + ipAddress: '54.240.157.6', + type: 0, + _userId: 1, + _createdDate: '07/27/2011', + _updatedDate: '05/28/2013' + }, + { + id: 96, + firstName: 'Kizzie', + lastName: 'Clapson', + email: 'kclapson2n@linkedin.com', + userName: 'kclapson2n', + gender: 'Female', + status: 1, + dateOfBbirth: '1/26/1977', + ipAddress: '171.243.142.104', + type: 1, + _userId: 2, + _createdDate: '09/03/2011', + _updatedDate: '10/14/2014' + }, + { + id: 97, + firstName: 'Sigvard', + lastName: 'Edwin', + email: 'sedwin2o@mlb.com', + userName: 'sedwin2o', + gender: 'Male', + status: 0, + dateOfBbirth: '4/24/1966', + ipAddress: '78.224.218.52', + type: 0, + _userId: 1, + _createdDate: '05/20/2017', + _updatedDate: '09/17/2013' + }, + { + id: 98, + firstName: 'Boniface', + lastName: 'Rodd', + email: 'brodd2p@123-reg.co.uk', + userName: 'brodd2p', + gender: 'Male', + status: 2, + dateOfBbirth: '10/24/1978', + ipAddress: '250.44.55.222', + type: 1, + _userId: 2, + _createdDate: '04/21/2012', + _updatedDate: '07/30/2012' + }, + { + id: 99, + firstName: 'Dorena', + lastName: 'Oliva', + email: 'doliva2q@europa.eu', + userName: 'doliva2q', + gender: 'Female', + status: 1, + dateOfBbirth: '6/16/1987', + ipAddress: '94.196.238.12', + type: 0, + _userId: 1, + _createdDate: '10/23/2016', + _updatedDate: '06/28/2014' + }, + { + id: 100, + firstName: 'Sibylla', + lastName: 'O\'Cahey', + email: 'socahey2r@paginegialle.it', + userName: 'socahey2r', + gender: 'Female', + status: 2, + dateOfBbirth: '10/13/1958', + ipAddress: '139.240.194.212', + type: 1, + _userId: 1, + _createdDate: '11/25/2014', + _updatedDate: '08/18/2015' + } + ]; +} diff --git a/src/app/core/e-commerce/_server/orders.table.ts b/src/app/core/e-commerce/_server/orders.table.ts new file mode 100644 index 0000000..1918907 --- /dev/null +++ b/src/app/core/e-commerce/_server/orders.table.ts @@ -0,0 +1,173 @@ +export class OrdersTable { + public static orders: any = [ + // e-commerce => orders + { + id: 'a68e31e0-9d88-4065-abc4-c74cc7c293ae', + customer_id: 38, + order_date: '8/6/2012', + items: [ + { + product_id: 31, + count: 1 + }, + { + product_id: 1, + count: 1 + } + ], + order_status: 'on the way' + }, + { + id: '5055fa9e-3b1a-4668-a63e-4767e9cda711', + customer_id: 58, + order_date: '2/13/2012', + items: [ + { + product_id: 98, + count: 2 + }, + { + product_id: 11, + count: 1 + } + ], + order_status: 'on the way' + }, + { + id: '0c06643b-030a-4ea0-92e5-e0177645943d', + customer_id: 13, + order_date: '4/19/2016', + items: [ + { + product_id: 32, + count: 1 + }, + { + product_id: 77, + count: 1 + } + ], + order_status: 'sent' + }, + { + id: '8bbdbe05-88c6-47f2-b531-65fd9f97d649', + customer_id: 97, + order_date: '7/30/2012', + items: [ + { + product_id: 96, + count: 1 + }, + { + product_id: 99, + count: 2 + } + ], + order_status: 'delivered' + }, + { + id: '2af76e30-f9d6-427c-aad4-414908459e7f', + customer_id: 90, + order_date: '12/20/2012', + items: [ + { + product_id: 100, + count: 5 + } + ], + order_status: 'paid' + }, + { + id: '7951e68b-e2e9-4cf9-82c4-9e963031b6b7', + customer_id: 82, + order_date: '1/4/2014', + items: [ + { + product_id: 35, + count: 1 + }, + { + product_id: 88, + count: 1 + }, + { + product_id: 22, + count: 1 + } + ], + order_status: 'delivered' + }, + { + id: '4dc2c379-c7aa-4356-b609-0ca5777b7b8e', + customer_id: 91, + order_date: '8/2/2016', + items: [ + { + product_id: 36, + count: 1 + } + ], + order_status: 'on the way' + }, + { + id: '3eaf04e5-855c-4a57-b781-3edff99ddae5', + customer_id: 63, + order_date: '4/11/2012', + items: [ + { + product_id: 67, + count: 1 + } + ], + order_status: 'on the way' + }, + { + id: '4cca88ef-1a39-48cf-a6ed-290e7e34f756', + customer_id: 5, + order_date: '4/19/2011', + items: [ + { + product_id: 9, + count: 1 + } + ], + order_status: 'sent' + }, + { + id: '3cd8e2b8-83ee-4c0d-a4c3-fed313fc836a', + customer_id: 81, + order_date: '10/2/2010', + items: [ + { + product_id: 98, + count: 1 + } + ], + order_status: 'on the way' + }, + { + id: 'da2f7ea8-82aa-474a-a97f-3d75d56d734f', + customer_id: 100, + order_date: '3/30/2016', + items: [ + { + product_id: 3, + count: 1 + } + ], + order_status: 'sent' + }, + { + id: 'e674592d-ea7f-40d4-aa2c-ecac4039c81b', + customer_id: 4, + order_date: '6/25/2011', + items: [ + { + product_id: 71, + count: 1 + } + ], + order_status: 'delivered' + } + ]; +} diff --git a/src/app/core/e-commerce/_server/remarks.table.ts b/src/app/core/e-commerce/_server/remarks.table.ts new file mode 100644 index 0000000..1be7620 --- /dev/null +++ b/src/app/core/e-commerce/_server/remarks.table.ts @@ -0,0 +1,1004 @@ +// Sub category for cars +export class RemarksTable { + public static remarks: any = [{ + id: 1, + carId: 1, + text: 'enim lorem ipsum dolor sit amet consectetuer adipiscing elit proin', + _userId: 2, + _createdDate: '02/20/2011', + _updatedDate: '06/25/2013', + type: 0, + _isEditMode: false, + dueDate: '11/18/2018' + }, { + id: 2, + carId: 1, + text: 'in', + _userId: 1, + _createdDate: '02/05/2014', + _updatedDate: '09/25/2017', + type: 0, + _isEditMode: false, + dueDate: '10/26/2019' + }, { + id: 3, + carId: 1, + text: 'quis tortor id nulla ultrices aliquet maecenas leo', + _userId: 2, + _createdDate: '04/10/2017', + _updatedDate: '06/12/2012', + type: 2, + _isEditMode: false, + dueDate: '05/10/2020' + }, { + id: 4, + carId: 2, + text: 'curabitur gravida nisi at nibh in hac habitasse', + _userId: 1, + _createdDate: '03/02/2015', + _updatedDate: '03/30/2014', + type: 1, + _isEditMode: false, + dueDate: '12/13/2018' + }, { + id: 5, + carId: 2, + text: 'orci luctus et ultrices posuere cubilia curae duis faucibus accumsan odio curabitur convallis', + _userId: 2, + _createdDate: '02/14/2015', + _updatedDate: '07/11/2013', + type: 0, + _isEditMode: false, + dueDate: '10/24/2019' + }, { + id: 6, + carId: 2, + text: 'integer ac', + _userId: 1, + _createdDate: '05/28/2015', + _updatedDate: '07/29/2016', + type: 0, + _isEditMode: false, + dueDate: '01/22/2019' + }, { + id: 7, + carId: 3, + text: 'lectus aliquam sit amet diam in magna bibendum imperdiet nullam orci pede', + _userId: 2, + _createdDate: '03/08/2013', + _updatedDate: '09/24/2016', + type: 1, + _isEditMode: false, + dueDate: '03/31/2020' + }, { + id: 8, + carId: 3, + text: 'morbi odio odio elementum eu interdum eu tincidunt in leo', + _userId: 2, + _createdDate: '07/09/2010', + _updatedDate: '01/25/2015', + type: 1, + _isEditMode: false, + dueDate: '02/20/2019' + }, { + id: 9, + carId: 3, + text: 'orci', + _userId: 1, + _createdDate: '02/02/2018', + _updatedDate: '08/04/2015', + type: 0, + _isEditMode: false, + dueDate: '04/03/2020' + }, { + id: 10, + carId: 4, + text: 'vel pede morbi porttitor lorem id ligula suspendisse ornare consequat lectus in est risus auctor sed tristique in tempus sit', + _userId: 1, + _createdDate: '09/09/2013', + _updatedDate: '03/06/2013', + type: 1, + _isEditMode: false, + dueDate: '10/28/2018' + }, { + id: 11, + carId: 4, + text: 'ligula sit amet eleifend pede libero quis orci', + _userId: 2, + _createdDate: '08/17/2010', + _updatedDate: '03/05/2016', + type: 2, + _isEditMode: false, + dueDate: '06/22/2019' + }, { + id: 12, + carId: 4, + text: 'eget eleifend luctus ultricies eu nibh quisque id justo sit amet', + _userId: 2, + _createdDate: '09/17/2014', + _updatedDate: '04/18/2011', + type: 1, + _isEditMode: false, + dueDate: '01/01/2020' + }, { + id: 13, + carId: 5, + text: '', + _userId: 1, + _createdDate: '03/25/2013', + _updatedDate: '11/13/2013', + type: 2, + _isEditMode: false, + dueDate: '05/25/2019' + }, { + id: 14, + carId: 5, + text: 'justo lacinia eget tincidunt eget tempus vel pede morbi porttitor', + _userId: 2, + _createdDate: '03/22/2015', + _updatedDate: '04/22/2015', + type: 1, + _isEditMode: false, + dueDate: '02/07/2020' + }, { + id: 15, + carId: 5, + text: 'quam pede', + _userId: 1, + _createdDate: '03/18/2018', + _updatedDate: '06/01/2012', + type: 2, + _isEditMode: false, + dueDate: '02/09/2020' + }, { + id: 16, + carId: 6, + text: 'bibendum morbi non quam nec dui luctus rutrum nulla tellus in sagittis dui vel nisl duis ac nibh fusce', + _userId: 2, + _createdDate: '01/09/2013', + _updatedDate: '02/10/2017', + type: 1, + _isEditMode: false, + dueDate: '09/21/2019' + }, { + id: 17, + carId: 6, + text: 'id consequat in consequat ut nulla sed accumsan felis ut at dolor', + _userId: 2, + _createdDate: '07/27/2012', + _updatedDate: '04/13/2015', + type: 1, + _isEditMode: false, + dueDate: '08/01/2019' + }, { + id: 18, + carId: 6, + text: 'eu magna vulputate luctus cum sociis natoque penatibus et magnis dis parturient', + _userId: 1, + _createdDate: '08/12/2011', + _updatedDate: '04/08/2018', + type: 0, + _isEditMode: false, + dueDate: '03/28/2020' + }, { + id: 19, + carId: 7, + text: 'nec nisi vulputate nonummy maecenas tincidunt lacus at velit vivamus vel nulla eget', + _userId: 1, + _createdDate: '03/03/2013', + _updatedDate: '09/18/2017', + type: 0, + _isEditMode: false, + dueDate: '08/08/2019' + }, { + id: 20, + carId: 7, + text: '', + _userId: 1, + _createdDate: '05/06/2015', + _updatedDate: '02/20/2016', + type: 2, + _isEditMode: false, + dueDate: '02/11/2019' + }, { + id: 21, + carId: 7, + text: 'sed vestibulum sit amet cursus id turpis integer aliquet massa id lobortis convallis', + _userId: 2, + _createdDate: '08/05/2014', + _updatedDate: '03/13/2018', + type: 0, + _isEditMode: false, + dueDate: '02/03/2020' + }, { + id: 22, + carId: 8, + text: 'dolor morbi vel lectus in quam fringilla rhoncus mauris enim leo', + _userId: 2, + _createdDate: '04/25/2011', + _updatedDate: '03/09/2013', + type: 0, + _isEditMode: false, + dueDate: '12/06/2018' + }, { + id: 23, + carId: 8, + text: 'mauris lacinia sapien quis libero nullam sit amet turpis elementum ligula vehicula consequat morbi a ipsum integer a nibh', + _userId: 1, + _createdDate: '07/03/2014', + _updatedDate: '08/23/2013', + type: 2, + _isEditMode: false, + dueDate: '05/18/2019' + }, { + id: 24, + carId: 8, + text: 'ultrices posuere cubilia curae donec pharetra magna vestibulum aliquet ultrices erat tortor sollicitudin', + _userId: 2, + _createdDate: '05/21/2013', + _updatedDate: '10/01/2016', + type: 0, + _isEditMode: false, + dueDate: '04/18/2019' + }, { + id: 25, + carId: 9, + text: 'orci luctus et ultrices', + _userId: 2, + _createdDate: '05/29/2014', + _updatedDate: '02/03/2016', + type: 1, + _isEditMode: false, + dueDate: '06/23/2019' + }, { + id: 26, + carId: 9, + text: 'donec diam neque vestibulum eget vulputate ut', + _userId: 1, + _createdDate: '06/06/2012', + _updatedDate: '02/01/2018', + type: 2, + _isEditMode: false, + dueDate: '12/29/2018' + }, { + id: 27, + carId: 9, + text: 'sapien sapien non mi integer ac neque duis bibendum morbi non quam', + _userId: 1, + _createdDate: '05/12/2015', + _updatedDate: '11/11/2011', + type: 2, + _isEditMode: false, + dueDate: '04/26/2020' + }, { + id: 28, + carId: 10, + text: '', + _userId: 1, + _createdDate: '03/17/2013', + _updatedDate: '08/13/2013', + type: 2, + _isEditMode: false, + dueDate: '05/12/2019' + }, { + id: 29, + carId: 10, + text: 'aliquam lacus morbi quis tortor id nulla ultrices aliquet maecenas leo odio condimentum id luctus nec molestie sed', + _userId: 1, + _createdDate: '07/03/2016', + _updatedDate: '02/06/2011', + type: 2, + _isEditMode: false, + dueDate: '02/24/2019' + }, { + id: 30, + carId: 10, + text: 'donec quis orci eget orci vehicula condimentum', + _userId: 2, + _createdDate: '01/27/2014', + _updatedDate: '12/09/2016', + type: 1, + _isEditMode: false, + dueDate: '02/27/2020' + }, { + id: 31, + carId: 11, + text: 'etiam faucibus cursus urna ut tellus nulla ut erat', + _userId: 1, + _createdDate: '07/08/2014', + _updatedDate: '06/07/2014', + type: 1, + _isEditMode: false, + dueDate: '05/26/2020' + }, { + id: 32, + carId: 11, + text: 'hac habitasse platea dictumst etiam faucibus cursus urna ut tellus nulla ut erat id mauris vulputate elementum nullam varius', + _userId: 1, + _createdDate: '05/03/2016', + _updatedDate: '07/20/2012', + type: 1, + _isEditMode: false, + dueDate: '08/11/2019' + }, { + id: 33, + carId: 11, + text: 'vel enim sit amet', + _userId: 1, + _createdDate: '06/02/2017', + _updatedDate: '05/03/2012', + type: 0, + _isEditMode: false, + dueDate: '12/18/2019' + }, { + id: 34, + carId: 12, + text: 'est congue elementum in hac habitasse platea dictumst morbi vestibulum', + _userId: 2, + _createdDate: '03/28/2017', + _updatedDate: '07/23/2010', + type: 1, + _isEditMode: false, + dueDate: '02/16/2019' + }, { + id: 35, + carId: 12, + text: 'tempus vel pede morbi', + _userId: 1, + _createdDate: '10/29/2013', + _updatedDate: '01/22/2016', + type: 0, + _isEditMode: false, + dueDate: '12/30/2018' + }, { + id: 36, + carId: 12, + text: 'augue vel accumsan tellus nisi eu orci mauris lacinia sapien quis libero nullam sit amet turpis', + _userId: 2, + _createdDate: '03/31/2011', + _updatedDate: '08/20/2012', + type: 0, + _isEditMode: false, + dueDate: '06/29/2019' + }, { + id: 37, + carId: 13, + text: 'faucibus', + _userId: 2, + _createdDate: '12/24/2016', + _updatedDate: '03/01/2017', + type: 2, + _isEditMode: false, + dueDate: '04/09/2020' + }, { + id: 38, + carId: 13, + text: 'vulputate luctus cum sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus', + _userId: 1, + _createdDate: '08/02/2015', + _updatedDate: '10/24/2011', + type: 1, + _isEditMode: false, + dueDate: '03/03/2020' + }, { + id: 39, + carId: 13, + text: 'nulla ultrices aliquet maecenas leo odio condimentum id luctus nec molestie sed justo pellentesque viverra pede ac', + _userId: 1, + _createdDate: '03/27/2011', + _updatedDate: '11/25/2017', + type: 2, + _isEditMode: false, + dueDate: '12/22/2019' + }, { + id: 40, + carId: 14, + text: 'vel accumsan tellus nisi eu orci mauris lacinia sapien quis libero nullam sit amet turpis elementum', + _userId: 1, + _createdDate: '02/03/2017', + _updatedDate: '03/15/2014', + type: 0, + _isEditMode: false, + dueDate: '02/06/2020' + }, { + id: 41, + carId: 14, + text: 'nec dui luctus rutrum nulla tellus in sagittis dui vel', + _userId: 2, + _createdDate: '08/12/2013', + _updatedDate: '03/26/2013', + type: 0, + _isEditMode: false, + dueDate: '09/22/2019' + }, { + id: 42, + carId: 14, + text: 'integer aliquet massa id lobortis convallis', + _userId: 1, + _createdDate: '09/09/2013', + _updatedDate: '03/06/2018', + type: 1, + _isEditMode: false, + dueDate: '01/19/2019' + }, { + id: 43, + carId: 15, + text: 'proin leo odio porttitor id consequat in consequat', + _userId: 2, + _createdDate: '04/25/2015', + _updatedDate: '09/29/2015', + type: 0, + _isEditMode: false, + dueDate: '11/02/2019' + }, { + id: 44, + carId: 15, + text: 'mauris enim leo rhoncus sed vestibulum sit amet cursus id turpis integer aliquet massa id lobortis convallis tortor', + _userId: 1, + _createdDate: '11/28/2013', + _updatedDate: '10/12/2012', + type: 2, + _isEditMode: false, + dueDate: '02/28/2019' + }, { + id: 45, + carId: 15, + text: 'felis donec semper sapien a libero nam dui proin leo odio porttitor id consequat in consequat ut', + _userId: 1, + _createdDate: '12/24/2016', + _updatedDate: '03/18/2016', + type: 1, + _isEditMode: false, + dueDate: '11/13/2019' + }, { + id: 46, + carId: 16, + text: 'id lobortis convallis tortor risus dapibus augue vel accumsan tellus nisi eu orci mauris lacinia sapien quis libero', + _userId: 2, + _createdDate: '09/16/2015', + _updatedDate: '09/20/2011', + type: 1, + _isEditMode: false, + dueDate: '11/28/2019' + }, { + id: 47, + carId: 16, + text: 'semper rutrum nulla nunc purus phasellus', + _userId: 1, + _createdDate: '04/09/2017', + _updatedDate: '08/19/2012', + type: 0, + _isEditMode: false, + dueDate: '11/05/2019' + }, { + id: 48, + carId: 16, + text: 'curabitur at ipsum ac tellus semper', + _userId: 2, + _createdDate: '10/09/2010', + _updatedDate: '11/20/2014', + type: 2, + _isEditMode: false, + dueDate: '11/27/2018' + }, { + id: 49, + carId: 17, + text: 'tellus nisi eu orci mauris lacinia sapien', + _userId: 1, + _createdDate: '11/18/2012', + _updatedDate: '10/24/2017', + type: 1, + _isEditMode: false, + dueDate: '04/10/2019' + }, { + id: 50, + carId: 17, + text: 'quisque id justo sit amet sapien dignissim vestibulum vestibulum', + _userId: 1, + _createdDate: '09/21/2015', + _updatedDate: '11/27/2016', + type: 2, + _isEditMode: false, + dueDate: '12/17/2018' + }, { + id: 51, + carId: 17, + text: 'diam id ornare imperdiet sapien urna pretium nisl ut volutpat sapien arcu sed', + _userId: 1, + _createdDate: '08/13/2012', + _updatedDate: '06/21/2016', + type: 1, + _isEditMode: false, + dueDate: '06/11/2019' + }, { + id: 52, + carId: 18, + text: 'eget nunc donec', + _userId: 1, + _createdDate: '03/30/2012', + _updatedDate: '08/05/2012', + type: 1, + _isEditMode: false, + dueDate: '11/15/2018' + }, { + id: 53, + carId: 18, + text: 'nulla ac enim in tempor', + _userId: 1, + _createdDate: '04/30/2012', + _updatedDate: '11/12/2013', + type: 2, + _isEditMode: false, + dueDate: '01/16/2020' + }, { + id: 54, + carId: 18, + text: 'in quis justo maecenas rhoncus aliquam lacus morbi quis tortor id', + _userId: 2, + _createdDate: '08/29/2012', + _updatedDate: '12/10/2012', + type: 0, + _isEditMode: false, + dueDate: '09/25/2019' + }, { + id: 55, + carId: 19, + text: 'justo in', + _userId: 2, + _createdDate: '11/27/2017', + _updatedDate: '10/03/2010', + type: 0, + _isEditMode: false, + dueDate: '10/04/2019' + }, { + id: 56, + carId: 19, + text: 'duis', + _userId: 2, + _createdDate: '07/09/2016', + _updatedDate: '02/13/2013', + type: 2, + _isEditMode: false, + dueDate: '05/07/2020' + }, { + id: 57, + carId: 19, + text: 'luctus tincidunt nulla mollis molestie lorem quisque ut erat curabitur gravida nisi at nibh in hac habitasse platea', + _userId: 1, + _createdDate: '01/10/2014', + _updatedDate: '01/07/2014', + type: 0, + _isEditMode: false, + dueDate: '04/01/2020' + }, { + id: 58, + carId: 20, + text: 'non sodales sed tincidunt', + _userId: 1, + _createdDate: '02/15/2016', + _updatedDate: '12/12/2013', + type: 1, + _isEditMode: false, + dueDate: '08/26/2019' + }, { + id: 59, + carId: 20, + text: 'dictumst aliquam augue quam sollicitudin vitae consectetuer eget rutrum at lorem integer tincidunt ante vel ipsum', + _userId: 2, + _createdDate: '01/08/2018', + _updatedDate: '06/20/2011', + type: 2, + _isEditMode: false, + dueDate: '10/27/2019' + }, { + id: 60, + carId: 20, + text: 'adipiscing molestie hendrerit at vulputate', + _userId: 1, + _createdDate: '01/06/2013', + _updatedDate: '09/08/2017', + type: 2, + _isEditMode: false, + dueDate: '05/03/2020' + }, { + id: 61, + carId: 21, + text: 'sed tristique in tempus sit amet sem fusce consequat nulla nisl', + _userId: 1, + _createdDate: '01/05/2012', + _updatedDate: '06/05/2014', + type: 1, + _isEditMode: false, + dueDate: '04/06/2019' + }, { + id: 62, + carId: 21, + text: 'sem praesent id massa id nisl venenatis lacinia aenean sit', + _userId: 2, + _createdDate: '12/06/2014', + _updatedDate: '12/23/2013', + type: 2, + _isEditMode: false, + dueDate: '02/05/2019' + }, { + id: 63, + carId: 21, + text: 'curabitur at ipsum ac tellus semper interdum', + _userId: 2, + _createdDate: '11/23/2014', + _updatedDate: '04/10/2013', + type: 0, + _isEditMode: false, + dueDate: '04/05/2020' + }, { + id: 64, + carId: 22, + text: 'donec ut mauris eget massa tempor convallis', + _userId: 2, + _createdDate: '10/16/2011', + _updatedDate: '11/30/2012', + type: 2, + _isEditMode: false, + dueDate: '11/23/2019' + }, { + id: 65, + carId: 22, + text: 'in faucibus orci luctus et ultrices posuere', + _userId: 1, + _createdDate: '11/12/2011', + _updatedDate: '12/16/2016', + type: 2, + _isEditMode: false, + dueDate: '04/23/2019' + }, { + id: 66, + carId: 22, + text: 'ligula', + _userId: 2, + _createdDate: '12/30/2014', + _updatedDate: '12/12/2011', + type: 1, + _isEditMode: false, + dueDate: '03/28/2019' + }, { + id: 67, + carId: 23, + text: 'congue etiam justo etiam pretium iaculis justo in hac habitasse platea dictumst etiam faucibus cursus', + _userId: 1, + _createdDate: '05/09/2014', + _updatedDate: '05/28/2013', + type: 1, + _isEditMode: false, + dueDate: '11/25/2018' + }, { + id: 68, + carId: 23, + text: 'mollis molestie lorem quisque ut erat curabitur gravida nisi', + _userId: 2, + _createdDate: '12/07/2011', + _updatedDate: '08/07/2011', + type: 1, + _isEditMode: false, + dueDate: '06/22/2019' + }, { + id: 69, + carId: 23, + text: 'maecenas tincidunt lacus at velit vivamus vel nulla eget eros elementum pellentesque quisque porta volutpat erat quisque', + _userId: 1, + _createdDate: '11/15/2012', + _updatedDate: '09/02/2015', + type: 1, + _isEditMode: false, + dueDate: '10/30/2018' + }, { + id: 70, + carId: 24, + text: 'libero convallis', + _userId: 1, + _createdDate: '12/04/2010', + _updatedDate: '09/25/2011', + type: 1, + _isEditMode: false, + dueDate: '11/25/2018' + }, { + id: 71, + carId: 24, + text: 'vitae nisi nam ultrices libero', + _userId: 1, + _createdDate: '02/24/2015', + _updatedDate: '03/10/2011', + type: 2, + _isEditMode: false, + dueDate: '04/17/2020' + }, { + id: 72, + carId: 24, + text: 'augue a suscipit nulla elit ac nulla sed vel enim sit amet nunc', + _userId: 1, + _createdDate: '02/21/2012', + _updatedDate: '12/09/2011', + type: 2, + _isEditMode: false, + dueDate: '07/22/2019' + }, { + id: 73, + carId: 25, + text: 'id turpis integer aliquet massa id lobortis convallis tortor', + _userId: 1, + _createdDate: '01/20/2014', + _updatedDate: '09/03/2014', + type: 2, + _isEditMode: false, + dueDate: '01/10/2020' + }, { + id: 74, + carId: 25, + text: 'felis fusce posuere felis sed lacus morbi sem mauris laoreet', + _userId: 1, + _createdDate: '10/24/2014', + _updatedDate: '02/19/2018', + type: 1, + _isEditMode: false, + dueDate: '12/19/2019' + }, { + id: 75, + carId: 25, + text: 'neque libero convallis eget eleifend luctus ultricies eu nibh quisque id justo sit amet sapien dignissim', + _userId: 2, + _createdDate: '02/19/2016', + _updatedDate: '06/26/2013', + type: 1, + _isEditMode: false, + dueDate: '02/23/2020' + }, { + id: 76, + carId: 26, + text: 'nulla nunc purus phasellus in felis donec semper sapien a libero nam', + _userId: 1, + _createdDate: '07/29/2011', + _updatedDate: '12/09/2011', + type: 1, + _isEditMode: false, + dueDate: '02/07/2020' + }, { + id: 77, + carId: 26, + text: 'elit sodales scelerisque', + _userId: 2, + _createdDate: '10/02/2012', + _updatedDate: '05/05/2012', + type: 0, + _isEditMode: false, + dueDate: '10/05/2019' + }, { + id: 78, + carId: 26, + text: 'sed lacus morbi sem mauris laoreet ut rhoncus aliquet pulvinar sed nisl nunc rhoncus dui vel', + _userId: 1, + _createdDate: '01/27/2015', + _updatedDate: '07/14/2013', + type: 1, + _isEditMode: false, + dueDate: '01/19/2019' + }, { + id: 79, + carId: 27, + text: 'augue vestibulum', + _userId: 1, + _createdDate: '09/19/2011', + _updatedDate: '09/11/2014', + type: 0, + _isEditMode: false, + dueDate: '03/08/2020' + }, { + id: 80, + carId: 27, + text: 'turpis nec euismod scelerisque', + _userId: 2, + _createdDate: '01/17/2014', + _updatedDate: '03/04/2018', + type: 1, + _isEditMode: false, + dueDate: '11/08/2019' + }, { + id: 81, + carId: 27, + text: 'quisque id justo sit amet sapien dignissim vestibulum vestibulum ante ipsum primis in faucibus orci luctus', + _userId: 1, + _createdDate: '08/16/2015', + _updatedDate: '02/21/2011', + type: 1, + _isEditMode: false, + dueDate: '02/15/2019' + }, { + id: 82, + carId: 28, + text: 'ultrices posuere cubilia curae duis faucibus accumsan odio curabitur convallis duis consequat dui nec nisi volutpat eleifend', + _userId: 1, + _createdDate: '03/07/2014', + _updatedDate: '08/21/2012', + type: 2, + _isEditMode: false, + dueDate: '05/14/2019' + }, { + id: 83, + carId: 28, + text: 'curabitur gravida nisi at nibh in hac habitasse platea dictumst aliquam augue', + _userId: 2, + _createdDate: '09/20/2017', + _updatedDate: '08/21/2014', + type: 0, + _isEditMode: false, + dueDate: '07/07/2019' + }, { + id: 84, + carId: 28, + text: 'dolor quis odio consequat varius integer ac leo pellentesque ultrices mattis odio donec vitae nisi', + _userId: 2, + _createdDate: '04/08/2017', + _updatedDate: '08/17/2016', + type: 1, + _isEditMode: false, + dueDate: '03/19/2019' + }, { + id: 85, + carId: 29, + text: 'interdum in ante vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae duis faucibus', + _userId: 2, + _createdDate: '04/30/2013', + _updatedDate: '08/22/2013', + type: 2, + _isEditMode: false, + dueDate: '03/23/2020' + }, { + id: 86, + carId: 29, + text: 'faucibus orci luctus et ultrices posuere cubilia curae nulla dapibus dolor vel est donec odio justo sollicitudin ut suscipit a', + _userId: 2, + _createdDate: '04/12/2014', + _updatedDate: '03/06/2013', + type: 1, + _isEditMode: false, + dueDate: '02/17/2019' + }, { + id: 87, + carId: 29, + text: 'faucibus orci luctus et ultrices posuere cubilia curae donec pharetra magna vestibulum', + _userId: 2, + _createdDate: '11/21/2016', + _updatedDate: '08/21/2010', + type: 1, + _isEditMode: false, + dueDate: '11/06/2019' + }, { + id: 88, + carId: 30, + text: 'nibh in hac habitasse platea dictumst', + _userId: 1, + _createdDate: '10/30/2011', + _updatedDate: '03/07/2012', + type: 2, + _isEditMode: false, + dueDate: '12/02/2019' + }, { + id: 89, + carId: 30, + text: 'fusce lacus purus', + _userId: 2, + _createdDate: '09/02/2014', + _updatedDate: '05/22/2015', + type: 2, + _isEditMode: false, + dueDate: '10/13/2019' + }, { + id: 90, + carId: 30, + text: 'ultrices enim lorem ipsum dolor', + _userId: 1, + _createdDate: '12/21/2012', + _updatedDate: '02/28/2018', + type: 1, + _isEditMode: false, + dueDate: '12/08/2019' + }, { + id: 91, + carId: 31, + text: 'suspendisse accumsan tortor quis turpis', + _userId: 1, + _createdDate: '01/22/2014', + _updatedDate: '01/26/2015', + type: 2, + _isEditMode: false, + dueDate: '03/05/2019' + }, { + id: 92, + carId: 31, + text: 'sed interdum venenatis turpis enim blandit mi in porttitor pede justo eu massa', + _userId: 1, + _createdDate: '12/20/2013', + _updatedDate: '08/13/2016', + type: 0, + _isEditMode: false, + dueDate: '09/03/2019' + }, { + id: 93, + carId: 31, + text: 'quisque id justo sit amet sapien dignissim vestibulum vestibulum ante ipsum primis', + _userId: 1, + _createdDate: '07/08/2016', + _updatedDate: '02/26/2013', + type: 0, + _isEditMode: false, + dueDate: '01/22/2019' + }, { + id: 94, + carId: 32, + text: 'vitae nisi nam ultrices', + _userId: 1, + _createdDate: '02/21/2015', + _updatedDate: '03/04/2017', + type: 1, + _isEditMode: false, + dueDate: '01/05/2020' + }, { + id: 95, + carId: 32, + text: 'in tempus sit amet sem fusce consequat', + _userId: 2, + _createdDate: '09/15/2014', + _updatedDate: '05/21/2017', + type: 1, + _isEditMode: false, + dueDate: '03/31/2019' + }, { + id: 96, + carId: 32, + text: 'eros elementum pellentesque quisque porta volutpat erat quisque erat eros viverra eget congue eget semper', + _userId: 2, + _createdDate: '06/04/2014', + _updatedDate: '08/12/2010', + type: 0, + _isEditMode: false, + dueDate: '10/10/2019' + }, { + id: 97, + carId: 33, + text: 'eu pede', + _userId: 2, + _createdDate: '03/21/2011', + _updatedDate: '07/18/2012', + type: 2, + _isEditMode: false, + dueDate: '03/29/2020' + }, { + id: 98, + carId: 33, + text: 'tempus vivamus in felis eu sapien cursus vestibulum proin', + _userId: 2, + _createdDate: '09/17/2017', + _updatedDate: '11/29/2013', + type: 1, + _isEditMode: false, + dueDate: '04/01/2019' + }, { + id: 99, + carId: 33, + text: 'velit eu est congue elementum in hac habitasse platea dictumst morbi vestibulum velit id pretium iaculis diam erat fermentum', + _userId: 1, + _createdDate: '03/27/2013', + _updatedDate: '09/26/2014', + type: 1, + _isEditMode: false, + dueDate: '09/14/2019' + }, { + id: 100, + carId: 34, + text: 'luctus et ultrices posuere cubilia curae nulla dapibus dolor vel', + _userId: 2, + _createdDate: '03/07/2017', + _updatedDate: '08/14/2012', + type: 0, + _isEditMode: false, + dueDate: '08/11/2019', + }]; +} diff --git a/src/app/core/e-commerce/_services/customers.service.fake.ts b/src/app/core/e-commerce/_services/customers.service.fake.ts new file mode 100644 index 0000000..bb06a9b --- /dev/null +++ b/src/app/core/e-commerce/_services/customers.service.fake.ts @@ -0,0 +1,84 @@ +// Angular +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +// RxJS +import { Observable, forkJoin, of } from 'rxjs'; +import { mergeMap, delay } from 'rxjs/operators'; +// Lodash +import { each } from 'lodash'; +// CRUD +import { HttpUtilsService, QueryParamsModel, QueryResultsModel } from '../../_base/crud'; +// Models +import { CustomerModel } from '../_models/customer.model'; + +const API_CUSTOMERS_URL = 'api/customers'; + +// Fake REST API (Mock) +// This code emulates server calls +@Injectable() +export class CustomersService { + constructor(private http: HttpClient, private httpUtils: HttpUtilsService) { } + + // CREATE => POST: add a new customer to the server + createCustomer(customer: CustomerModel): Observable { + // Note: Add headers if needed (tokens/bearer) + const httpHeaders = this.httpUtils.getHTTPHeaders(); + return this.http.post(API_CUSTOMERS_URL, customer, { headers: httpHeaders}); + } + + // READ + getAllCustomers(): Observable { + return this.http.get(API_CUSTOMERS_URL); + } + + getCustomerById(customerId: number): Observable { + return this.http.get(API_CUSTOMERS_URL + `/${customerId}`); + } + + // Method from server should return QueryResultsModel(items: any[], totalsCount: number) + // items => filtered/sorted result + findCustomers(queryParams: QueryParamsModel): Observable { + // This code imitates server calls + const url = API_CUSTOMERS_URL; + return this.http.get(API_CUSTOMERS_URL).pipe( + mergeMap(res => { + const result = this.httpUtils.baseFilter(res, queryParams, ['status', 'type']); + return of(result); + }) + ); + } + + + // UPDATE => PUT: update the customer on the server + updateCustomer(customer: CustomerModel): Observable { + const httpHeader = this.httpUtils.getHTTPHeaders(); + return this.http.put(API_CUSTOMERS_URL, customer, { headers: httpHeader }); + } + + // UPDATE Status + updateStatusForCustomer(customers: CustomerModel[], status: number): Observable { + const tasks$ = []; + each(customers, element => { + const _customer = Object.assign({}, element); + _customer.status = status; + tasks$.push(this.updateCustomer(_customer)); + }); + return forkJoin(tasks$); + } + + // DELETE => delete the customer from the server + deleteCustomer(customerId: number): Observable { + const url = `${API_CUSTOMERS_URL}/${customerId}`; + return this.http.delete(url); + } + + deleteCustomers(ids: number[] = []): Observable { + const tasks$ = []; + const length = ids.length; + // tslint:disable-next-line:prefer-const + for (let i = 0; i < length; i++) { + tasks$.push(this.deleteCustomer(ids[i])); + } + return forkJoin(tasks$); + } +} diff --git a/src/app/core/e-commerce/_services/customers.service.ts b/src/app/core/e-commerce/_services/customers.service.ts new file mode 100644 index 0000000..684a5b0 --- /dev/null +++ b/src/app/core/e-commerce/_services/customers.service.ts @@ -0,0 +1,77 @@ +// Angular +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +// RxJS +import { Observable } from 'rxjs'; +// CRUD +import { HttpUtilsService, QueryParamsModel, QueryResultsModel } from '../../_base/crud'; +// Models +import { CustomerModel } from '../_models/customer.model'; + +const API_CUSTOMERS_URL = 'api/customers'; + +@Injectable() +export class CustomersService { + constructor(private http: HttpClient, private httpUtils: HttpUtilsService) { } + + // CREATE => POST: add a new customer to the server + createCustomer(customer: CustomerModel): Observable { + // Note: Add headers if needed (tokens/bearer) + const httpHeaders = this.httpUtils.getHTTPHeaders(); + return this.http.post(API_CUSTOMERS_URL, customer, { headers: httpHeaders}); + } + + // READ + getAllCustomers(): Observable { + return this.http.get(API_CUSTOMERS_URL); + } + + getCustomerById(customerId: number): Observable { + return this.http.get(API_CUSTOMERS_URL + `/${customerId}`); + } + + // Method from server should return QueryResultsModel(items: any[], totalsCount: number) + // items => filtered/sorted result + // Server should return filtered/sorted result + findCustomers(queryParams: QueryParamsModel): Observable { + // Note: Add headers if needed (tokens/bearer) + const httpHeaders = this.httpUtils.getHTTPHeaders(); + const httpParams = this.httpUtils.getFindHTTPParams(queryParams); + + const url = API_CUSTOMERS_URL + '/find'; + return this.http.get(url, { + headers: httpHeaders, + params: httpParams + }); + } + + // UPDATE => PUT: update the customer on the server + updateCustomer(customer: CustomerModel): Observable { + const httpHeader = this.httpUtils.getHTTPHeaders(); + return this.http.put(API_CUSTOMERS_URL, customer, { headers: httpHeader }); + } + + // UPDATE Status + updateStatusForCustomer(customers: CustomerModel[], status: number): Observable { + const httpHeaders = this.httpUtils.getHTTPHeaders(); + const body = { + customersForUpdate: customers, + newStatus: status + }; + const url = API_CUSTOMERS_URL + '/updateStatus'; + return this.http.put(url, body, { headers: httpHeaders }); + } + + // DELETE => delete the customer from the server + deleteCustomer(customerId: number): Observable { + const url = `${API_CUSTOMERS_URL}/${customerId}`; + return this.http.delete(url); + } + + deleteCustomers(ids: number[] = []): Observable { + const url = API_CUSTOMERS_URL + '/deleteCustomers'; + const httpHeaders = this.httpUtils.getHTTPHeaders(); + const body = { customerIdsForDelete: ids }; + return this.http.put(url, body, { headers: httpHeaders} ); + } +} diff --git a/src/app/core/e-commerce/_services/index.ts b/src/app/core/e-commerce/_services/index.ts new file mode 100644 index 0000000..75c299d --- /dev/null +++ b/src/app/core/e-commerce/_services/index.ts @@ -0,0 +1,14 @@ + +// Services +export { CustomersService } from './customers.service.fake'; // You have to comment this, when your real back-end is done +// export { CustomersService } from './customers.service'; // You have to uncomment this, when your real back-end is done +export { ProductsService } from './products.service.fake'; // You have to comment this, when your real back-end is done +// export { ProductsService } from './products.service'; // You have to uncomment this, when your real back-end is done +export { ProductRemarksService } +from './product-remarks.service.fake'; // You have to comment this, when your real back-end is done +// export { ProductRemarksService } +// from './product-remarks.service'; // You have to uncomment this, when your real back-end is done +export { ProductSpecificationsService } +from './product-specifications.service.fake'; // You have to comment this, when your real back-end is done +// export { ProductSpecificationsService } +// from './product-specifications.service'; // You have to uncomment this, when your real back-end is done diff --git a/src/app/core/e-commerce/_services/orders.service.ts b/src/app/core/e-commerce/_services/orders.service.ts new file mode 100644 index 0000000..9c55bac --- /dev/null +++ b/src/app/core/e-commerce/_services/orders.service.ts @@ -0,0 +1,22 @@ +// Angular +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +// CRUD +import { HttpUtilsService } from '../../_base/crud'; + +const API_ORDERS_URL = 'api/orders'; + +@Injectable() +export class OrdersService { + httpOptions = this.httpUtils.getHTTPHeaders(); + + constructor(private http: HttpClient, + private httpUtils: HttpUtilsService) { } + + // CREATE + // READ + // UPDATE + // DELETE +} + + diff --git a/src/app/core/e-commerce/_services/product-remarks.service.fake.ts b/src/app/core/e-commerce/_services/product-remarks.service.fake.ts new file mode 100644 index 0000000..8835583 --- /dev/null +++ b/src/app/core/e-commerce/_services/product-remarks.service.fake.ts @@ -0,0 +1,88 @@ +// Angular +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +// RxJS +import { Observable, of, forkJoin } from 'rxjs'; +import { map, mergeMap } from 'rxjs/operators'; +// CRUD +import { HttpUtilsService, QueryParamsModel, QueryResultsModel } from '../../_base/crud'; +// Models +import { ProductRemarkModel } from '../_models/product-remark.model'; + +const API_PRODUCTREMARKS_URL = 'api/productRemarks'; +// Fake REST API (Mock) +// This code emulates server calls +@Injectable() +export class ProductRemarksService { + constructor( + private http: HttpClient, + private httpUtils: HttpUtilsService + ) {} + + // CREATE => POST: add a new product remark to the server + createProductRemark(productRemark): Observable { + // Note: Add headers if needed (tokens/bearer) + const httpHeaders = this.httpUtils.getHTTPHeaders(); + return this.http.post( + API_PRODUCTREMARKS_URL, + productRemark, + { headers: httpHeaders } + ); + } + + // READ + getAllProductRemarksByProductId( + productId: number + ): Observable { + return this.http + .get(API_PRODUCTREMARKS_URL) + .pipe( + map(productRemarks => { + return productRemarks.filter(rem => rem.carId === productId); + }) + ); + } + + getProductRemarkById(productRemarkId: number): Observable { + return this.http.get( + API_PRODUCTREMARKS_URL + `/${productRemarkId}` + ); + } + + findProductRemarks( + queryParams: QueryParamsModel, + productId: number + ): Observable { + return this.getAllProductRemarksByProductId(productId).pipe( + mergeMap(res => { + const result = this.httpUtils.baseFilter(res, queryParams, []); + return of(result); + }) + ); + } + + // UPDATE => PUT: update the product remark + updateProductRemark(productRemark: ProductRemarkModel): Observable { + // Note: Add headers if needed (tokens/bearer) + const httpHeaders = this.httpUtils.getHTTPHeaders(); + return this.http.put(API_PRODUCTREMARKS_URL, productRemark, { + headers: httpHeaders + }); + } + + // DELETE => delete the product remark + deleteProductRemark(productRemarkId: number): Observable { + const url = `${API_PRODUCTREMARKS_URL}/${productRemarkId}`; + return this.http.delete(url); + } + + deleteProductRemarks(ids: number[] = []): Observable { + const tasks$ = []; + const length = ids.length; + // tslint:disable-next-line:prefer-const + for (let i = 0; i < length; i++) { + tasks$.push(this.deleteProductRemark(ids[i])); + } + return forkJoin(tasks$); + } +} diff --git a/src/app/core/e-commerce/_services/product-remarks.service.ts b/src/app/core/e-commerce/_services/product-remarks.service.ts new file mode 100644 index 0000000..7aa01be --- /dev/null +++ b/src/app/core/e-commerce/_services/product-remarks.service.ts @@ -0,0 +1,64 @@ +// Angular +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +// RxJS +import { Observable } from 'rxjs'; +// CRUD +import { HttpUtilsService, QueryParamsModel, QueryResultsModel } from '../../_base/crud'; +import { ProductRemarkModel } from '../_models/product-remark.model'; + +const API_PRODUCTREMARKS_URL = 'api/productRemarks'; +// Real REST API +@Injectable() +export class ProductRemarksService { + constructor(private http: HttpClient, private httpUtils: HttpUtilsService) { } + + // CREATE => POST: add a new product remark to the server + createProductRemark(productRemark): Observable { + // Note: Add headers if needed (tokens/bearer) + const httpHeaders = this.httpUtils.getHTTPHeaders(); + return this.http.post(API_PRODUCTREMARKS_URL, productRemark, { headers: httpHeaders }); + } + + // READ + // Server should return filtered remarks by productId + getAllProductRemarksByProductId(productId: number): Observable { + const url = API_PRODUCTREMARKS_URL + '?productId=' + productId; + return this.http.get(url); + } + + getProductRemarkById(productRemarkId: number): Observable { + return this.http.get(API_PRODUCTREMARKS_URL + `/${productRemarkId}`); + } + + // Server should return sorted/filtered remarks and merge with items from state + findProductRemarks(queryParams: QueryParamsModel, productId: number): Observable { + const url = API_PRODUCTREMARKS_URL + '/find?productId=' + productId; + // Note: Add headers if needed (tokens/bearer) + const httpHeaders = this.httpUtils.getHTTPHeaders(); + const body = { + query: queryParams + }; + return this.http.post(url, body, { headers: httpHeaders }); + } + + // UPDATE => PUT: update the product remark + updateProductRemark(productRemark: ProductRemarkModel): Observable { + // Note: Add headers if needed (tokens/bearer) + const httpHeaders = this.httpUtils.getHTTPHeaders(); + return this.http.put(API_PRODUCTREMARKS_URL, productRemark, { headers: httpHeaders }); + } + + // DELETE => delete the product remark + deleteProductRemark(productRemarkId: number): Observable { + const url = `${API_PRODUCTREMARKS_URL}/${productRemarkId}`; + return this.http.delete(url); + } + + deleteProductRemarks(ids: number[] = []): Observable { + const url = API_PRODUCTREMARKS_URL + '/deleteProductRemarks'; + const httpHeaders = this.httpUtils.getHTTPHeaders(); + const body = { productRemarkIdsForDelete: ids }; + return this.http.put(url, body, { headers: httpHeaders} ); + } +} diff --git a/src/app/core/e-commerce/_services/product-specifications.service.fake.ts b/src/app/core/e-commerce/_services/product-specifications.service.fake.ts new file mode 100644 index 0000000..0141b28 --- /dev/null +++ b/src/app/core/e-commerce/_services/product-specifications.service.fake.ts @@ -0,0 +1,108 @@ +// Angular +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +// RxJS +import { Observable, forkJoin, of } from 'rxjs'; +import { map, mergeMap, tap } from 'rxjs/operators'; +// CRUD +import { HttpUtilsService, QueryParamsModel, QueryResultsModel } from '../../_base/crud'; +// Models and Consts +import { ProductSpecificationModel } from '../_models/product-specification.model'; +import { SPECIFICATIONS_DICTIONARY } from '../_consts/specification.dictionary'; + +const API_PRODUCTSPECS_URL = 'api/productSpecs'; + +// Fake REST API (Mock) +// This code emulates server calls +@Injectable() +export class ProductSpecificationsService { + constructor(private http: HttpClient, private httpUtils: HttpUtilsService) {} + + // CREATE => POST: add a new product specification to the server + createProductSpec(productSpec): Observable { + // Note: Add headers if needed (tokens/bearer) + const httpHeaders = this.httpUtils.getHTTPHeaders(); + return this.http.post( + API_PRODUCTSPECS_URL, + productSpec, + { headers: httpHeaders } + ); + } + + // READ + getAllProductSpecsByProductId( + productId: number + ): Observable { + const prodSpecs = this.http + .get(API_PRODUCTSPECS_URL) + .pipe( + map(productSpecifications => + productSpecifications.filter(ps => ps.carId === productId) + ) + ); + + return prodSpecs.pipe( + map(res => { + const _prodSpecs = res; + const result: ProductSpecificationModel[] = []; + _prodSpecs.forEach(item => { + const _item = Object.assign({}, item); + const specName = SPECIFICATIONS_DICTIONARY[_item.specId]; + if (specName) { + _item._specificationName = specName; + } + result.push(_item); + }); + return result; + }) + ); + } + + getProductSpecById(productSpecId: number): Observable { + return this.http.get( + API_PRODUCTSPECS_URL + `/${productSpecId}` + ); + } + + findProductSpecs( + queryParams: QueryParamsModel, + productId: number): Observable { + return this.getAllProductSpecsByProductId(productId).pipe( + mergeMap(res => { + const result = this.httpUtils.baseFilter( + res, + queryParams, + [] + ); + return of(result); + }) + ); + } + + // UPDATE => PUT: update the product specification on the server + updateProductSpec(productSpec: ProductSpecificationModel): Observable { + return this.http.put(API_PRODUCTSPECS_URL, productSpec, { + headers: this.httpUtils.getHTTPHeaders() + }); + } + + // DELETE => delete the product specification from the server + deleteProductSpec(productSpecId: number): Observable { + const url = `${API_PRODUCTSPECS_URL}/${productSpecId}`; + return this.http.delete(url); + } + + deleteProductSpecifications(ids: number[] = []): Observable { + const tasks$ = []; + const length = ids.length; + // tslint:disable-next-line:prefer-const + for (let i = 0; i < length; i++) { + tasks$.push(this.deleteProductSpec(ids[i])); + } + return forkJoin(tasks$); + } + + getSpecs(): string[] { + return SPECIFICATIONS_DICTIONARY; + } +} diff --git a/src/app/core/e-commerce/_services/product-specifications.service.ts b/src/app/core/e-commerce/_services/product-specifications.service.ts new file mode 100644 index 0000000..272704d --- /dev/null +++ b/src/app/core/e-commerce/_services/product-specifications.service.ts @@ -0,0 +1,69 @@ +// Angular +import { Injectable } from '@angular/core'; +import { HttpClient} from '@angular/common/http'; +// RxJS +import { Observable, forkJoin } from 'rxjs'; +import { map } from 'rxjs/operators'; +// CRUD +import { HttpUtilsService, QueryParamsModel, QueryResultsModel } from '../../_base/crud'; +// Models and Consts +import { ProductSpecificationModel } from '../_models/product-specification.model'; +import { SPECIFICATIONS_DICTIONARY } from '../_consts/specification.dictionary'; + +const API_PRODUCTSPECS_URL = 'api/productSpecs'; +// Real REST API +@Injectable() +export class ProductSpecificationsService { + constructor(private http: HttpClient, private httpUtils: HttpUtilsService) { } + + // CREATE => POST: add a new product specification to the server + createProductSpec(productSpec): Observable { + // Note: Add headers if needed (tokens/bearer) + const httpHeaders = this.httpUtils.getHTTPHeaders(); + return this.http.post(API_PRODUCTSPECS_URL, productSpec, { headers: httpHeaders }); + } + + // READ + // Server should return filtered specs by productId + getAllProductSpecsByProductId(productId: number): Observable { + const url = API_PRODUCTSPECS_URL + '?productId=' + productId; + return this.http.get(url); + } + + getProductSpecById(productSpecId: number): Observable { + return this.http.get(API_PRODUCTSPECS_URL + `/${productSpecId}`); + } + + // Server should return sorted/filtered specs and merge with items from state + findProductSpecs(queryParams: QueryParamsModel, productId: number): Observable { + const url = API_PRODUCTSPECS_URL + '/find?productId=' + productId; + // Note: Add headers if needed (tokens/bearer) + const httpHeaders = this.httpUtils.getHTTPHeaders(); + const body = { + state: queryParams + }; + return this.http.post(url, body, { headers: httpHeaders }); + } + + // UPDATE => PUT: update the product specification on the server + updateProductSpec(productSpec: ProductSpecificationModel): Observable { + return this.http.put(API_PRODUCTSPECS_URL, productSpec, { headers: this.httpUtils.getHTTPHeaders() }); + } + + // DELETE => delete the product specification from the server + deleteProductSpec(productSpecId: number): Observable { + const url = `${API_PRODUCTSPECS_URL}/${productSpecId}`; + return this.http.delete(url); + } + + deleteProductSpecifications(ids: number[] = []): Observable { + const url = API_PRODUCTSPECS_URL + '/deleteProductSpecifications'; + const httpHeaders = this.httpUtils.getHTTPHeaders(); + const body = { productSpecificationIdsForDelete: ids }; + return this.http.put(url, body, { headers: httpHeaders} ); + } + + getSpecs(): string[] { + return SPECIFICATIONS_DICTIONARY; + } +} diff --git a/src/app/core/e-commerce/_services/products.service.fake.ts b/src/app/core/e-commerce/_services/products.service.fake.ts new file mode 100644 index 0000000..796fa2e --- /dev/null +++ b/src/app/core/e-commerce/_services/products.service.fake.ts @@ -0,0 +1,82 @@ +// Angular +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +// RxJS +import { Observable, forkJoin, BehaviorSubject, of } from 'rxjs'; +import { mergeMap } from 'rxjs/operators'; +// CRUD +import { HttpUtilsService, QueryParamsModel, QueryResultsModel } from '../../_base/crud'; +// Models +import { ProductModel } from '../_models/product.model'; +import { each } from 'lodash'; + +const API_PRODUCTS_URL = 'api/products'; +// Fake REST API (Mock) +// This method emulates server calls +@Injectable() +export class ProductsService { + lastFilter$: BehaviorSubject = new BehaviorSubject(new QueryParamsModel({}, 'asc', '', 0, 10)); + + constructor(private http: HttpClient, + private httpUtils: HttpUtilsService) { } + + // CREATE => POST: add a new product to the server + createProduct(product): Observable { + const httpHeaders = this.httpUtils.getHTTPHeaders(); + return this.http.post(API_PRODUCTS_URL, product, { headers: httpHeaders }); + } + + // READ + getAllProducts(): Observable { + return this.http.get(API_PRODUCTS_URL); + } + + getProductById(productId: number): Observable { + return this.http.get(API_PRODUCTS_URL + `/${productId}`); + } + + findProducts(queryParams: QueryParamsModel): Observable { + return this.getAllProducts().pipe( + mergeMap(res => { + const result = this.httpUtils.baseFilter(res, queryParams, ['status', 'condition']); + return of(result); + }) + ); + } + + // UPDATE => PUT: update the product on the server + updateProduct(product: ProductModel): Observable { + // Note: Add headers if needed (tokens/bearer) + const httpHeaders = this.httpUtils.getHTTPHeaders(); + return this.http.put(API_PRODUCTS_URL, product, { headers: httpHeaders }); + } + + // UPDATE Status + // Comment this when you start work with real server + // This code imitates server calls + updateStatusForProduct(products: ProductModel[], status: number): Observable { + const tasks$ = []; + each(products, element => { + const _product = Object.assign({}, element); + _product.status = status; + tasks$.push(this.updateProduct(_product)); + }); + return forkJoin(tasks$); + } + + // DELETE => delete the product from the server + deleteProduct(productId: number): Observable { + const url = `${API_PRODUCTS_URL}/${productId}`; + return this.http.delete(url); + } + + deleteProducts(ids: number[] = []): Observable { + const tasks$ = []; + const length = ids.length; + // tslint:disable-next-line:prefer-const + for (let i = 0; i < length; i++) { + tasks$.push(this.deleteProduct(ids[i])); + } + return forkJoin(tasks$); + } +} diff --git a/src/app/core/e-commerce/_services/products.service.ts b/src/app/core/e-commerce/_services/products.service.ts new file mode 100644 index 0000000..dab0938 --- /dev/null +++ b/src/app/core/e-commerce/_services/products.service.ts @@ -0,0 +1,80 @@ +// Angular +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +// RxJS +import { Observable, BehaviorSubject } from 'rxjs'; +// CRUD +import { HttpUtilsService, QueryParamsModel, QueryResultsModel } from '../../_base/crud'; +// Models +import { ProductModel } from '../_models/product.model'; + +const API_PRODUCTS_URL = 'api/products'; +// Real REST API +@Injectable() +export class ProductsService { + lastFilter$: BehaviorSubject = new BehaviorSubject(new QueryParamsModel({}, 'asc', '', 0, 10)); + + constructor(private http: HttpClient, + private httpUtils: HttpUtilsService) { } + + // CREATE => POST: add a new product to the server + createProduct(product): Observable { + const httpHeaders = this.httpUtils.getHTTPHeaders(); + return this.http.post(API_PRODUCTS_URL, product, { headers: httpHeaders }); + } + + // READ + getAllProducts(): Observable { + return this.http.get(API_PRODUCTS_URL); + } + + getProductById(productId: number): Observable { + return this.http.get(API_PRODUCTS_URL + `/${productId}`); + } + + // Server should return filtered/sorted result + findProducts(queryParams: QueryParamsModel): Observable { + // Note: Add headers if needed (tokens/bearer) + const httpHeaders = this.httpUtils.getHTTPHeaders(); + const httpParams = this.httpUtils.getFindHTTPParams(queryParams); + + const url = API_PRODUCTS_URL + '/find'; + return this.http.get(url, { + headers: httpHeaders, + params: httpParams + }); + } + + // UPDATE => PUT: update the product on the server + updateProduct(product: ProductModel): Observable { + // Note: Add headers if needed (tokens/bearer) + const httpHeaders = this.httpUtils.getHTTPHeaders(); + return this.http.put(API_PRODUCTS_URL, product, { headers: httpHeaders }); + } + + // UPDATE Status + // Comment this when you start work with real server + // This code imitates server calls + updateStatusForProduct(products: ProductModel[], status: number): Observable { + const httpHeaders = this.httpUtils.getHTTPHeaders(); + const body = { + productsForUpdate: products, + newStatus: status + }; + const url = API_PRODUCTS_URL + '/updateStatus'; + return this.http.put(url, body, { headers: httpHeaders }); + } + + // DELETE => delete the product from the server + deleteProduct(productId: number): Observable { + const url = `${API_PRODUCTS_URL}/${productId}`; + return this.http.delete(url); + } + + deleteProducts(ids: number[] = []): Observable { + const url = API_PRODUCTS_URL + '/delete'; + const httpHeaders = this.httpUtils.getHTTPHeaders(); + const body = { prdocutIdsForDelete: ids }; + return this.http.put(url, body, { headers: httpHeaders} ); + } +} diff --git a/src/app/core/e-commerce/index.ts b/src/app/core/e-commerce/index.ts new file mode 100644 index 0000000..36b4973 --- /dev/null +++ b/src/app/core/e-commerce/index.ts @@ -0,0 +1,137 @@ +// Context +export { ECommerceDataContext } from './_server/_e-commerce.data-context'; + +// Models and Consts +export { CustomerModel } from './_models/customer.model'; +export { ProductRemarkModel } from './_models/product-remark.model'; +export { ProductSpecificationModel } from './_models/product-specification.model'; +export { ProductModel } from './_models/product.model'; +export { SPECIFICATIONS_DICTIONARY } from './_consts/specification.dictionary'; + +// DataSources +export { CustomersDataSource } from './_data-sources/customers.datasource'; +export { ProductRemarksDataSource } from './_data-sources/product-remarks.datasource'; +export { ProductSpecificationsDataSource } from './_data-sources/product-specifications.datasource'; +export { ProductsDataSource } from './_data-sources/products.datasource'; + +// Actions +// Customer Actions => +export { + CustomerActionTypes, + CustomerActions, + CustomerOnServerCreated, + CustomerCreated, + CustomerUpdated, + CustomersStatusUpdated, + OneCustomerDeleted, + ManyCustomersDeleted, + CustomersPageRequested, + CustomersPageLoaded, + CustomersPageCancelled, + CustomersPageToggleLoading +} from './_actions/customer.actions'; +// Product actions => +export { + ProductActionTypes, + ProductActions, + ProductOnServerCreated, + ProductCreated, + ProductUpdated, + ProductsStatusUpdated, + OneProductDeleted, + ManyProductsDeleted, + ProductsPageRequested, + ProductsPageLoaded, + ProductsPageCancelled, + ProductsPageToggleLoading, + ProductsActionToggleLoading +} from './_actions/product.actions'; +// ProductRemark Actions => +export { + ProductRemarkActionTypes, + ProductRemarkActions, + ProductRemarkCreated, + ProductRemarkUpdated, + ProductRemarkStoreUpdated, + OneProductRemarkDeleted, + ManyProductRemarksDeleted, + ProductRemarksPageRequested, + ProductRemarksPageLoaded, + ProductRemarksPageCancelled, + ProductRemarksPageToggleLoading, + ProductRemarkOnServerCreated +} from './_actions/product-remark.actions'; +// ProductSpecification Actions => +export { + ProductSpecificationActionTypes, + ProductSpecificationActions, + ProductSpecificationCreated, + ProductSpecificationUpdated, + OneProductSpecificationDeleted, + ManyProductSpecificationsDeleted, + ProductSpecificationsPageRequested, + ProductSpecificationsPageLoaded, + ProductSpecificationsPageCancelled, + ProductSpecificationsPageToggleLoading, + ProductSpecificationOnServerCreated +} from './_actions/product-specification.actions'; + + +// Effects +export { CustomerEffects } from './_effects/customer.effects'; +export { ProductEffects } from './_effects/product.effects'; +export { ProductRemarkEffects } from './_effects/product-remark.effects'; +export { ProductSpecificationEffects } from './_effects/product-specification.effects'; + +// Reducers +export { customersReducer } from './_reducers/customer.reducers'; +export { productsReducer } from './_reducers/product.reducers'; +export { productRemarksReducer } from './_reducers/product-remark.reducers'; +export { productSpecificationsReducer } from './_reducers/product-specification.reducers'; + +// Selectors +// Customer selectors => +export { + selectCustomerById, + selectCustomersInStore, + selectCustomersPageLoading, + selectLastCreatedCustomerId, + selectCustomersActionLoading, + selectCustomersShowInitWaitingMessage +} from './_selectors/customer.selectors'; +// Product selectors +export { + selectProductById, + selectProductsInStore, + selectProductsPageLoading, + selectProductsPageLastQuery, + selectLastCreatedProductId, + selectHasProductsInStore, + selectProductsActionLoading, + selectProductsInitWaitingMessage +} from './_selectors/product.selectors'; +// ProductRemark selectors => +export { + selectProductRemarkById, + selectProductRemarksInStore, + selectProductRemarksPageLoading, + selectCurrentProductIdInStoreForProductRemarks, + selectLastCreatedProductRemarkId, + selectPRShowInitWaitingMessage +} from './_selectors/product-remark.selectors'; +// ProductSpecification selectors => +export { + selectProductSpecificationById, + selectProductSpecificationsInStore, + selectProductSpecificationsPageLoading, + selectCurrentProductIdInStoreForProductSpecs, + selectProductSpecificationsState, + selectLastCreatedProductSpecificationId, + selectPSShowInitWaitingMessage +} from './_selectors/product-specification.selectors'; + +// Services +export { CustomersService } from './_services/'; +export { ProductsService } from './_services/'; +export { ProductRemarksService } from './_services/'; +export { ProductSpecificationsService } from './_services/'; diff --git a/src/app/core/reducers/index.ts b/src/app/core/reducers/index.ts new file mode 100644 index 0000000..c327f28 --- /dev/null +++ b/src/app/core/reducers/index.ts @@ -0,0 +1,13 @@ +// NGRX +import { routerReducer } from '@ngrx/router-store'; +import { ActionReducerMap, MetaReducer } from '@ngrx/store'; +import { storeFreeze } from 'ngrx-store-freeze'; + +import { environment } from '../../../environments/environment'; + +// tslint:disable-next-line:no-empty-interface +export interface AppState { } + +export const reducers: ActionReducerMap = { router: routerReducer }; + +export const metaReducers: Array> = !environment.production ? [storeFreeze] : []; diff --git a/src/app/core/validators/no_negative.validator.ts b/src/app/core/validators/no_negative.validator.ts new file mode 100644 index 0000000..e7da526 --- /dev/null +++ b/src/app/core/validators/no_negative.validator.ts @@ -0,0 +1,21 @@ +import {FormControl} from "@angular/forms"; + +export function NumberAndNoNegative(controlName:FormControl) { + const VALUE = Number(controlName.value); + if (!Number.isInteger(VALUE)) { + return { + type_number: { + parsedValue: VALUE + } + } + } + + if (VALUE < 0) { + return { + no_negative: { + parsedValue: VALUE + } + } + } + return null; +} diff --git a/src/app/core/validators/pw_match.validator.ts b/src/app/core/validators/pw_match.validator.ts new file mode 100644 index 0000000..e5e11d2 --- /dev/null +++ b/src/app/core/validators/pw_match.validator.ts @@ -0,0 +1,18 @@ +import { FormGroup } from '@angular/forms'; + +export function PasswordMatch(password: string, pw_match: string) { + return (formGroup: FormGroup) => { + const PASS = formGroup.controls[password]; + const MATCH = formGroup.controls[pw_match]; + + if (MATCH.errors && !MATCH.errors.mustMatch) { + return; + } + + if (PASS.value !== MATCH.value) { + MATCH.setErrors({ mustMatch: true }); + } else { + MATCH.setErrors(null); + } + } +} diff --git a/src/app/core/validators/time.validator.ts b/src/app/core/validators/time.validator.ts new file mode 100644 index 0000000..d904fc5 --- /dev/null +++ b/src/app/core/validators/time.validator.ts @@ -0,0 +1,74 @@ +import {FormGroup} from "@angular/forms"; + +export function TimeValid(time_init: string, time_final: string) { + return (formGroup: FormGroup) => { + const TIME_INIT = formGroup.controls[time_init]; + const TIME_FINAL = formGroup.controls[time_final]; + + if (TIME_INIT.errors && !TIME_INIT.errors.time_invalid) { + return; + } + if (TIME_FINAL.errors && !TIME_FINAL.errors.time_invalid) { + return; + } + if (!TIME_INIT.value){ + return; + } + if (!TIME_FINAL.value){ + return; + } + + let time_init_array:Array = TIME_INIT.value.split(':'); + let time_final_array:Array = TIME_FINAL.value.split(':'); + + if (time_init_array.length != 2){ + TIME_INIT.setErrors({time_invalid: true}); + }else { + TIME_INIT.setErrors(null); + } + + if (time_final_array.length != 2){ + TIME_FINAL.setErrors({time_invalid: true}); + }else { + TIME_FINAL.setErrors(null); + } + } +} + +export function TimeValanced(time_init: string, time_final: string) { + return (formGroup: FormGroup) => { + const TIME_INIT = formGroup.controls[time_init]; + const TIME_FINAL = formGroup.controls[time_final]; + + if (TIME_INIT.errors && !TIME_INIT.errors.time_invalid) { + return; + } + if (TIME_FINAL.errors && !TIME_FINAL.errors.time_invalid) { + return; + } + if (!TIME_INIT.value){ + return; + } + if (!TIME_FINAL.value){ + return; + } + + let time_init_array:Array = TIME_INIT.value.split(':'); + let time_final_array:Array = TIME_FINAL.value.split(':'); + + if (time_init_array.length == 2){ + if (time_init_array[0] == time_final_array[0]){ + if (time_init_array[1] >= time_final_array[1]){ + TIME_INIT.setErrors({time_init_minute: true}); + }else { + TIME_INIT.setErrors(null); + } + }else if (time_init_array[0] > time_final_array[0]){ + TIME_INIT.setErrors({time_init_invalid: true}); + }else { + TIME_INIT.setErrors(null); + TIME_FINAL.setErrors(null); + } + }else return; + } +} diff --git a/src/app/paginator-config.ts b/src/app/paginator-config.ts new file mode 100644 index 0000000..13ef4ca --- /dev/null +++ b/src/app/paginator-config.ts @@ -0,0 +1,19 @@ +import { MatPaginatorIntl } from '@angular/material'; + +export function PaginatorConfig() { + const paginatorConfig = new MatPaginatorIntl(); + + paginatorConfig.itemsPerPageLabel = 'Elementos por página:'; + + paginatorConfig.getRangeLabel = (page: number, pageSize: number, length: number) => { + if (length === 0 || pageSize === 0) { + return `0 de ${length}`; + } + length = Math.max(length, 0); + let startIndex = page * pageSize; + let endIndex = startIndex < length ? Math.min(startIndex + pageSize, length) : startIndex + pageSize; + return `${startIndex + 1} - ${endIndex} de ${length}`; + } + + return paginatorConfig; +} diff --git a/src/app/utils.ts b/src/app/utils.ts new file mode 100644 index 0000000..eb4c7be --- /dev/null +++ b/src/app/utils.ts @@ -0,0 +1,9 @@ +export default class Utils { + static isTrue(value) { + return value == '1' || value == 1; + } + + static toNumber(value) { + return Number(value); + } +} diff --git a/src/app/views/pages/agenda/agenda.module.ts b/src/app/views/pages/agenda/agenda.module.ts new file mode 100644 index 0000000..84e5dfd --- /dev/null +++ b/src/app/views/pages/agenda/agenda.module.ts @@ -0,0 +1,110 @@ +import {NgModule} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {PartialsModule} from '../../partials/partials.module'; +import {CoreModule} from '../../../core/core.module'; +import {RouterModule} from '@angular/router'; +import { + MAT_DIALOG_DEFAULT_OPTIONS, + MatAutocompleteModule, + MatButtonModule, + MatCardModule, + MatCheckboxModule, + MatDatepickerModule, + MatDialogModule, + MatExpansionModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatMenuModule, + MatNativeDateModule, + MatPaginatorModule, + MatProgressBarModule, + MatProgressSpinnerModule, + MatRadioModule, + MatSelectModule, + MatSnackBarModule, + MatSortModule, + MatTableModule, + MatTabsModule, + MatTooltipModule +} from '@angular/material'; +import {FormsModule, ReactiveFormsModule} from '@angular/forms'; +import {NgxPermissionsModule} from 'ngx-permissions'; +import {HttpUtilsService, InterceptService, LayoutUtilsService, TypesUtilsService} from '../../../core/_base/crud'; +import {HTTP_INTERCEPTORS} from '@angular/common/http'; +import {ActionNotificationComponent, DeleteEntityDialogComponent} from '../../partials/content/crud'; +import {NgxMatSelectSearchModule} from 'ngx-mat-select-search'; +import {CalendarioComponent} from "./calendario/calendario.component"; +import {CalendarCommonModule, CalendarModule, DateAdapter} from "angular-calendar"; +import {adapterFactory} from "angular-calendar/date-adapters/date-fns"; + +@NgModule({ + declarations: [CalendarioComponent], + imports: [ + CommonModule, + PartialsModule, + CoreModule, + RouterModule.forChild([ + { + path: '', + component: CalendarioComponent + } + ]), + CalendarModule.forRoot({provide: DateAdapter, useFactory: adapterFactory}), + MatButtonModule, + MatTooltipModule, + MatFormFieldModule, + MatInputModule, + MatIconModule, + MatTableModule, + MatMenuModule, + MatCheckboxModule, + MatSortModule, + MatProgressSpinnerModule, + MatPaginatorModule, + FormsModule, + ReactiveFormsModule, + MatAutocompleteModule, + MatRadioModule, + MatNativeDateModule, + MatProgressBarModule, + MatDatepickerModule, + MatCardModule, + MatSnackBarModule, + MatExpansionModule, + MatTabsModule, + MatDialogModule, + NgxPermissionsModule, + MatSelectModule, + NgxMatSelectSearchModule, + CalendarCommonModule, + CalendarModule + ], + providers: [ + InterceptService, + { + provide: HTTP_INTERCEPTORS, + useClass: InterceptService, + multi: true + }, + { + provide: MAT_DIALOG_DEFAULT_OPTIONS, + useValue: { + hasBackdrop: true, + panelClass: 'kt-mat-dialog-container__wrapper', + height: 'auto', + width: '900px' + } + }, + HttpUtilsService, + TypesUtilsService, + LayoutUtilsService, + ], + entryComponents: [ + DeleteEntityDialogComponent, + ActionNotificationComponent, + ] +}) + +export class AgendaModule { +} diff --git a/src/app/views/pages/agenda/agenda.service.ts b/src/app/views/pages/agenda/agenda.service.ts new file mode 100644 index 0000000..4d6ed7e --- /dev/null +++ b/src/app/views/pages/agenda/agenda.service.ts @@ -0,0 +1,16 @@ +import {Injectable} from '@angular/core'; +import {HttpClient} from '@angular/common/http'; +import {environment} from '../../../../environments/environment'; +import { ResourceBase } from 'app/core/api/resource'; + +@Injectable({ + providedIn: 'root' +}) +export class AgendaService extends ResourceBase { + + baseUrl = environment.API; + + constructor(public http: HttpClient) { + super(http, 'atencionclientes/solicitud_servicios/agenda'); + } +} diff --git a/src/app/views/pages/agenda/calendario/calendario.component.html b/src/app/views/pages/agenda/calendario/calendario.component.html new file mode 100644 index 0000000..2fcb820 --- /dev/null +++ b/src/app/views/pages/agenda/calendario/calendario.component.html @@ -0,0 +1,57 @@ + + +
+ + + +
+
+ + + +
+
+ {{ (viewDate | calendarDate:(view + 'ViewTitle'):'es-MX') | uppercase }} +
+ +
+ + +
+
+ +
+ + + + + +
+
+
diff --git a/src/app/views/pages/agenda/calendario/calendario.component.scss b/src/app/views/pages/agenda/calendario/calendario.component.scss new file mode 100644 index 0000000..8856f9a --- /dev/null +++ b/src/app/views/pages/agenda/calendario/calendario.component.scss @@ -0,0 +1,22 @@ +.div-info-date { + display: flex; + flex-direction: row; + align-items: center; +} + +.div-info-span { + flex-grow: 1; + text-align: center; +} + +.div-info-span span { + font-size: 1.5em; +} + +.div-info-buttons { + flex-grow: 0; +} + +.event-class .cal-event-title { + color: white!important; +} diff --git a/src/app/views/pages/agenda/calendario/calendario.component.spec.ts b/src/app/views/pages/agenda/calendario/calendario.component.spec.ts new file mode 100644 index 0000000..68ba041 --- /dev/null +++ b/src/app/views/pages/agenda/calendario/calendario.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CalendarioComponent } from './calendario.component'; + +describe('CalendarioComponent', () => { + let component: CalendarioComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CalendarioComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CalendarioComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/views/pages/agenda/calendario/calendario.component.ts b/src/app/views/pages/agenda/calendario/calendario.component.ts new file mode 100644 index 0000000..ae32b75 --- /dev/null +++ b/src/app/views/pages/agenda/calendario/calendario.component.ts @@ -0,0 +1,72 @@ +import {ChangeDetectorRef, Component, OnInit} from '@angular/core'; +import {CalendarEvent, CalendarView} from 'angular-calendar'; +import {Subject} from "rxjs"; +import {ApiService} from "../../../../core/api/api.service"; + +@Component({ + selector: 'kt-calendario', + templateUrl: './calendario.component.html', + styleUrls: ['./calendario.component.scss'] +}) + +export class CalendarioComponent implements OnInit { + + view: CalendarView = CalendarView.Week; + CalendarView = CalendarView; + viewDate: Date = new Date(); + events: CalendarEvent[] = []; + refresh: Subject = new Subject(); + clicked = true; + titulo = "Agenda" + isLoading = true; + + constructor(private api: ApiService, private ref: ChangeDetectorRef) { + } + + ngOnInit() { + } + + beforeViewRender(event): void { + + let startDay = new Date(event.period.start) + let endDay = new Date(event.period.end) + + if(this.clicked){ + + let data = { + start_day: startDay.getFullYear() + '-' + (startDay.getMonth() + 1) + '-' + startDay.getDate(), + end_day: (this.view == CalendarView.Week)? endDay.getFullYear() + '-' + (endDay.getMonth() + 1) + '-' + endDay.getDate() : null + } + this.isLoading = true; + this.api.agenda.create(data).subscribe(res => { + this.events = [] + res.forEach(agenda => { + let evento = { + start: new Date(agenda.start_day), + end: new Date(agenda.end_day), + title: ""+ agenda.nombre_operador + "
" + agenda.hora_servicio + "
" + agenda.duracion_servicio + "
" + agenda.denominacion_cliente + "
" + agenda.nombre_estatus, + color: { + primary: agenda.color_estatus, + secondary: agenda.color_estatus + } + }; + this.events.push(evento) + }) + this.refresh.next() + this.isLoading = false + }, () => { + this.isLoading = false + }) + this.clicked = false; + } + } + + btnChangeDate(){ + this.clicked = true + } + + setView(view: CalendarView) { + this.clicked = true; + this.view = view; + } +} diff --git a/src/app/views/pages/auth/auth-notice/auth-notice.component.html b/src/app/views/pages/auth/auth-notice/auth-notice.component.html new file mode 100644 index 0000000..d6445cf --- /dev/null +++ b/src/app/views/pages/auth/auth-notice/auth-notice.component.html @@ -0,0 +1,3 @@ + diff --git a/src/app/views/pages/auth/auth-notice/auth-notice.component.ts b/src/app/views/pages/auth/auth-notice/auth-notice.component.ts new file mode 100644 index 0000000..f3c5419 --- /dev/null +++ b/src/app/views/pages/auth/auth-notice/auth-notice.component.ts @@ -0,0 +1,52 @@ +// Angular +import { ChangeDetectorRef, Component, OnDestroy, OnInit, Output } from '@angular/core'; +// RxJS +import { Subscription } from 'rxjs'; +// Auth +import { AuthNotice, AuthNoticeService } from '../../../../core/auth/'; + +@Component({ + selector: 'kt-auth-notice', + templateUrl: './auth-notice.component.html', +}) +export class AuthNoticeComponent implements OnInit, OnDestroy { + @Output() type: any; + @Output() message: any = ''; + + // Private properties + private subscriptions: Subscription[] = []; + + /** + * Component Constructure + * + * @param authNoticeService + * @param cdr + */ + constructor(public authNoticeService: AuthNoticeService, private cdr: ChangeDetectorRef) { + } + + /* + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + this.subscriptions.push(this.authNoticeService.onNoticeChanged$.subscribe( + (notice: AuthNotice) => { + notice = Object.assign({}, {message: '', type: ''}, notice); + this.message = notice.message; + this.type = notice.type; + this.cdr.markForCheck(); + } + )); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + this.subscriptions.forEach(sb => sb.unsubscribe()); + } +} diff --git a/src/app/views/pages/auth/auth.component.html b/src/app/views/pages/auth/auth.component.html new file mode 100644 index 0000000..b81ecb2 --- /dev/null +++ b/src/app/views/pages/auth/auth.component.html @@ -0,0 +1,9 @@ + diff --git a/src/app/views/pages/auth/auth.component.scss b/src/app/views/pages/auth/auth.component.scss new file mode 100644 index 0000000..30fb9b2 --- /dev/null +++ b/src/app/views/pages/auth/auth.component.scss @@ -0,0 +1,33 @@ +// import login css +@import "sass/pages/login/login-1"; + +kt-auth, .kt-login { + height: 100%; + + .mat-form-field { + width: 100%; + } + + // add extra right padding when displaying spinner in button + .kt-spinner { + padding-right: 3rem !important; + } +} + +.width-20{ + width: 25% !important; +} + +@media screen and (max-width: 1024px) { + .width-20{ + width: 100% !important; + } +} + +.login-drenax { + background-color: #19385E !important; + background-position: 100% 100% !important; + background-repeat: repeat !important; + width: 100% !important; + height: 100% !important; +} diff --git a/src/app/views/pages/auth/auth.component.ts b/src/app/views/pages/auth/auth.component.ts new file mode 100644 index 0000000..c4c4c96 --- /dev/null +++ b/src/app/views/pages/auth/auth.component.ts @@ -0,0 +1,75 @@ +// Angular +import { Component, ElementRef, OnInit, Renderer2, ViewEncapsulation } from '@angular/core'; +// Layout +import { LayoutConfigService, SplashScreenService, TranslationService } from '../../../core/_base/layout'; +// Auth +import {AuthNoticeService, AuthService} from '../../../core/auth'; +import {Router} from "@angular/router"; + +@Component({ + selector: 'kt-auth', + templateUrl: './auth.component.html', + styleUrls: ['./auth.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class AuthComponent implements OnInit { + // Public properties + today: number = Date.now(); + headerLogo: string; + + /** + * Component constructor + * + * @param el + * @param render + * @param layoutConfigService: LayoutConfigService + * @param authNoticeService: authNoticeService + * @param translationService: TranslationService + * @param auth + * @param router + * @param splashScreenService: SplashScreenService + */ + constructor( + private el: ElementRef, + private render: Renderer2, + private layoutConfigService: LayoutConfigService, + public authNoticeService: AuthNoticeService, + private translationService: TranslationService, + private auth: AuthService, + private router: Router, + private splashScreenService: SplashScreenService) { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit(): void { + const user = this.auth.getUser(); + + if(user){ + this.router.navigateByUrl('/dashboard'); + } + this.translationService.setLanguage(this.translationService.getSelectedLanguage()); + this.headerLogo = this.layoutConfigService.getLogo(); + this.splashScreenService.hide(); + } + + /** + * Load CSS for this specific page only, and destroy when navigate away + * @param styleUrl + */ + private loadCSS(styleUrl: string) { + return new Promise((resolve, reject) => { + const styleElement = document.createElement('link'); + styleElement.href = styleUrl; + styleElement.type = 'text/css'; + styleElement.rel = 'stylesheet'; + styleElement.onload = resolve; + this.render.appendChild(this.el.nativeElement, styleElement); + }); + } +} diff --git a/src/app/views/pages/auth/auth.module.ts b/src/app/views/pages/auth/auth.module.ts new file mode 100644 index 0000000..32f73e8 --- /dev/null +++ b/src/app/views/pages/auth/auth.module.ts @@ -0,0 +1,97 @@ +// Angular +import { ModuleWithProviders, NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { RouterModule, Routes } from '@angular/router'; +import { HTTP_INTERCEPTORS } from '@angular/common/http'; +// Material +import {MatButtonModule, MatCheckboxModule, MatFormFieldModule, MatIconModule, MatInputModule} from '@angular/material'; +// Translate +import { TranslateModule } from '@ngx-translate/core'; +// NGRX +import { StoreModule } from '@ngrx/store'; +import { EffectsModule } from '@ngrx/effects'; +// CRUD +import { InterceptService } from '../../../core/_base/crud/'; +// Module components +import { AuthComponent } from './auth.component'; +import { LoginComponent } from './login/login.component'; +import { RegisterComponent } from './register/register.component'; +import { ForgotPasswordComponent } from './forgot-password/forgot-password.component'; +import { AuthNoticeComponent } from './auth-notice/auth-notice.component'; +// Auth +import { AuthEffects, AuthGuard, authReducer } from '../../../core/auth'; +import {AuthService} from '../../../core/auth/_services/auth.service'; + +const routes: Routes = [ + { + path: '', + component: AuthComponent, + children: [ + { + path: '', + redirectTo: 'login', + pathMatch: 'full' + }, + { + path: 'login', + component: LoginComponent, + data: {returnUrl: window.location.pathname} + }, + { + path: 'register', + component: RegisterComponent + }, + { + path: 'forgot-password', + component: ForgotPasswordComponent, + } + ] + } +]; + + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + MatButtonModule, + RouterModule.forChild(routes), + MatInputModule, + MatFormFieldModule, + MatCheckboxModule, + TranslateModule.forChild(), + StoreModule.forFeature('auth', authReducer), + EffectsModule.forFeature([AuthEffects]), + MatIconModule + ], + providers: [ + InterceptService, + { + provide: HTTP_INTERCEPTORS, + useClass: InterceptService, + multi: true + }, + ], + exports: [AuthComponent], + declarations: [ + AuthComponent, + LoginComponent, + RegisterComponent, + ForgotPasswordComponent, + AuthNoticeComponent + ] +}) + +export class AuthModule { + static forRoot(): ModuleWithProviders { + return { + ngModule: AuthModule, + providers: [ + AuthService, + AuthGuard + ] + }; + } +} diff --git a/src/app/views/pages/auth/forgot-password/forgot-password.component.html b/src/app/views/pages/auth/forgot-password/forgot-password.component.html new file mode 100644 index 0000000..ed04c32 --- /dev/null +++ b/src/app/views/pages/auth/forgot-password/forgot-password.component.html @@ -0,0 +1,40 @@ + + + diff --git a/src/app/views/pages/auth/forgot-password/forgot-password.component.ts b/src/app/views/pages/auth/forgot-password/forgot-password.component.ts new file mode 100644 index 0000000..7451b34 --- /dev/null +++ b/src/app/views/pages/auth/forgot-password/forgot-password.component.ts @@ -0,0 +1,125 @@ +// Angular +import { ChangeDetectorRef, Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { Router } from '@angular/router'; +// RxJS +import { finalize, takeUntil, tap } from 'rxjs/operators'; +import { Subject } from 'rxjs'; +// Translate +import { TranslateService } from '@ngx-translate/core'; +// Auth +import { AuthNoticeService, AuthService } from '../../../../core/auth'; + +@Component({ + selector: 'kt-forgot-password', + templateUrl: './forgot-password.component.html', + encapsulation: ViewEncapsulation.None +}) +export class ForgotPasswordComponent implements OnInit, OnDestroy { + // Public params + forgotPasswordForm: FormGroup; + loading = false; + errors: any = []; + + private unsubscribe: Subject; // Read more: => https://brianflove.com/2016/12/11/anguar-2-unsubscribe-observables/ + + /** + * Component constructor + * + * @param authService + * @param authNoticeService + * @param translate + * @param router + * @param fb + * @param cdr + */ + constructor( + private authService: AuthService, + public authNoticeService: AuthNoticeService, + private translate: TranslateService, + private router: Router, + private fb: FormBuilder, + private cdr: ChangeDetectorRef + ) { + this.unsubscribe = new Subject(); + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + this.initRegistrationForm(); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + this.unsubscribe.next(); + this.unsubscribe.complete(); + this.loading = false; + } + + /** + * Form initalization + * Default params, validators + */ + initRegistrationForm() { + this.forgotPasswordForm = this.fb.group({ + email: ['', Validators.compose([ + Validators.required, + Validators.email, + Validators.minLength(3), + Validators.maxLength(320) // https://stackoverflow.com/questions/386294/what-is-the-maximum-length-of-a-valid-email-address + ]) + ] + }); + } + + /** + * Form Submit + */ + submit() { + const controls = this.forgotPasswordForm.controls; + /** check form */ + if (this.forgotPasswordForm.invalid) { + Object.keys(controls).forEach(controlName => + controls[controlName].markAsTouched() + ); + return; + } + + this.loading = true; + + const email = controls.email.value; + this.authService.requestPassword(email).pipe( + tap(() => { + this.router.navigateByUrl('/auth/login'); + }), + takeUntil(this.unsubscribe), + finalize(() => { + this.loading = false; + this.cdr.markForCheck(); + }) + ).subscribe(); + } + + /** + * Checking control validation + * + * @param controlName: string => Equals to formControlName + * @param validationType: string => Equals to valitors name + */ + isControlHasError(controlName: string, validationType: string): boolean { + const control = this.forgotPasswordForm.controls[controlName]; + if (!control) { + return false; + } + + return control.hasError(validationType) && (control.dirty || control.touched); + } +} diff --git a/src/app/views/pages/auth/login/login.component.html b/src/app/views/pages/auth/login/login.component.html new file mode 100644 index 0000000..c3d7439 --- /dev/null +++ b/src/app/views/pages/auth/login/login.component.html @@ -0,0 +1,52 @@ + diff --git a/src/app/views/pages/auth/login/login.component.scss b/src/app/views/pages/auth/login/login.component.scss new file mode 100644 index 0000000..5bd9396 --- /dev/null +++ b/src/app/views/pages/auth/login/login.component.scss @@ -0,0 +1,11 @@ +@media screen and (max-width: 768px) { + .card-login { + height: auto !important; + } +} + +.btn-entrar { + border-color: #E63C2D; + background-color: #E63C2D; + width: 100%; +} diff --git a/src/app/views/pages/auth/login/login.component.ts b/src/app/views/pages/auth/login/login.component.ts new file mode 100644 index 0000000..d09bef5 --- /dev/null +++ b/src/app/views/pages/auth/login/login.component.ts @@ -0,0 +1,164 @@ +// Angular +import { ChangeDetectorRef, Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +// RxJS +import { Observable, Subject } from 'rxjs'; +import { finalize, takeUntil, tap } from 'rxjs/operators'; +// Translate +import { TranslateService } from '@ngx-translate/core'; +// Store +import { Store } from '@ngrx/store'; +import { AppState } from '../../../../core/reducers'; +// Auth +import {AuthService} from '../../../../core/auth/_services/auth.service'; + +/** + * ! Just example => Should be removed in development + */ +const DEMO_PARAMS = { + EMAIL: '', + PASSWORD: '' +}; + +@Component({ + selector: 'kt-login', + templateUrl: './login.component.html', + styleUrls: ['./login.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class LoginComponent implements OnInit, OnDestroy { + // Public params + loginForm: FormGroup; + loading = false; + errors: any = []; + showPassword = false; + + private unsubscribe: Subject; + + private returnUrl: any; + + // Read more: => https://brianflove.com/2016/12/11/anguar-2-unsubscribe-observables/ + + /** + * Component constructor + * + * @param router: Router + * @param auth: AuthService + * @param translate: TranslateService + * @param store: Store + * @param fb: FormBuilder + * @param cdr + * @param route + */ + constructor( + private router: Router, + private auth: AuthService, + private translate: TranslateService, + private store: Store, + private fb: FormBuilder, + private cdr: ChangeDetectorRef, + private route: ActivatedRoute + ) { + this.unsubscribe = new Subject(); + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit(): void { + this.initLoginForm(); + + // redirect back to the returnUrl before login + this.route.queryParams.subscribe(params => { + this.returnUrl = params.returnUrl || '/'; + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + this.unsubscribe.next(); + this.unsubscribe.complete(); + this.loading = false; + } + + /** + * Form initalization + * Default params, validators + */ + initLoginForm() { + this.loginForm = this.fb.group({ + email: [DEMO_PARAMS.EMAIL, Validators.compose([ + Validators.required, + Validators.email, + Validators.minLength(3), + Validators.maxLength(320) // https://stackoverflow.com/questions/386294/what-is-the-maximum-length-of-a-valid-email-address + ]) + ], + password: [DEMO_PARAMS.PASSWORD, Validators.compose([ + Validators.required, + Validators.minLength(3), + Validators.maxLength(100) + ]) + ] + }); + } + + /** + * Form Submit + */ + submit() { + const controls = this.loginForm.controls; + /** check form */ + if (this.loginForm.invalid) { + Object.keys(controls).forEach(controlName => + controls[controlName].markAsTouched() + ); + return; + } + + this.loading = true; + + const authData = { + email: controls.email.value, + password: controls.password.value + }; + this.auth + .login(authData.email, authData.password) + .pipe( + takeUntil(this.unsubscribe), + finalize(() => { + this.loading = false; + this.cdr.markForCheck(); + }) + ) + .subscribe(response=>{ + this.router.navigateByUrl('/inicio'); + }); + } + + /** + * Checking control validation + * + * @param controlName: string => Equals to formControlName + * @param validationType: string => Equals to valitors name + */ + isControlHasError(controlName: string, validationType: string): boolean { + const control = this.loginForm.controls[controlName]; + if (!control) { + return false; + } + + return control.hasError(validationType) && (control.dirty || control.touched); + } + + toggleShowPassword(showPassword) { + this.showPassword = !showPassword; + } +} diff --git a/src/app/views/pages/auth/register/confirm-password.validator.ts b/src/app/views/pages/auth/register/confirm-password.validator.ts new file mode 100644 index 0000000..eb16dc9 --- /dev/null +++ b/src/app/views/pages/auth/register/confirm-password.validator.ts @@ -0,0 +1,19 @@ +import { AbstractControl } from '@angular/forms'; + +export class ConfirmPasswordValidator { + /** + * Check matching password with confirm password + * @param control AbstractControl + */ + static MatchPassword(control: AbstractControl) { + const password = control.get('password').value; + + const confirmPassword = control.get('confirmPassword').value; + + if (password !== confirmPassword) { + control.get('confirmPassword').setErrors({ConfirmPassword: true}); + } else { + return null; + } + } +} diff --git a/src/app/views/pages/auth/register/register.component.html b/src/app/views/pages/auth/register/register.component.html new file mode 100644 index 0000000..eac3d63 --- /dev/null +++ b/src/app/views/pages/auth/register/register.component.html @@ -0,0 +1,110 @@ + + diff --git a/src/app/views/pages/auth/register/register.component.ts b/src/app/views/pages/auth/register/register.component.ts new file mode 100644 index 0000000..d117517 --- /dev/null +++ b/src/app/views/pages/auth/register/register.component.ts @@ -0,0 +1,180 @@ +// Angular +import { ChangeDetectorRef, Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Router } from '@angular/router'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +// RxJS +import { finalize, takeUntil, tap } from 'rxjs/operators'; +// Translate +import { TranslateService } from '@ngx-translate/core'; +// NGRX +import { Store } from '@ngrx/store'; +import { AppState } from '../../../../core/reducers'; +// Auth +import { AuthNoticeService, AuthService, Register, User } from '../../../../core/auth/'; +import { Subject } from 'rxjs'; +import { ConfirmPasswordValidator } from './confirm-password.validator'; + +@Component({ + selector: 'kt-register', + templateUrl: './register.component.html', + encapsulation: ViewEncapsulation.None +}) +export class RegisterComponent implements OnInit, OnDestroy { + registerForm: FormGroup; + loading = false; + errors: any = []; + + private unsubscribe: Subject; // Read more: => https://brianflove.com/2016/12/11/anguar-2-unsubscribe-observables/ + + /** + * Component constructor + * + * @param authNoticeService: AuthNoticeService + * @param translate: TranslateService + * @param router: Router + * @param auth: AuthService + * @param store: Store + * @param fb: FormBuilder + * @param cdr + */ + constructor( + private authNoticeService: AuthNoticeService, + private translate: TranslateService, + private router: Router, + private auth: AuthService, + private store: Store, + private fb: FormBuilder, + private cdr: ChangeDetectorRef + ) { + this.unsubscribe = new Subject(); + } + + /* + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + this.initRegisterForm(); + } + + /* + * On destroy + */ + ngOnDestroy(): void { + this.unsubscribe.next(); + this.unsubscribe.complete(); + this.loading = false; + } + + /** + * Form initalization + * Default params, validators + */ + initRegisterForm() { + this.registerForm = this.fb.group({ + fullname: ['', Validators.compose([ + Validators.required, + Validators.minLength(3), + Validators.maxLength(100) + ]) + ], + email: ['', Validators.compose([ + Validators.required, + Validators.email, + Validators.minLength(3), + // https://stackoverflow.com/questions/386294/what-is-the-maximum-length-of-a-valid-email-address + Validators.maxLength(320) + ]), + ], + username: ['', Validators.compose([ + Validators.required, + Validators.minLength(3), + Validators.maxLength(100) + ]), + ], + password: ['', Validators.compose([ + Validators.required, + Validators.minLength(3), + Validators.maxLength(100) + ]) + ], + confirmPassword: ['', Validators.compose([ + Validators.required, + Validators.minLength(3), + Validators.maxLength(100) + ]) + ], + agree: [false, Validators.compose([Validators.required])] + }, { + validator: ConfirmPasswordValidator.MatchPassword + }); + } + + /** + * Form Submit + */ + submit() { + const controls = this.registerForm.controls; + + // check form + if (this.registerForm.invalid) { + Object.keys(controls).forEach(controlName => + controls[controlName].markAsTouched() + ); + return; + } + + this.loading = true; + + if (!controls.agree.value) { + // you must agree the terms and condition + // checkbox cannot work inside mat-form-field https://github.com/angular/material2/issues/7891 + this.authNoticeService.setNotice('You must agree the terms and condition', 'danger'); + return; + } + + const _user: User = new User(); + _user.clear(); + _user.email = controls.email.value; + _user.username = controls.username.value; + _user.fullname = controls.fullname.value; + _user.password = controls.password.value; + _user.roles = []; + this.auth.register(_user).pipe( + tap(user => { + if (user) { + this.store.dispatch(new Register({authToken: user.accessToken})); + // pass notice message to the login page + this.authNoticeService.setNotice(this.translate.instant('AUTH.REGISTER.SUCCESS'), 'success'); + this.router.navigateByUrl('/auth/login'); + } else { + this.authNoticeService.setNotice(this.translate.instant('AUTH.VALIDATION.INVALID_LOGIN'), 'danger'); + } + }), + takeUntil(this.unsubscribe), + finalize(() => { + this.loading = false; + this.cdr.markForCheck(); + }) + ).subscribe(); + } + + /** + * Checking control validation + * + * @param controlName: string => Equals to formControlName + * @param validationType: string => Equals to valitors name + */ + isControlHasError(controlName: string, validationType: string): boolean { + const control = this.registerForm.controls[controlName]; + if (!control) { + return false; + } + + const result = control.hasError(validationType) && (control.dirty || control.touched); + return result; + } +} diff --git a/src/app/views/pages/catalogos/catalogos.module.ts b/src/app/views/pages/catalogos/catalogos.module.ts new file mode 100644 index 0000000..3911d64 --- /dev/null +++ b/src/app/views/pages/catalogos/catalogos.module.ts @@ -0,0 +1,424 @@ +import {NgModule} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {PartialsModule} from '../../partials/partials.module'; +import {CoreModule} from '../../../core/core.module'; +import {RouterModule} from '@angular/router'; +import { + MAT_DIALOG_DEFAULT_OPTIONS, + MatAutocompleteModule, + MatButtonModule, + MatCardModule, + MatCheckboxModule, + MatDatepickerModule, + MatDialogModule, + MatExpansionModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatMenuModule, + MatNativeDateModule, + MatPaginatorModule, + MatProgressBarModule, + MatProgressSpinnerModule, + MatRadioModule, + MatSelectModule, + MatSnackBarModule, + MatSortModule, + MatTableModule, + MatTabsModule, + MatTooltipModule +} from '@angular/material'; +import {FormsModule, ReactiveFormsModule} from '@angular/forms'; +import {NgxPermissionsGuard, NgxPermissionsModule} from 'ngx-permissions'; +import {HttpUtilsService, InterceptService, LayoutUtilsService, TypesUtilsService} from '../../../core/_base/crud'; +import {HTTP_INTERCEPTORS} from '@angular/common/http'; +import {ActionNotificationComponent, DeleteEntityDialogComponent} from '../../partials/content/crud'; +import { UsuariosListComponent } from './usuarios/usuarios-list/usuarios-list.component'; +import { UsuariosEditComponent } from './usuarios/usuarios-edit/usuarios-edit.component'; +import { RolesListComponent } from './roles/roles-list/roles-list.component'; +import { RolesEditComponent } from './roles/roles-edit/roles-edit.component'; +import { ClientesListComponent } from './clientes/clientes-list/clientes-list.component'; +import { ClientesEditComponent } from './clientes/clientes-edit/clientes-edit.component'; +import { EstadosServicioListComponent } from './estados-servicio/estados-servicio-list/estados-servicio-list.component'; +import { EstadosServicioEditComponent } from './estados-servicio/estados-servicio-edit/estados-servicio-edit.component'; +import { FormasPagoListComponent } from './formas-pago/formas-pago-list/formas-pago-list.component'; +import { FormasPagoEditComponent } from './formas-pago/formas-pago-edit/formas-pago-edit.component'; +import { TiposServicioListComponent } from './tipos-servicio/tipos-servicio-list/tipos-servicio-list.component'; +import { TiposServicioEditComponent } from './tipos-servicio/tipos-servicio-edit/tipos-servicio-edit.component'; +import { ServiciosListComponent } from './servicios/servicios-list/servicios-list.component'; +import { ServiciosEditComponent } from './servicios/servicios-edit/servicios-edit.component'; +import { TiposVehiculoListComponent } from './tipos-vehiculo/tipos-vehiculo-list/tipos-vehiculo-list.component'; +import { TiposVehiculoEditComponent } from './tipos-vehiculo/tipos-vehiculo-edit/tipos-vehiculo-edit.component'; +import { VehiculosListComponent } from './vehiculos/vehiculos-list/vehiculos-list.component'; +import { VehiculosEditComponent } from './vehiculos/vehiculos-edit/vehiculos-edit.component'; +import { SucursalesListComponent } from './sucursales/sucursales-list/sucursales-list.component'; +import { SucursalesEditComponent } from './sucursales/sucursales-edit/sucursales-edit.component'; +import { PermisosComponent } from './roles/permisos/permisos.component'; +import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; +import { ClientesDomiciliosEditComponent } from './clientes/clientes-domicilios-edit/clientes-domicilios-edit.component'; +import { ClientesDomiciliosListComponent } from './clientes/clientes-domicilios-list/clientes-domicilios-list.component'; + +@NgModule({ + declarations: [PermisosComponent, UsuariosListComponent, UsuariosEditComponent, RolesEditComponent, RolesListComponent, ClientesListComponent, ClientesEditComponent, EstadosServicioListComponent, EstadosServicioEditComponent, FormasPagoListComponent, FormasPagoEditComponent, TiposServicioListComponent, TiposServicioEditComponent, ServiciosListComponent, ServiciosEditComponent, TiposVehiculoListComponent, TiposVehiculoEditComponent, VehiculosListComponent, VehiculosEditComponent, SucursalesListComponent, SucursalesEditComponent, ClientesDomiciliosListComponent, ClientesDomiciliosEditComponent], + imports: [ + CommonModule, + PartialsModule, + CoreModule, + RouterModule.forChild([ + { + path: 'usuarios', + component: UsuariosListComponent, + canActivate: [NgxPermissionsGuard], + data: { + permissions: { + only: ['administrador.usuarios.index'], + redirectTo: '/' + } + } + }, + { + path: 'usuarios/add', + component: UsuariosEditComponent, + canActivate: [NgxPermissionsGuard], + data: { + permissions: { + only: ['administrador.usuarios.store'], + redirectTo: '/' + } + } + }, + { + path: 'usuarios/edit/:id', + component: UsuariosEditComponent, + canActivate: [NgxPermissionsGuard], + data: { + permissions: { + only: ['administrador.usuarios.show'], + redirectTo: '/' + } + } + }, + { + path: 'roles', + component: RolesListComponent, + canActivate: [NgxPermissionsGuard], + data: { + permissions: { + only: ['administrador.roles.index'], + redirectTo: '/' + } + } + }, + { + path: 'roles/add', + component: RolesEditComponent, + canActivate: [NgxPermissionsGuard], + data: { + permissions: { + only: ['administrador.roles.store'], + redirectTo: '/' + } + } + }, + { + path: 'roles/edit/:id', + component: RolesEditComponent, + canActivate: [NgxPermissionsGuard], + data: { + permissions: { + only: ['administrador.roles.show'], + redirectTo: '/' + } + } + }, + { + path: 'clientes', + component: ClientesListComponent, + canActivate: [NgxPermissionsGuard], + data: { + permissions: { + only: ['administrador.clientes.index'], + redirectTo: '/' + } + } + }, + { + path: 'clientes/add', + component: ClientesEditComponent, + canActivate: [NgxPermissionsGuard], + data: { + permissions: { + only: ['administrador.clientes.store'], + redirectTo: '/' + } + } + }, + { + path: 'clientes/edit/:id', + component: ClientesEditComponent, + canActivate: [NgxPermissionsGuard], + data: { + permissions: { + only: ['administrador.clientes.show'], + redirectTo: '/' + } + } + }, + { + path: 'clientes-domicilios/add/:clienteDomicilioID', + component: ClientesDomiciliosEditComponent, + canActivate: [NgxPermissionsGuard], + data: { + permissions: { + only: ['administrador.clientes.domicilios.store'], + redirectTo: '/' + } + } + }, + { + path: 'clientes-domicilios/edit/:id/:clienteDomicilioID', + component: ClientesDomiciliosEditComponent, + canActivate: [NgxPermissionsGuard], + data: { + permissions: { + only: ['administrador.clientes.domicilios.show'], + redirectTo: '/' + } + } + }, + { + path: 'clientes-domicilios/:id', + component: ClientesDomiciliosListComponent, + canActivate: [NgxPermissionsGuard], + data: { + permissions: { + only: ['administrador.clientes.domicilios.index'], + redirectTo: '/' + } + } + }, + { + path: 'estados-servicio', + component: EstadosServicioListComponent + }, + { + path: 'estados-servicio/add', + component: EstadosServicioEditComponent + }, + { + path: 'estados-servicio/edit/:id', + component: EstadosServicioEditComponent + }, + { + path: 'formas-pago', + component: FormasPagoListComponent, + canActivate: [NgxPermissionsGuard], + data: { + permissions: { + only: ['administrador.formas_pagos.index'], + redirectTo: '/' + } + } + }, + { + path: 'formas-pago/add', + component: FormasPagoEditComponent, + canActivate: [NgxPermissionsGuard], + data: { + permissions: { + only: ['administrador.formas_pagos.store'], + redirectTo: '/' + } + } + }, + { + path: 'formas-pago/edit/:id', + component: FormasPagoEditComponent, + canActivate: [NgxPermissionsGuard], + data: { + permissions: { + only: ['administrador.formas_pagos.show'], + redirectTo: '/' + } + } + }, + { + path: 'servicios', + component: ServiciosListComponent, + canActivate: [NgxPermissionsGuard], + data: { + permissions: { + only: ['administrador.servicios.index'], + redirectTo: '/' + } + } + }, + { + path: 'servicios/add', + component: ServiciosEditComponent, + canActivate: [NgxPermissionsGuard], + data: { + permissions: { + only: ['administrador.servicios.store'], + redirectTo: '/' + } + } + }, + { + path: 'servicios/edit/:id', + component: ServiciosEditComponent, + canActivate: [NgxPermissionsGuard], + data: { + permissions: { + only: ['administrador.servicios.show'], + redirectTo: '/' + } + } + }, + { + path: 'sucursales', + component: SucursalesListComponent + }, + { + path: 'sucursales/add', + component: SucursalesEditComponent + }, + { + path: 'sucursales/edit/:id', + component: SucursalesEditComponent + }, + { + path: 'tipos-servicio', + component: TiposServicioListComponent, + canActivate: [NgxPermissionsGuard], + data: { + permissions: { + only: ['administrador.tipos_servicios.index'], + redirectTo: '/' + } + } + }, + { + path: 'tipos-servicio/add', + component: TiposServicioEditComponent, + canActivate: [NgxPermissionsGuard], + data: { + permissions: { + only: ['administrador.tipos_servicios.store'], + redirectTo: '/' + } + } + }, + { + path: 'tipos-servicio/edit/:id', + component: TiposServicioEditComponent, + canActivate: [NgxPermissionsGuard], + data: { + permissions: { + only: ['administrador.tipos_servicios.show'], + redirectTo: '/' + } + } + }, + { + path: 'tipos-vehiculo', + component: TiposVehiculoListComponent, + canActivate: [NgxPermissionsGuard], + data: { + permissions: { + only: ['administrador.tipos_vehiculos.index'], + redirectTo: '/' + } + } + }, + { + path: 'tipos-vehiculo/add', + component: TiposVehiculoEditComponent, + canActivate: [NgxPermissionsGuard], + data: { + permissions: { + only: ['administrador.tipos_vehiculos.store'], + redirectTo: '/' + } + } + }, + { + path: 'tipos-vehiculo/edit/:id', + component: TiposVehiculoEditComponent, + canActivate: [NgxPermissionsGuard], + data: { + permissions: { + only: ['administrador.tipos_vehiculos.show'], + redirectTo: '/' + } + } + }, + { + path: 'vehiculos', + component: VehiculosListComponent + }, + { + path: 'vehiculos/add', + component: VehiculosEditComponent + }, + { + path: 'vehiculos/edit/:id', + component: VehiculosEditComponent + }, + ]), + MatButtonModule, + MatTooltipModule, + MatFormFieldModule, + MatInputModule, + MatSelectModule, + MatIconModule, + MatTableModule, + MatMenuModule, + MatCheckboxModule, + MatSortModule, + MatProgressSpinnerModule, + MatPaginatorModule, + FormsModule, + ReactiveFormsModule, + MatAutocompleteModule, + MatRadioModule, + MatNativeDateModule, + MatProgressBarModule, + MatDatepickerModule, + MatCardModule, + MatSnackBarModule, + MatExpansionModule, + MatTabsModule, + MatDialogModule, + NgxPermissionsModule.forChild(), + MatSelectModule, + NgxMatSelectSearchModule + ], + providers: [ + InterceptService, + { + provide: HTTP_INTERCEPTORS, + useClass: InterceptService, + multi: true + }, + { + provide: MAT_DIALOG_DEFAULT_OPTIONS, + useValue: { + hasBackdrop: true, + panelClass: 'kt-mat-dialog-container__wrapper', + height: 'auto', + width: '900px' + } + }, + HttpUtilsService, + TypesUtilsService, + LayoutUtilsService, + ], + entryComponents: [ + DeleteEntityDialogComponent, + ActionNotificationComponent, + PermisosComponent + ] +}) +export class CatalogosModule { +} diff --git a/src/app/views/pages/catalogos/clientes/clientes-domicilios-edit/clientes-domicilios-edit.component.html b/src/app/views/pages/catalogos/clientes/clientes-domicilios-edit/clientes-domicilios-edit.component.html new file mode 100644 index 0000000..2f0d6ac --- /dev/null +++ b/src/app/views/pages/catalogos/clientes/clientes-domicilios-edit/clientes-domicilios-edit.component.html @@ -0,0 +1,309 @@ + + +
+ + + +
+
+ + + + + + Información básica + + + + +
+
+ +
+ Espera un momento.... +
+
+
+
+
+
+ + + Por favor introduce el + nombre de la sucursal + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+ +
+ + + Por favor introduce el + número de sucursal + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+ +
+ + + Por favor introduce el + correo eléctronico + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + + Correo inválido, ej. correo@mail.com + + +
+ +
+ + + Por favor introduce el + nombre del responsable de sucursal + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+ +
+ + + Por favor introduce el + el teléfono del responsable + + + Datos correctos + + + El campo es requerido + + + Debe contener mínimo 10 caracteres + + + Debe contener máximo 10 caracteres + + +
+ +
+ + + Por favor introduce el + teléfono + + + Datos correctos + + + El campo es requerido + + + Debe contener mínimo 10 caracteres + + + Debe contener máximo 10 caracteres + + +
+
+ +
+
+ + + Por favor introduce la + calle + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+
+ + + Por favor introduce las + entre calles + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+ +
+ + + Por favor introduce el + número exterior + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+ +
+ + + Por favor introduce el + número interior + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+
+ +
+
+ + + Por favor introduce la + colonia + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+
+ + + Por favor introduce las + código postal + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+ +
+ + + Por favor introduce la + ciudad + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+
+ +
+
+ + {{fileName || "No se ha subido ningún PDF"}} + + +
+
+
+
+
+ +
+
+
+
+
diff --git a/src/app/views/pages/catalogos/clientes/clientes-domicilios-edit/clientes-domicilios-edit.component.scss b/src/app/views/pages/catalogos/clientes/clientes-domicilios-edit/clientes-domicilios-edit.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/pages/catalogos/clientes/clientes-domicilios-edit/clientes-domicilios-edit.component.ts b/src/app/views/pages/catalogos/clientes/clientes-domicilios-edit/clientes-domicilios-edit.component.ts new file mode 100644 index 0000000..afcb184 --- /dev/null +++ b/src/app/views/pages/catalogos/clientes/clientes-domicilios-edit/clientes-domicilios-edit.component.ts @@ -0,0 +1,170 @@ +import {ChangeDetectorRef, Component, OnInit} from '@angular/core'; +import {FormBuilder, FormGroup, Validators} from '@angular/forms'; +import {Subscription} from 'rxjs'; +import {ActivatedRoute, Router} from '@angular/router'; +import {LayoutUtilsService, MessageType} from '../../../../../core/_base/crud'; +import {ApiService} from '../../../../../core/api/api.service'; +import {ClientesDomicilios} from '../clientes-domicilios.model'; +import {environment} from '../../../../../../environments/environment'; + +@Component({ + selector: 'kt-clientes-domicilios-edit', + templateUrl: './clientes-domicilios-edit.component.html', + styleUrls: ['./clientes-domicilios-edit.component.scss'] +}) + +export class ClientesDomiciliosEditComponent implements OnInit { + +domiciliosForm: FormGroup; +selectedTab = 0; +subscriptions: Subscription[] = []; +isNewDomicilio = false; +isLoading = true; +loading = false; +domicilioID = 0; +clienteID = ''; +informacionID = ''; +base64textStringSketch; +fileName = ''; + +constructor(private fb: FormBuilder, + private router: Router, + private layoutUtilsService: LayoutUtilsService, + private activatedRoute: ActivatedRoute, + private ref: ChangeDetectorRef, + private api: ApiService) { +} + + ngOnInit() { + this.crearFormulario(); + this.clienteID = this.activatedRoute.snapshot.paramMap.get('clienteDomicilioID'); + } + + getDomicilios() { + let routeSubscription = this.activatedRoute.params.subscribe(params => { + this.domicilioID = params.id; + if (this.domicilioID && this.domicilioID > 0) { + this.isNewDomicilio = false; + this.api.clientesDomicilios.show('/domicilios', this.domicilioID, this.clienteID).subscribe(res => { + this.isLoading = false; + this.fileName = res.nombre_croquis; + this.domiciliosForm.reset(res); + this.ref.detectChanges(); + }); + } else { + this.isNewDomicilio = true; + this.isLoading = false; + this.ref.detectChanges(); + } + }); + this.subscriptions.push(routeSubscription); + } + + crearFormulario() { + this.domiciliosForm = this.fb.group({ + nombre_sucursal: [null, [Validators.required, Validators.maxLength(128)]], + numero_sucursal: [null, [Validators.required, Validators.maxLength(128)]], + email: [null, [Validators.maxLength(128), Validators.email]], + calle: [null, [Validators.required, Validators.maxLength(128)]], + entre_calles: [null, [Validators.maxLength(128)]], + num_ext: [null, [Validators.required, Validators.maxLength(128)]], + num_int: [null, [Validators.maxLength(128)]], + colonia: [null, [Validators.required, Validators.maxLength(128)]], + ciudad: [null, [Validators.required, Validators.maxLength(128)]], + cp: [null, [Validators.required, Validators.maxLength(128)]], + telefono: [null, [Validators.required, Validators.maxLength(128)]], + nombre_responsable_sucursal: [null, [Validators.required, Validators.maxLength(128)]], + celular_responsable: [null, [Validators.required, Validators.maxLength(128)]], + nombre_croquis: [] + }); + } + + onSubmit() { + let controls = this.domiciliosForm.controls; + if (this.domiciliosForm.invalid) { + Object.keys(controls).forEach(controlName => { + controls[controlName].markAsTouched(); + }) + return; + } + + let domicilio : ClientesDomicilios = this.domiciliosForm.value as ClientesDomicilios; + domicilio.nombre_croquis = this.base64textStringSketch; + + if (this.isNewDomicilio) { + this.addDomicilio(domicilio); + } else + this.updateDomicilio(this.domicilioID, domicilio); + } + + addDomicilio(domicilio) { + this.api.clientesDomicilios.create('/domicilios', domicilio, this.clienteID).subscribe(() => { + this.loading = false; + this.layoutUtilsService.showActionNotification('Domicilio actualizado con éxito.', MessageType.Create); + this.router.navigate(['../../../clientes-domicilios/', this.clienteID], {relativeTo: this.activatedRoute}) + }, () => { + this.loading = false; + }); + } + + updateDomicilio(id, domicilio) { + this.api.clientesDomicilios.update('/domicilios',id, domicilio, this.clienteID).subscribe(() => { + this.loading = false; + this.layoutUtilsService.showActionNotification('Domicilio actualizado con éxito.', MessageType.Update); + this.router.navigate(['../../../../clientes-domicilios/', this.clienteID], {relativeTo: this.activatedRoute}) + }, () => { + this.loading = false; + }); + } + +openPDF(domicilioId) { + window.open(environment.API + `administrador/clientes/domicilios/${domicilioId}?token=`+this.api.getAccessToken(), '_blank'); +} + +handleUpload(event) { + const file = event.target.files[0]; + this.fileName = file.name; + + if(file.size > 5000000){ + this.api.snackbar('PDF demasiado grande') + return; + } + + if(file){ + const reader = new FileReader(); + reader.onload = this.readerLoadedSketch.bind(this); + reader.readAsDataURL(file); + } +} + +readerLoadedSketch(readerEvt) { + this.base64textStringSketch = readerEvt.target.result; +} + +reset(){ + this.fileName = null; + this.base64textStringSketch = null; +} + + isControlValid(controlName: string): boolean { + let control = this.domiciliosForm.controls[controlName]; + if (!control) { + return false; + } else if (control.valid) { + return false; + } + return true; + } + + isControlHasError(controlName: string, validationType: string): boolean { + let control = this.domiciliosForm.controls[controlName]; + if (!control) { + return false; + } + return control.hasError(validationType) && (control.dirty || control.touched); + } + + ngAfterViewInit(): void { + this.getDomicilios(); + } +} diff --git a/src/app/views/pages/catalogos/clientes/clientes-domicilios-list/clientes-domicilios-list.component.html b/src/app/views/pages/catalogos/clientes/clientes-domicilios-list/clientes-domicilios-list.component.html new file mode 100644 index 0000000..4c45c9a --- /dev/null +++ b/src/app/views/pages/catalogos/clientes/clientes-domicilios-list/clientes-domicilios-list.component.html @@ -0,0 +1,98 @@ + + +
+ + +
+
+ + + +
+
+
+
+ + + + Buscar en todos los campos + + +
+
+
+
+ +
+ + + + Sucursal + {{domicilios.nombre_sucursal}} + + + + Domicilio + {{domicilios.calle + ' ' + domicilios.num_ext + ' ' + domicilios.colonia + ' ' + domicilios.cp}} + + + + Responsable + {{domicilios.nombre_responsable_sucursal}} + + + + Teléfono + {{domicilios.telefono}} + + + + Correo electrónico + {{(domicilios.email) ? domicilios.email : 'Email no registrado'}} + + + + Fecha + {{(domicilios.created_at) ? domicilios.created_at : 'Fecha no registrada'}} + + + + Croquis + {{(domicilios.nombre_croquis == '' || domicilios.nombre_croquis == null) ? 'clear' : 'done'}} + + + + + +     + + + + + + + +
No se encontraron registros.
+
Espera un momento....
+
+ +
+ + +
+
+ +
diff --git a/src/app/views/pages/catalogos/clientes/clientes-domicilios-list/clientes-domicilios-list.component.scss b/src/app/views/pages/catalogos/clientes/clientes-domicilios-list/clientes-domicilios-list.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/pages/catalogos/clientes/clientes-domicilios-list/clientes-domicilios-list.component.ts b/src/app/views/pages/catalogos/clientes/clientes-domicilios-list/clientes-domicilios-list.component.ts new file mode 100644 index 0000000..069dbae --- /dev/null +++ b/src/app/views/pages/catalogos/clientes/clientes-domicilios-list/clientes-domicilios-list.component.ts @@ -0,0 +1,144 @@ +import {ChangeDetectorRef, Component, OnInit} from '@angular/core'; +import {MatTableDataSource} from '@angular/material'; +import {ApiService} from '../../../../../core/api/api.service'; +import {ActivatedRoute, Router} from '@angular/router'; +import {LayoutUtilsService, MessageType} from '../../../../../core/_base/crud'; +import {ClientesDomicilios} from '../clientes-domicilios.model'; +import {Subscription} from 'rxjs'; + +@Component({ + selector: 'kt-clientes-domicilios-list', + templateUrl: './clientes-domicilios-list.component.html', + styleUrls: ['./clientes-domicilios-list.component.scss'] +}) +export class ClientesDomiciliosListComponent implements OnInit { +//Search +lastLength = 0; +typingTimer; +typingInterval = 700; + +displayedColumns: string[] = ['nombre_sucursal', 'domicilio', 'nombre_responsable_sucursal', 'telefono', 'email', 'created_at', 'croquis', 'actions']; +dataSourceClientesDomicilios: MatTableDataSource; + +//Loadings +isLoading = true; +showMessageWait = true; +subscriptions: Subscription[] = []; +clienteDomicilioID = 0; + +//Paginator, Searcher +searchText: string; +sortBy = 'nombre_sucursal'; +order = 'asc'; +page = '1'; +perPage = '10'; +total = 0; +pages = [10, 25, 50, 100]; +titulo = 'Domicilios de Cliente:'; + +clienteDomiciliosID = 0; +clienteID = ''; + +constructor(private api: ApiService, + private router: Router, + private layoutUtilsService: LayoutUtilsService, + private activatedRoute: ActivatedRoute, + private ref: ChangeDetectorRef) { + this.dataSourceClientesDomicilios = new MatTableDataSource(); +} + +ngOnInit() { + this.clienteID = this.activatedRoute.snapshot.paramMap.get('id'); +} + +getClientesDomicilios(){ + let routeSubscription = this.activatedRoute.params.subscribe(params => { + this.isLoading = true; + this.clienteDomicilioID = params.id; + this.api.clientesDomicilios.index('/domicilios', this.page, this.searchText, this.sortBy, this.order, this.perPage, this.clienteDomicilioID).subscribe(res =>{ + this.titulo = this.titulo + ' ' + res.cliente_denominacion; + this.isLoading = false; + this.showMessageWait = false; + this.dataSourceClientesDomicilios.data = res.data; + this.total = res.total; + this.ref.detectChanges(); + }, ()=>{ + this.isLoading = false; + this.showMessageWait = false; + }) + }); + this.subscriptions.push(routeSubscription); +} + +//Search +filtrarBusqueda(filterValue: string) { + if (filterValue.length != 0) { + this.searchText = filterValue.trim().toLowerCase(); + this.getClientesDomicilios(); + } else if (this.lastLength != 0) { + this.searchText = ''; + this.getClientesDomicilios(); + } + + this.lastLength = filterValue.length; +} + +onKeyUp(ev) { + clearTimeout(this.typingTimer); + this.typingTimer = setTimeout(() => { + this.filtrarBusqueda(ev.target.value) + }, this.typingInterval); +} + +onKeyDown() { + this.showMessageWait = true; + this.dataSourceClientesDomicilios.data = []; + clearTimeout(this.typingTimer); +}//Fin search + +editClienteDomicilio(id) { + this.router.navigate(['../../clientes-domicilios/edit', id, this.clienteDomicilioID], {relativeTo: this.activatedRoute}) +} + +deleteClienteDomicilio(domicilio) { + let title = 'Eliminar domicilio del cliente'; + let name = (domicilio.nombre_sucursal)? domicilio.nombre_sucursal : ''; + let description = '¿Está seguro de eliminar el domicilio del cliente ' + name + '?'; + let waitDesciption = 'Eliminando domicilio del cliente...'; + let deleteMessage = `El domicilio del cliente ha sido eliminado con éxito`; + let errorMessage = `El domicilio del cliente no se ha podido eliminar`; + let btnText = 'Eliminar'; + + let dialogRef = this.layoutUtilsService.deleteElement(title, description, waitDesciption, btnText); + dialogRef.afterClosed().subscribe(res => { + if (!res) { + return; + } + this.api.clientesDomicilios.delete('/domicilios', domicilio.id, domicilio.cliente_id).subscribe(() => { + this.getClientesDomicilios(); + this.layoutUtilsService.showActionNotification(deleteMessage, MessageType.Delete); + }, () => { + this.layoutUtilsService.showActionNotification(errorMessage, MessageType.Delete); + }); + }); + +} + +sort(event) { + this.order = event.direction; + this.sortBy = event.active; + this.getClientesDomicilios(); +} + +paginator(event) { + let nextPage = event.pageIndex + 1; + this.page = nextPage.toString(); + this.perPage = event.pageSize.toString(); + this.getClientesDomicilios(); +} + +ngAfterViewInit(): void { + this.getClientesDomicilios(); +} + +} diff --git a/src/app/views/pages/catalogos/clientes/clientes-domicilios.model.ts b/src/app/views/pages/catalogos/clientes/clientes-domicilios.model.ts new file mode 100644 index 0000000..eaab453 --- /dev/null +++ b/src/app/views/pages/catalogos/clientes/clientes-domicilios.model.ts @@ -0,0 +1,20 @@ +export class ClientesDomicilios { + id: number; + calle: string; + celular_responsable: string; + ciudad: string; + cliente_id: number; + colonia: string; + cp: string; + email: string; + entre_calles: string; + lat: string; + lng: string; + nombre_responsable_sucursal: string; + nombre_sucursal: string; + num_ext: string; + num_int: string; + numero_sucursal: number; + telefono: string; + nombre_croquis: string; +} diff --git a/src/app/views/pages/catalogos/clientes/clientes-domicilios.service.ts b/src/app/views/pages/catalogos/clientes/clientes-domicilios.service.ts new file mode 100644 index 0000000..500f6f4 --- /dev/null +++ b/src/app/views/pages/catalogos/clientes/clientes-domicilios.service.ts @@ -0,0 +1,62 @@ +import {Injectable} from '@angular/core'; +import {ApiBase} from '../../../../core/api/api-base'; +import {HttpClient, HttpParams} from '@angular/common/http'; +import { isNullOrUndefined } from 'util'; +import { catchError } from 'rxjs/operators'; +import { Observable } from 'rxjs'; +import { environment } from '../../../../../environments/environment'; + + +@Injectable({ + providedIn: 'root' +}) +export class ClientesDomiciliosService extends ApiBase { + + baseUrl = environment.API + 'administrador/clientes/'; + + constructor(public http: HttpClient) { + super(); + } + + public index(url: string, page?: string, searchText?: string, sortBy?: string, order?: string, perPage?: string, clienteDomicilioID?: number, visible?: string, deleted_at?: string): Observable { + + const params = new HttpParams() + .set('sortBy', isNullOrUndefined(sortBy) ? '' : sortBy) + .set('order', isNullOrUndefined(order) ? '' : order) + .set('page', isNullOrUndefined(page) ? '1' : page) + .set('perPage', isNullOrUndefined(perPage) ? '10' : perPage) + .set('visible', isNullOrUndefined(visible) ? '1' : visible) + .set('deleted', isNullOrUndefined(deleted_at) ? '0' : deleted_at) + .set('query', searchText ? searchText : ''); + const options = {params: params}; + + return this.http.get(this.baseUrl + clienteDomicilioID + url, options).pipe( + catchError(this.handleError('index')) + ); + } + + + public create(url: string, body: any, clienteDomicilioID: string): Observable { + return this.http.post(this.baseUrl + clienteDomicilioID + url, body).pipe( + catchError(this.handleError('create')) + ); + } + + public delete(url: string, id: number, clienteId: number): Observable { + return this.http.delete(`${this.baseUrl + clienteId + url}/${id}`).pipe( + catchError(this.handleError('delete')) + ); + } + + public show(url: string, id: number, clienteDomicilioID: string): Observable { + return this.http.get(`${this.baseUrl + clienteDomicilioID + url}/${id}`).pipe( + catchError(this.handleError('show')) + ); + } + + public update(url: string, id: number, body: any, clienteDomicilioID: string): Observable { + return this.http.put(`${this.baseUrl + clienteDomicilioID + url}/${id}`, body).pipe( + catchError(this.handleError('update')) + ); + } +} diff --git a/src/app/views/pages/catalogos/clientes/clientes-edit/clientes-edit.component.html b/src/app/views/pages/catalogos/clientes/clientes-edit/clientes-edit.component.html new file mode 100644 index 0000000..9186379 --- /dev/null +++ b/src/app/views/pages/catalogos/clientes/clientes-edit/clientes-edit.component.html @@ -0,0 +1,462 @@ + + +
+ + + +
+
+ + + + + + Información básica + + + + +
+
+ +
+ Espera un momento.... +
+
+
+
+
+
+ + + + + + + {{asesor.nombre + ' ' + asesor.apellido_paterno + ' ' + asesor.apellido_materno}} + + + + El campo es requerido + + +
+
+ + + + + + + {{sucursal.nombre}} + + + + El campo es requerido + + +
+
+ +
+
+ + + Por favor introduce el + nombre + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+ +
+ + + Por favor introduce el + el correo electrónico + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + + Correo inválido, ej. correo@mail.com + + +
+
+ +
+ + +
+
+
+ +
+ + No + Si + +
+
+
+ +
+
+
+ + + Por favor introduce el + razón social + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+ +
+ + + Por favor introduce el + rfc + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+
+ +
+
+ + + Por favor introduce el + el correo electrónico + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + + Correo inválido, ej. correo@mail.com + + +
+
+ +
+
+ + + Por favor introduce el + calle + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+ +
+ + + Por favor introduce el + número exterior + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+ +
+ + + Por favor introduce el + número interior + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+
+ +
+
+ + + Por favor introduce el + colonia + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+ +
+ + + Por favor introduce el + código postal + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+ +
+ + + Por favor introduce el + localidad + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+
+ +
+
+ + + Por favor introduce el + municipio + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+ +
+ + + Por favor introduce el + estado + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+ +
+ + + Por favor introduce el + pais + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+
+ +
+
+ ¿Retención de IVA? +
+ + No + Si + +
+
+ +
+
+ + Condición de pago + + +
+
+ +
+
+ + Observaciones + + +
+
+ +
+
+ + + + + + + {{forma_pago.descripcion}} + + + + El campo es requerido + + +
+
+ + + + + + + {{metodo_pago.descripcion}} + + + + El campo es requerido + + +
+ +
+ + + + + + + {{tipo_comprobante.descripcion}} + + + + El campo es requerido + + +
+ +
+ + + + + + + {{uso_cfdi.descripcion}} + + + + El campo es requerido + + +
+
+
+
+
+ +
+
+
+
+
diff --git a/src/app/views/pages/catalogos/clientes/clientes-edit/clientes-edit.component.scss b/src/app/views/pages/catalogos/clientes/clientes-edit/clientes-edit.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/pages/catalogos/clientes/clientes-edit/clientes-edit.component.ts b/src/app/views/pages/catalogos/clientes/clientes-edit/clientes-edit.component.ts new file mode 100644 index 0000000..8c12194 --- /dev/null +++ b/src/app/views/pages/catalogos/clientes/clientes-edit/clientes-edit.component.ts @@ -0,0 +1,419 @@ +import {ChangeDetectorRef, Component, OnInit} from '@angular/core'; +import {FormBuilder, FormControl, FormGroup, Validators} from '@angular/forms'; +import {ActivatedRoute, Router} from '@angular/router'; +import {LayoutUtilsService, MessageType} from '../../../../../core/_base/crud'; +import {ApiService} from '../../../../../core/api/api.service'; +import {Clientes} from '../clientes.model'; +import {ReplaySubject, Subscription} from 'rxjs'; +import Utils from "../../../../../utils"; + +@Component({ + selector: 'kt-clientes-edit', + templateUrl: './clientes-edit.component.html', + styleUrls: ['./clientes-edit.component.scss'] +}) +export class ClientesEditComponent implements OnInit { + + //SearchRols + typingTimer; + typingInterval = 700; + lastLengthRol = 0; + hidePassword = true; + + req_factura = false; + + clientesForm: FormGroup; + datosFiscalesForm: FormGroup; + selectedTab = 0; + subscriptions: Subscription[] = []; + isNewCliente = false; + isLoading = true; + loading = false; + clienteID = 0; + recently = true; + + filteredSucursales: ReplaySubject = new ReplaySubject(1); + sucursales = []; + + filteredAsesores: ReplaySubject = new ReplaySubject(1); + asesores = []; + + filteredMetodoPago: ReplaySubject = new ReplaySubject(1); + metodo_pago = []; + + filteredFormaPago: ReplaySubject = new ReplaySubject(1); + forma_pago = []; + + filteredTipoComprobante: ReplaySubject = new ReplaySubject(1); + tipo_comprobante = []; + + filteredUsoCFDI: ReplaySubject = new ReplaySubject(1); + uso_cfdi = []; + + //input search filter + isLoadingInputSearch = true; + + constructor(private fb: FormBuilder, + private router: Router, + private layoutUtilsService: LayoutUtilsService, + private activatedRoute: ActivatedRoute, + private ref: ChangeDetectorRef, + private api: ApiService) { + } + + ngOnInit() { + this.crearFormulario(); + this.getSucursales(); + this.getAsesores(); + this.getFormaPago(); + this.getMetodoPago(); + this.getTipoComprobante(); + this.getUsoCFDI(); + } + + getCliente() { + let routeSubscription = this.activatedRoute.params.subscribe(params => { + this.clienteID = params.id; + if (this.clienteID && this.clienteID > 0) { + this.isNewCliente = false; + this.api.clientes.show(this.clienteID).subscribe(res => { + this.isLoading = false; + + res.requiere_factura = Utils.toNumber(res.requiere_factura); + this.req_factura = res.requiere_factura == 1; + res.asesor_id = Utils.toNumber(res.asesor_id); + res.sucursal_id = Utils.toNumber(res.sucursal_id); + + this.clientesForm.reset(res); + + if(this.req_factura){ + res.datos_fiscales.retencion_iva = Utils.toNumber(res.datos_fiscales.retencion_iva); + res.datos_fiscales.factura_formas_pago_id = Utils.toNumber(res.datos_fiscales.factura_formas_pago_id); + res.datos_fiscales.factura_metodos_pago_id = Utils.toNumber(res.datos_fiscales.factura_metodos_pago_id); + res.datos_fiscales.factura_tipo_comprobante_id = Utils.toNumber(res.datos_fiscales.factura_tipo_comprobante_id); + res.datos_fiscales.factura_uso_cfdi_id = Utils.toNumber(res.datos_fiscales.factura_uso_cfdi_id); + this.datosFiscalesForm.reset(res.datos_fiscales) + } + + this.ref.detectChanges(); + }); + } else { + this.isNewCliente = true; + this.isLoading = true; + this.ref.detectChanges(); + } + }); + this.subscriptions.push(routeSubscription); + } + + getSucursales() { + this.api.clientes.sucursales('administrador/clientes/sucursales').subscribe(res => { + this.sucursales = res.data; + this.filteredSucursales.next(res.data.slice()); + this.ref.detectChanges(); + }); + } + + getAsesores() { + this.api.clientes.asesores('administrador/clientes/asesores').subscribe(res => { + this.asesores = res.data; + this.filteredAsesores.next(res.data.slice()); + this.ref.detectChanges(); + this.isLoading = false; + }); + } + + getFormaPago() { + this.api.clientes.formasPago('administrador/clientes/formas_pago').subscribe(res => { + this.forma_pago = res.data; + this.filteredFormaPago.next(res.data.slice()); + this.ref.detectChanges(); + }); + } + + getMetodoPago() { + this.api.clientes.metodoPago('administrador/clientes/metodos_pago').subscribe(res => { + this.metodo_pago = res.data; + this.filteredMetodoPago.next(res.data.slice()); + this.ref.detectChanges(); + }); + } + + getTipoComprobante() { + this.api.clientes.tipoComprobante('administrador/clientes/tipo_comprobante').subscribe(res => { + this.tipo_comprobante = res.data; + this.filteredTipoComprobante.next(res.data.slice()); + this.ref.detectChanges(); + }); + } + + getUsoCFDI() { + this.api.clientes.usoCFDI('administrador/clientes/cfdi').subscribe(res => { + this.uso_cfdi = res.data; + this.filteredUsoCFDI.next(res.data.slice()); + this.ref.detectChanges(); + }); + } + + onKeyUpManual(ev, tipo) { + let text = ev.target.value; + + if (text != '') { + this.recently = false; + } + + if (!this.recently) { + this.isLoadingInputSearch = true; + clearTimeout(this.typingTimer); + this.typingTimer = setTimeout(() => { + + switch (tipo) { + case 'asesor': { + this.getAsesorFilter(text); + break; + } + case 'sucursal': { + this.getSucursalFilter(text); + break; + } + case 'forma_pago': { + this.getFormaPagoFilter(text); + break; + } + case 'metodo_pago': { + this.getMetodoPagoFilter(text); + break; + } + case 'tipo_comprobante': { + this.getTipoComprobanteFilter(text); + break; + } + case 'uso_cfdi': { + this.getUsoCFDIFilter(text); + break; + } + } + + if (text == '') { + this.recently = true; + } + + }, this.typingInterval); + } else { + this.isLoadingInputSearch = false; + } + + } + + onKeyDown(tipo) { + this.isLoadingInputSearch = false; + + switch (tipo) { + case 'asesor': { + this.filteredAsesores.next([]); + break; + } + case 'sucursal': { + if (!this.recently) + this.filteredSucursales.next([]); + break; + } + case 'forma_pago': { + if (!this.recently) + this.filteredFormaPago.next([]); + break; + } + case 'metodo_pago': { + if (!this.recently) + this.filteredMetodoPago.next([]); + break; + } + case 'tipo_comprobante': { + if (!this.recently) + this.filteredTipoComprobante.next([]); + break; + } + case 'uso_cfdi': { + if (!this.recently) + this.filteredUsoCFDI.next([]); + break; + } + } + + clearTimeout(this.typingTimer); + } + + getAsesorFilter(query = null) { + this.clientesForm.controls['searchAsesor'].setValue(query); + if (query != '') { + this.api.clientes.asesores('administrador/clientes/asesores?query=' + query).subscribe(res => { + this.filteredAsesores.next(res.data.slice()); + this.isLoadingInputSearch = false; + this.ref.detectChanges(); + }); + } + } + + getSucursalFilter(query = null) { + this.clientesForm.controls['searchSucursal'].setValue(query); + if (query != '') { + this.api.clientes.sucursales('administrador/clientes/sucursales?query=' + query).subscribe(res => { + this.filteredSucursales.next(res.data.slice()); + this.isLoadingInputSearch = false; + this.ref.detectChanges(); + }); + } + } + + getFormaPagoFilter(query = null) { + this.datosFiscalesForm.controls['searchFormaPago'].setValue(query); + if (query != '') { + this.api.clientes.formasPago('administrador/clientes/formas_pago?query=' + query).subscribe(res => { + this.filteredFormaPago.next(res.data.slice()); + this.isLoadingInputSearch = false; + this.ref.detectChanges(); + }); + } + } + + getMetodoPagoFilter(query = null) { + this.datosFiscalesForm.controls['searchMetodoPago'].setValue(query); + if (query != '') { + this.api.clientes.metodoPago('administrador/clientes/metodos_pago?query=' + query).subscribe(res => { + this.filteredMetodoPago.next(res.data.slice()); + this.isLoadingInputSearch = false; + this.ref.detectChanges(); + }); + } + } + + getTipoComprobanteFilter(query = null) { + this.datosFiscalesForm.controls['searchTipoComprobante'].setValue(query); + if (query != '') { + this.api.clientes.tipoComprobante('administrador/clientes/tipo_comprobante?query=' + query).subscribe(res => { + this.filteredTipoComprobante.next(res.data.slice()); + this.isLoadingInputSearch = false; + this.ref.detectChanges(); + }); + } + } + + getUsoCFDIFilter(query = null) { + this.datosFiscalesForm.controls['searchUsoCFDI'].setValue(query); + if (query != '') { + this.api.clientes.usoCFDI('administrador/clientes/cfdi?query=' + query).subscribe(res => { + this.filteredUsoCFDI.next(res.data.slice()); + this.isLoadingInputSearch = false; + this.ref.detectChanges(); + }); + } + } + + crearFormulario() { + this.clientesForm = this.fb.group({ + denominacion: [null, [Validators.required, Validators.maxLength(128)],], + email: ["", [Validators.email]], + asesor_id: ['', [Validators.required]], + sucursal_id: ['', [Validators.required]], + requiere_factura: ['', [Validators.required]], + searchAsesor: [''], + searchSucursal: [''], + }); + + this.datosFiscalesForm = this.fb.group({ + razon_social: ["", []], + rfc: ["", []], + calle: ["", []], + email: ["", [Validators.email]], + num_ext: ["", []], + num_int: ["", []], + colonia: ["", []], + cp: ["", []], + localidad: ["", []], + municipio: ["", []], + estado: ["", []], + pais: ["", []], + retencion_iva: [0, []], + condicion_pago: ["", [Validators.maxLength(128)]], + observacion: ["", [Validators.maxLength(128)]], + factura_metodos_pago_id: ["", []], + factura_formas_pago_id: ["", []], + factura_tipo_comprobante_id: ["", []], + factura_uso_cfdi_id: ["", []], + searchFormaPago: [''], + searchMetodoPago: [''], + searchTipoComprobante: [''], + searchUsoCFDI: [''], + }); + } + + changeNoFoundLabel() { + return this.isLoadingInputSearch ? 'Espere un momento...' : 'No se encontraron resultados'; + } + + onSubmit() { + let controls = this.clientesForm.controls; + if (this.clientesForm.invalid) { + Object.keys(controls).forEach(controlName => { + controls[controlName].markAsTouched(); + }) + return; + } + + let clientes: Clientes = this.clientesForm.value as Clientes; + + if (clientes.requiere_factura) + clientes['datos_fiscales'] = this.datosFiscalesForm.value; + + if (this.isNewCliente) { + this.addCliente(clientes); + } else + this.updateCliente(this.clienteID, clientes); + } + + addCliente(cliente) { + this.api.clientes.create(cliente).subscribe(() => { + this.loading = false; + this.layoutUtilsService.showActionNotification('Cliente guardado con éxito.', MessageType.Create); + this.router.navigate(['../'], {relativeTo: this.activatedRoute}) + }, () => { + this.loading = false; + }); + } + + updateCliente(id, cliente) { + this.api.clientes.update(id, cliente).subscribe(() => { + this.loading = false; + this.layoutUtilsService.showActionNotification('Cliente actualizado con éxito.', MessageType.Update); + this.router.navigate(['../../'], {relativeTo: this.activatedRoute}) + }, () => { + this.loading = false; + }); + } + + selectionChange(event) { + event.value == 1 ? this.req_factura = true : this.req_factura = false + } + + isControlValid(controlName: string): boolean { + let control = this.clientesForm.controls[controlName]; + if (!control) { + return false; + } else if (control.valid) { + return false; + } + return true; + } + + isControlHasError(controlName: string, validationType: string): boolean { + let control = this.clientesForm.controls[controlName]; + if (!control) { + return false; + } + return control.hasError(validationType) && (control.dirty || control.touched); + } + + ngAfterViewInit(): void { + this.getCliente(); + } +} diff --git a/src/app/views/pages/catalogos/clientes/clientes-list/clientes-list.component.html b/src/app/views/pages/catalogos/clientes/clientes-list/clientes-list.component.html new file mode 100644 index 0000000..ab865ba --- /dev/null +++ b/src/app/views/pages/catalogos/clientes/clientes-list/clientes-list.component.html @@ -0,0 +1,93 @@ + + +
+ +
+
+ + + {{(deleted_at == '0') ? 'Mostrar eliminados' : 'Ocultar eliminados'}} + +
+ +
+
+
+ + + +
+
+
+
+ + + + Buscar en todos los campos + + +
+
+
+
+ +
+ + + + Denominación + {{clientes.denominacion}} + + + + Correo electrónico + {{(clientes.email) ? clientes.email : 'Email no registrado'}} + + + + Sucursal + {{clientes.sucursal_nombre}} + + + + Asesor + {{clientes.asesor_nombre + ' ' + clientes.asesor_apellido_paterno + ' ' + clientes.asesor_apellido_materno}} + + + + Fecha + {{(clientes.created_at) ? clientes.created_at : 'Fecha no registrada'}} + + + + + + + + + + + + + + +
No se encontraron registros.
+
Espera un momento....
+
+ +
+ + +
+
+ +
diff --git a/src/app/views/pages/catalogos/clientes/clientes-list/clientes-list.component.scss b/src/app/views/pages/catalogos/clientes/clientes-list/clientes-list.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/pages/catalogos/clientes/clientes-list/clientes-list.component.ts b/src/app/views/pages/catalogos/clientes/clientes-list/clientes-list.component.ts new file mode 100644 index 0000000..9755646 --- /dev/null +++ b/src/app/views/pages/catalogos/clientes/clientes-list/clientes-list.component.ts @@ -0,0 +1,145 @@ +import {AfterViewInit, ChangeDetectorRef, Component, OnInit} from '@angular/core'; +import {MatTableDataSource} from '@angular/material'; +import {ApiService} from '../../../../../core/api/api.service'; +import {ActivatedRoute, Router} from '@angular/router'; +import {LayoutUtilsService, MessageType} from '../../../../../core/_base/crud'; +import {Clientes} from '../clientes.model'; + +@Component({ + selector: 'kt-clientes-list', + templateUrl: './clientes-list.component.html', + styleUrls: ['./clientes-list.component.scss'] +}) +export class ClientesListComponent implements OnInit { + + //Search + lastLength = 0; + typingTimer; + typingInterval = 700; + deleted_at = '0'; + + displayedColumns: string[] = ['denominacion', 'email', 'sucursal', 'asesor', 'created_at', 'actions']; + dataSourceClientes: MatTableDataSource; + + //Loadings + isLoading = true; + showMessageWait = true; + + //Paginator, Searcher + searchText: string; + sortBy = 'denominacion'; + order = 'asc'; + page = '1'; + perPage = '10'; + total = 0; + pages = [10, 25, 50, 100]; + titulo = 'Clientes'; + + constructor(private api: ApiService, + private router: Router, + private layoutUtilsService: LayoutUtilsService, + private activatedRoute: ActivatedRoute, + private ref: ChangeDetectorRef) { + this.dataSourceClientes = new MatTableDataSource(); + } + + ngOnInit() { + } + +toggle(event){ + this.deleted_at = event.checked == false ? '0' : '1'; + this.getClientes(); +} + + getClientes(){ + this.isLoading = true; + this.api.clientes.index(this.page, this.searchText, this.sortBy, this.order, this.perPage, null, this.deleted_at).subscribe(res =>{ + this.isLoading = false; + this.showMessageWait = false; + this.dataSourceClientes.data = res.data; + this.total = res.total; + this.ref.detectChanges(); + }, ()=>{ + this.isLoading = false; + this.showMessageWait = false; + }) + } + + //Search + filtrarBusqueda(filterValue: string) { + if (filterValue.length != 0) { + this.searchText = filterValue.trim().toLowerCase(); + this.getClientes(); + } else if (this.lastLength != 0) { + this.searchText = ''; + this.getClientes(); + } + + this.lastLength = filterValue.length; + } + + onKeyUp(ev) { + clearTimeout(this.typingTimer); + this.typingTimer = setTimeout(() => { + this.filtrarBusqueda(ev.target.value) + }, this.typingInterval); + } + + onKeyDown() { + this.showMessageWait = true; + this.dataSourceClientes.data = []; + clearTimeout(this.typingTimer); + }//Fin search + + addAddress(id){ + this.router.navigate(['../clientes-domicilios/', id], {relativeTo: this.activatedRoute}) + } + + editCliente(id) { + this.router.navigate(['../clientes/edit/', id], {relativeTo: this.activatedRoute}) + } + + deleteCliente(cliente) { + let title = (cliente.deleted_at == null) ? 'Eliminar cliente' : 'Activar cliente'; + let name = (cliente.denominacion) ? cliente.denominacion : ''; + let description = (cliente.deleted_at == null) ? '¿Está seguro de eliminar el cliente ' + name + '?' : '¿Está seguro de activar el cliente ' + name + '?'; + let waitDesciption = (cliente.deleted_at == null) ? 'Eliminando cliente...' : 'Activando cliente...'; + let deleteMessage = (cliente.deleted_at == null) ? `El cliente ha sido eliminado con éxito` : `El cliente ha sido activado con éxito`; + let errorMessage = (cliente.deleted_at == null) ? `El cliente no se ha podido eliminar` : `El cliente no se ha podido activar` ; + let btnText = (!cliente.deleted_at) ? 'Eliminar' : 'Activar'; + + let dialogRef = this.layoutUtilsService.deleteElement(title, description, waitDesciption, btnText); + dialogRef.afterClosed().subscribe(res => { + if (!res) { + return; + } + let reactivate = (cliente.deleted_at != null) + + this.api.clientes.delete(cliente.id, reactivate).subscribe(() => { + this.getClientes(); + this.layoutUtilsService.showActionNotification(deleteMessage, MessageType.Delete); + }, () => { + this.layoutUtilsService.showActionNotification(errorMessage, MessageType.Delete); + }); + }); + + } + + sort(event) { + this.order = event.direction; + this.sortBy = event.active; + this.getClientes(); + } + + paginator(event) { + let nextPage = event.pageIndex + 1; + this.page = nextPage.toString(); + this.perPage = event.pageSize.toString(); + this.getClientes(); + } + + ngAfterViewInit(): void { + this.getClientes(); + } + +} diff --git a/src/app/views/pages/catalogos/clientes/clientes.model.ts b/src/app/views/pages/catalogos/clientes/clientes.model.ts new file mode 100644 index 0000000..512a79a --- /dev/null +++ b/src/app/views/pages/catalogos/clientes/clientes.model.ts @@ -0,0 +1,26 @@ +export class Clientes { + id: number; + denominacion: string; + email: string; + asesor_id: number; + sucursal_id: number; + requiere_factura: number; + razon_social: string; + rfc: string; + calle: string; + num_ext: string; + num_int: string; + colonia: string; + codigo_postal: string; + localidad: string; + municipio: string; + estado: string; + pais: string; + retencion_iva_id: number; + condicion_pago: string; + observaciones: string; + metodo_pago_id: number; + formas_pago_id: number; + tipo_comprobante_id: number; + uso_cfdi_id: number; +} diff --git a/src/app/views/pages/catalogos/clientes/clientes.service.ts b/src/app/views/pages/catalogos/clientes/clientes.service.ts new file mode 100644 index 0000000..2a9360a --- /dev/null +++ b/src/app/views/pages/catalogos/clientes/clientes.service.ts @@ -0,0 +1,51 @@ +import {Injectable} from '@angular/core'; +import {ResourceBase} from '../../../../core/api/resource'; +import {HttpClient} from '@angular/common/http'; +import { Observable } from "rxjs"; +import { catchError } from "rxjs/operators"; + +@Injectable({ + providedIn: 'root' +}) +export class ClientesService extends ResourceBase { + + constructor(public http: HttpClient) { + super(http, 'administrador/clientes'); + } + + public sucursales(url) : Observable { + return this.http.get(this.baseUrl+url).pipe( + catchError(this.handleError('index')) + ); + } + + public asesores(url) : Observable { + return this.http.get(this.baseUrl+url).pipe( + catchError(this.handleError('index')) + ); + } + + public formasPago(url) : Observable { + return this.http.get(this.baseUrl+url).pipe( + catchError(this.handleError('index')) + ); + } + + public metodoPago(url) : Observable { + return this.http.get(this.baseUrl+url).pipe( + catchError(this.handleError('index')) + ); + } + + public tipoComprobante(url) : Observable { + return this.http.get(this.baseUrl+url).pipe( + catchError(this.handleError('index')) + ); + } + + public usoCFDI(url) : Observable { + return this.http.get(this.baseUrl+url).pipe( + catchError(this.handleError('index')) + ); + } +} diff --git a/src/app/views/pages/catalogos/estados-servicio/estados-servicio-edit/estados-servicio-edit.component.html b/src/app/views/pages/catalogos/estados-servicio/estados-servicio-edit/estados-servicio-edit.component.html new file mode 100644 index 0000000..62f2429 --- /dev/null +++ b/src/app/views/pages/catalogos/estados-servicio/estados-servicio-edit/estados-servicio-edit.component.html @@ -0,0 +1 @@ +

estados-servicio-edit works!

diff --git a/src/app/views/pages/catalogos/estados-servicio/estados-servicio-edit/estados-servicio-edit.component.scss b/src/app/views/pages/catalogos/estados-servicio/estados-servicio-edit/estados-servicio-edit.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/pages/catalogos/estados-servicio/estados-servicio-edit/estados-servicio-edit.component.spec.ts b/src/app/views/pages/catalogos/estados-servicio/estados-servicio-edit/estados-servicio-edit.component.spec.ts new file mode 100644 index 0000000..ac39b1e --- /dev/null +++ b/src/app/views/pages/catalogos/estados-servicio/estados-servicio-edit/estados-servicio-edit.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EstadosServicioEditComponent } from './estados-servicio-edit.component'; + +describe('EstadosServicioEditComponent', () => { + let component: EstadosServicioEditComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EstadosServicioEditComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EstadosServicioEditComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/views/pages/catalogos/estados-servicio/estados-servicio-edit/estados-servicio-edit.component.ts b/src/app/views/pages/catalogos/estados-servicio/estados-servicio-edit/estados-servicio-edit.component.ts new file mode 100644 index 0000000..917c232 --- /dev/null +++ b/src/app/views/pages/catalogos/estados-servicio/estados-servicio-edit/estados-servicio-edit.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'kt-estados-servicio-edit', + templateUrl: './estados-servicio-edit.component.html', + styleUrls: ['./estados-servicio-edit.component.scss'] +}) +export class EstadosServicioEditComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/app/views/pages/catalogos/estados-servicio/estados-servicio-list/estados-servicio-list.component.html b/src/app/views/pages/catalogos/estados-servicio/estados-servicio-list/estados-servicio-list.component.html new file mode 100644 index 0000000..fe43e63 --- /dev/null +++ b/src/app/views/pages/catalogos/estados-servicio/estados-servicio-list/estados-servicio-list.component.html @@ -0,0 +1,66 @@ + + +
+ +
+
+ + + +
+
+
+
+ + + + Buscar en todos los campos + + +
+
+
+
+ +
+ + + + Nombre + {{estatus_servicio.nombre}} + + + + Fecha + {{estatus_servicio.created_at}} + + + + + + + + + + + + + +
No se encontraron registros.
+
Espera un momento....
+
+ +
+ + +
+
+ +
diff --git a/src/app/views/pages/catalogos/estados-servicio/estados-servicio-list/estados-servicio-list.component.scss b/src/app/views/pages/catalogos/estados-servicio/estados-servicio-list/estados-servicio-list.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/pages/catalogos/estados-servicio/estados-servicio-list/estados-servicio-list.component.spec.ts b/src/app/views/pages/catalogos/estados-servicio/estados-servicio-list/estados-servicio-list.component.spec.ts new file mode 100644 index 0000000..f3c1ba2 --- /dev/null +++ b/src/app/views/pages/catalogos/estados-servicio/estados-servicio-list/estados-servicio-list.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EstadosServicioListComponent } from './estados-servicio-list.component'; + +describe('EstadosServicioListComponent', () => { + let component: EstadosServicioListComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EstadosServicioListComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EstadosServicioListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/views/pages/catalogos/estados-servicio/estados-servicio-list/estados-servicio-list.component.ts b/src/app/views/pages/catalogos/estados-servicio/estados-servicio-list/estados-servicio-list.component.ts new file mode 100644 index 0000000..2f200e4 --- /dev/null +++ b/src/app/views/pages/catalogos/estados-servicio/estados-servicio-list/estados-servicio-list.component.ts @@ -0,0 +1,132 @@ +import { ChangeDetectorRef, Component, OnInit } from '@angular/core'; +import { MatTableDataSource } from '@angular/material'; +import { ActivatedRoute, Router } from '@angular/router'; +import {ApiService} from '../../../../../core/api/api.service'; +import {LayoutUtilsService, MessageType} from '../../../../../core/_base/crud'; +import { EstadosServicio } from '../estados-servicio.model'; + +@Component({ + selector: 'kt-estados-servicio-list', + templateUrl: './estados-servicio-list.component.html', + styleUrls: ['./estados-servicio-list.component.scss'] +}) +export class EstadosServicioListComponent implements OnInit { + + //Search + lastLength = 0; + typingTimer; + typingInterval = 700; + + displayedColumns: string[] = ['nombre', 'fecha', 'actions']; + dataSourceEstadosServicio: MatTableDataSource; + + //Loadings + isLoading = true; + showMessageWait = true; + + //Paginator, Searcher + searchText: string; + sortBy = 'nombre'; + order = 'asc'; + page = '1'; + perPage = '10'; + total = 0; + pages = [10, 25, 50, 100]; + titulo = 'Estados de Servicio'; + + constructor(private api: ApiService, + private router: Router, + private layoutUtilsService: LayoutUtilsService, + private activatedRoute: ActivatedRoute, + private ref: ChangeDetectorRef) { + this.dataSourceEstadosServicio = new MatTableDataSource(); + } + + ngOnInit() { + } + + getEstadosServicio(){ + this.isLoading = true; + this.api.estadosServicio.index(this.page, this.searchText, this.sortBy, this.order, this.perPage).subscribe(res =>{ + this.isLoading = false; + this.showMessageWait = false; + this.dataSourceEstadosServicio.data = res.data; + this.total = res.total; + this.ref.detectChanges(); + }, ()=>{ + this.isLoading = false; + this.showMessageWait = false; + }) + } + + //Search + filtrarBusqueda(filterValue: string) { + if (filterValue.length != 0) { + this.searchText = filterValue.trim().toLowerCase(); + this.getEstadosServicio(); + } else if (this.lastLength != 0) { + this.searchText = ''; + this.getEstadosServicio(); + } + + this.lastLength = filterValue.length; + } + + onKeyUp(ev) { + clearTimeout(this.typingTimer); + this.typingTimer = setTimeout(() => { + this.filtrarBusqueda(ev.target.value) + }, this.typingInterval); + } + + onKeyDown() { + this.showMessageWait = true; + this.dataSourceEstadosServicio.data = []; + clearTimeout(this.typingTimer); + }//Fin search + + editEstadoServicio(id) { + this.router.navigate(['../estatus_servicios/edit/', id], {relativeTo: this.activatedRoute}) + } + + deleteEstadoServicio(estadoServicio) { + let title = 'Eliminar estado de servicio'; + let name = (estadoServicio.nombre) ? estadoServicio.nombre : ''; + let description = '¿Está seguro de eliminar el estado de servicio ' + name + '?'; + let waitDesciption = 'Eliminando estado de servicio...'; + let deleteMessage = `El estado de servicio ha sido eliminado con éxito`; + let errorMessage = `El estado de servicio no se ha podido eliminar`; + + let dialogRef = this.layoutUtilsService.deleteElement(title, description, waitDesciption); + dialogRef.afterClosed().subscribe(res => { + if (!res) { + return; + } + this.api.estadosServicio.delete(estadoServicio.id).subscribe(() => { + this.getEstadosServicio(); + this.layoutUtilsService.showActionNotification(deleteMessage, MessageType.Delete); + }, () => { + this.layoutUtilsService.showActionNotification(errorMessage, MessageType.Delete); + }); + }); + + } + + sort(event) { + this.order = event.direction; + this.sortBy = event.active; + this.getEstadosServicio(); + } + + paginator(event) { + let nextPage = event.pageIndex + 1; + this.page = nextPage.toString(); + this.perPage = event.pageSize.toString(); + this.getEstadosServicio(); + } + + ngAfterViewInit(): void { + this.getEstadosServicio(); + } + +} diff --git a/src/app/views/pages/catalogos/estados-servicio/estados-servicio.model.ts b/src/app/views/pages/catalogos/estados-servicio/estados-servicio.model.ts new file mode 100644 index 0000000..e10984d --- /dev/null +++ b/src/app/views/pages/catalogos/estados-servicio/estados-servicio.model.ts @@ -0,0 +1,4 @@ +export class EstadosServicio { + id: number; + nombre: string; +} diff --git a/src/app/views/pages/catalogos/estados-servicio/estados-servicio.service.ts b/src/app/views/pages/catalogos/estados-servicio/estados-servicio.service.ts new file mode 100644 index 0000000..21f86ab --- /dev/null +++ b/src/app/views/pages/catalogos/estados-servicio/estados-servicio.service.ts @@ -0,0 +1,28 @@ +import {Injectable} from '@angular/core'; +import {ResourceBase} from '../../../../core/api/resource'; +import {HttpClient, HttpParams} from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { catchError } from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root' +}) +export class EstadosServicioService extends ResourceBase { + + constructor(public http: HttpClient) { + super(http, 'administrador/estatus_servicios'); + } + + public getEstatus(url, searchText): Observable{ + let params = new HttpParams() + .set('perPage', '10') + .set('visible', '1') + .set('deleted_at', '0') + .set('query', (searchText) ? searchText : ''); + + let options = {params: params}; + return this.http.get(this.baseUrl + url, options).pipe( + catchError(this.handleError('index')) + ); + } +} diff --git a/src/app/views/pages/catalogos/formas-pago/formas-pago-edit/formas-pago-edit.component.html b/src/app/views/pages/catalogos/formas-pago/formas-pago-edit/formas-pago-edit.component.html new file mode 100644 index 0000000..ff76128 --- /dev/null +++ b/src/app/views/pages/catalogos/formas-pago/formas-pago-edit/formas-pago-edit.component.html @@ -0,0 +1,74 @@ + + +
+ + + +
+
+ + + + + + Información básica + + + + +
+
+ +
+ Espera un momento.... +
+
+
+
+
+
+ + + Por favor introduce el + nombre + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+
+ ¿Permite costo cero al guardar servicio? +
+
+
+
+
+
+
+ +
+
+
+
+
diff --git a/src/app/views/pages/catalogos/formas-pago/formas-pago-edit/formas-pago-edit.component.scss b/src/app/views/pages/catalogos/formas-pago/formas-pago-edit/formas-pago-edit.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/pages/catalogos/formas-pago/formas-pago-edit/formas-pago-edit.component.ts b/src/app/views/pages/catalogos/formas-pago/formas-pago-edit/formas-pago-edit.component.ts new file mode 100644 index 0000000..ae51c58 --- /dev/null +++ b/src/app/views/pages/catalogos/formas-pago/formas-pago-edit/formas-pago-edit.component.ts @@ -0,0 +1,125 @@ +import {ChangeDetectorRef, Component, OnInit} from '@angular/core'; +import {FormBuilder, FormGroup, Validators} from '@angular/forms'; +import {Subscription} from 'rxjs'; +import {ActivatedRoute, Router} from '@angular/router'; +import {LayoutUtilsService, MessageType} from '../../../../../core/_base/crud'; +import {ApiService} from '../../../../../core/api/api.service'; +import {FormasPago} from '../formas-pago.model'; +import Utils from "../../../../../utils"; + +@Component({ + selector: 'kt-formas-pago-edit', + templateUrl: './formas-pago-edit.component.html', + styleUrls: ['./formas-pago-edit.component.scss'] +}) +export class FormasPagoEditComponent implements OnInit { + + formaPagoForm: FormGroup; + selectedTab = 0; + subscriptions: Subscription[] = []; + isNewFormaPago = false; + isLoading = true; + loading = false; + formaPagoID = 0; + data: any; + + constructor(private fb: FormBuilder, + private router: Router, + private layoutUtilsService: LayoutUtilsService, + private activatedRoute: ActivatedRoute, + private ref: ChangeDetectorRef, + private api: ApiService) { + } + + ngOnInit() { + this.crearFormulario(); + } + + getFormaPago() { + let routeSubscription = this.activatedRoute.params.subscribe(params => { + this.formaPagoID = params.id; + if (this.formaPagoID && this.formaPagoID > 0) { + this.isNewFormaPago = false; + this.api.formasPago.show(this.formaPagoID).subscribe(res => { + this.isLoading = false; + res.zeros = Utils.toNumber(res.zeros); + this.formaPagoForm.reset(res); + this.ref.detectChanges(); + }); + } else { + this.isNewFormaPago = true; + this.isLoading = false; + this.ref.detectChanges(); + } + }); + this.subscriptions.push(routeSubscription); + } + + crearFormulario() { + this.formaPagoForm = this.fb.group({ + nombre: [null, [Validators.required, Validators.maxLength(128)]], + zeros: [null, ''] + }); + } + + onSubmit() { + let controls = this.formaPagoForm.controls; + if (this.formaPagoForm.invalid) { + Object.keys(controls).forEach(controlName => { + controls[controlName].markAsTouched(); + }) + return; + } + + let formaPago: FormasPago = this.formaPagoForm.value as FormasPago; + + if (this.isNewFormaPago) { + this.addFormaPago(formaPago); + } else + this.updateFormaPago(this.formaPagoID, formaPago); + } + + addFormaPago(formaPago) { + formaPago.zeros = formaPago.zeros ? '1' : '0' + this.api.formasPago.create(formaPago).subscribe(() => { + this.loading = false; + this.layoutUtilsService.showActionNotification('Forma de pago guardada con éxito.', MessageType.Create); + this.router.navigate(['../'], {relativeTo: this.activatedRoute}) + }, () => { + this.loading = false; + }); + } + + updateFormaPago(id, formaPago) { + formaPago.zeros == false ? formaPago.zeros = '0' : formaPago.zeros = '1'; + this.api.formasPago.update(id, formaPago).subscribe(() => { + this.loading = false; + this.layoutUtilsService.showActionNotification('Forma de pago actualizada con éxito.', MessageType.Update); + this.router.navigate(['../../'], {relativeTo: this.activatedRoute}) + }, () => { + this.loading = false; + }); + } + + isControlValid(controlName: string): boolean { + let control = this.formaPagoForm.controls[controlName]; + if (!control) { + return false; + } else if (control.valid) { + return false; + } + return true; + } + + isControlHasError(controlName: string, validationType: string): boolean { + let control = this.formaPagoForm.controls[controlName]; + if (!control) { + return false; + } + return control.hasError(validationType) && (control.dirty || control.touched); + } + + ngAfterViewInit(): void { + this.getFormaPago(); + } +} diff --git a/src/app/views/pages/catalogos/formas-pago/formas-pago-list/formas-pago-list.component.html b/src/app/views/pages/catalogos/formas-pago/formas-pago-list/formas-pago-list.component.html new file mode 100644 index 0000000..1464ce0 --- /dev/null +++ b/src/app/views/pages/catalogos/formas-pago/formas-pago-list/formas-pago-list.component.html @@ -0,0 +1,79 @@ + + +
+
+
+ + + {{(deleted_at == '0') ? 'Mostrar eliminados' : 'Ocultar eliminados'}} + +
+ +
+
+
+ + + +
+
+
+
+ + + + Buscar en todos los campos + + +
+
+
+
+ +
+ + + + Nombre + {{formas_pago.nombre}} + + + + Permite Ceros + {{(formas_pago.zeros == 1 || formas_pago.zeros == '1') ? 'done' : 'clear'}} + + + + Fecha + {{formas_pago.created_at}} + + + + + +     + + + + + + + +
No se encontraron registros.
+
Espera un momento....
+
+ +
+ + +
+
+ +
diff --git a/src/app/views/pages/catalogos/formas-pago/formas-pago-list/formas-pago-list.component.scss b/src/app/views/pages/catalogos/formas-pago/formas-pago-list/formas-pago-list.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/pages/catalogos/formas-pago/formas-pago-list/formas-pago-list.component.ts b/src/app/views/pages/catalogos/formas-pago/formas-pago-list/formas-pago-list.component.ts new file mode 100644 index 0000000..9c03fa9 --- /dev/null +++ b/src/app/views/pages/catalogos/formas-pago/formas-pago-list/formas-pago-list.component.ts @@ -0,0 +1,141 @@ +import {AfterViewInit, ChangeDetectorRef, Component, OnInit} from '@angular/core'; +import {MatTableDataSource} from '@angular/material'; +import {ApiService} from '../../../../../core/api/api.service'; +import {ActivatedRoute, Router} from '@angular/router'; +import {LayoutUtilsService, MessageType} from '../../../../../core/_base/crud'; +import {FormasPago} from '../formas-pago.model'; + +@Component({ + selector: 'kt-formas-pago-list', + templateUrl: './formas-pago-list.component.html', + styleUrls: ['./formas-pago-list.component.scss'] +}) +export class FormasPagoListComponent implements OnInit { + + //Search + lastLength = 0; + typingTimer; + typingInterval = 700; + + displayedColumns: string[] = ['nombre', 'zeros', 'created_at', 'actions']; + dataSourceFormasPago: MatTableDataSource; + + //Loadings + isLoading = true; + showMessageWait = true; + deleted_at = '0'; + + //Paginator, Searcher + searchText: string; + sortBy = 'nombre'; + order = 'asc'; + page = '1'; + perPage = '10'; + total = 0; + pages = [10, 25, 50, 100]; + titulo = 'Formas de pago'; + + constructor(private api: ApiService, + private router: Router, + private layoutUtilsService: LayoutUtilsService, + private activatedRoute: ActivatedRoute, + private ref: ChangeDetectorRef) { + this.dataSourceFormasPago = new MatTableDataSource(); + } + + ngOnInit() { + } + + toggle(event){ + this.deleted_at = event.checked == false ? '0' : '1'; + this.getFormasPago(); + } + + getFormasPago(){ + this.isLoading = true; + this.api.formasPago.index(this.page, this.searchText, this.sortBy, this.order, this.perPage, null, this.deleted_at).subscribe(res =>{ + this.isLoading = false; + this.showMessageWait = false; + this.dataSourceFormasPago.data = res.data; + this.total = res.total; + this.ref.detectChanges(); + }, ()=>{ + this.isLoading = false; + this.showMessageWait = false; + }) + } + + //Search + filtrarBusqueda(filterValue: string) { + if (filterValue.length != 0) { + this.searchText = filterValue.trim().toLowerCase(); + this.getFormasPago(); + } else if (this.lastLength != 0) { + this.searchText = ''; + this.getFormasPago(); + } + + this.lastLength = filterValue.length; + } + + onKeyUp(ev) { + clearTimeout(this.typingTimer); + this.typingTimer = setTimeout(() => { + this.filtrarBusqueda(ev.target.value) + }, this.typingInterval); + } + + onKeyDown() { + this.showMessageWait = true; + this.dataSourceFormasPago.data = []; + clearTimeout(this.typingTimer); + }//Fin search + + editFormasPago(id) { + this.router.navigate(['../formas-pago/edit/', id], {relativeTo: this.activatedRoute}) + } + + deleteFormasPago(formasPago) { + let title = (!formasPago.deleted_at) ? 'Eliminar forma de pago' : 'Activar forma de pago'; + let name = (formasPago.nombre) ? formasPago.nombre : ''; + let description = (!formasPago.deleted_at) ? '¿Está seguro de eliminar la forma de pago ' + name + '?' : '¿Está seguro de activar la forma de pago ' + name + '?'; + let waitDesciption = (!formasPago.deleted_at) ? 'Eliminando forma de pago...' : 'Activando forma de pago...'; + let deleteMessage = (!formasPago.deleted_at) ? `La forma de pago ha sido eliminado con éxito` : `La forma de pago ha sido activada con éxito`; + let errorMessage = (!formasPago.deleted_at) ? `La forma de pago no se ha podido eliminar` : `La forma de pago no se ha podido activar`; + let btnText = (!formasPago.deleted_at) ? 'Eliminar' : 'Activar'; + + let dialogRef = this.layoutUtilsService.deleteElement(title, description, waitDesciption, btnText); + dialogRef.afterClosed().subscribe(res => { + if (!res) { + return; + } + let reactivate = (formasPago.deleted_at != null) + + this.api.formasPago.delete(formasPago.id, reactivate).subscribe(() => { + this.getFormasPago(); + this.layoutUtilsService.showActionNotification(deleteMessage, MessageType.Delete); + }, () => { + this.layoutUtilsService.showActionNotification(errorMessage, MessageType.Delete); + }); + }); + + } + + sort(event) { + this.order = event.direction; + this.sortBy = event.active; + this.getFormasPago(); + } + + paginator(event) { + let nextPage = event.pageIndex + 1; + this.page = nextPage.toString(); + this.perPage = event.pageSize.toString(); + this.getFormasPago(); + } + + ngAfterViewInit(): void { + this.getFormasPago(); + } + +} diff --git a/src/app/views/pages/catalogos/formas-pago/formas-pago.model.ts b/src/app/views/pages/catalogos/formas-pago/formas-pago.model.ts new file mode 100644 index 0000000..38cdc9c --- /dev/null +++ b/src/app/views/pages/catalogos/formas-pago/formas-pago.model.ts @@ -0,0 +1,6 @@ +export class FormasPago { + id: number; + nombre: string; + zeros: string; + created_at: string; +} diff --git a/src/app/views/pages/catalogos/formas-pago/formas-pago.service.ts b/src/app/views/pages/catalogos/formas-pago/formas-pago.service.ts new file mode 100644 index 0000000..82cd45c --- /dev/null +++ b/src/app/views/pages/catalogos/formas-pago/formas-pago.service.ts @@ -0,0 +1,13 @@ +import {Injectable} from '@angular/core'; +import {ResourceBase} from '../../../../core/api/resource'; +import {HttpClient} from '@angular/common/http'; + +@Injectable({ + providedIn: 'root' +}) +export class FormasPagoService extends ResourceBase { + + constructor(public http: HttpClient) { + super(http, 'administrador/formas_pagos'); + } +} diff --git a/src/app/views/pages/catalogos/roles/permisos/permisos.component.html b/src/app/views/pages/catalogos/roles/permisos/permisos.component.html new file mode 100644 index 0000000..2c4bcaf --- /dev/null +++ b/src/app/views/pages/catalogos/roles/permisos/permisos.component.html @@ -0,0 +1,28 @@ +
+ +
+ + + + + + + + + + + + + + + + +
+ Permitir + + Recurso - acción +
{{permiso.name}}
+
+ + +
diff --git a/src/app/views/pages/catalogos/roles/permisos/permisos.component.ts b/src/app/views/pages/catalogos/roles/permisos/permisos.component.ts new file mode 100644 index 0000000..c36e022 --- /dev/null +++ b/src/app/views/pages/catalogos/roles/permisos/permisos.component.ts @@ -0,0 +1,28 @@ +import {Component, OnInit, Input} from '@angular/core'; + +@Component({ + selector: 'app-permisos', + templateUrl: './permisos.component.html' +}) +export class PermisosComponent implements OnInit { + + @Input() permissions: any[] = []; + select : boolean = true; + constructor() { + } + + ngOnInit() { + } + + selectAll() { + this.permissions.forEach((v, i) => { + if (this.select) { + v.value = true; + } else { + v.value = false; + } + }); + this.select = !this.select; + } + +} diff --git a/src/app/views/pages/catalogos/roles/roles-edit/roles-edit.component.html b/src/app/views/pages/catalogos/roles/roles-edit/roles-edit.component.html new file mode 100644 index 0000000..20b8f84 --- /dev/null +++ b/src/app/views/pages/catalogos/roles/roles-edit/roles-edit.component.html @@ -0,0 +1,93 @@ + + +
+ + + +
+
+ + + + + + Información básica + + + + +
+
+ +
+ Espera un momento.... +
+
+
+
+
+
+ + + Por favor introduce el + rol + + + Datos correctos + + El campo es + requerido + + + Debe contener máximo 128 caracteres + + +
+ +
+ + + Por favor introduce el + nombre + + + Datos correctos + + + Debe contener máximo 128 caracteres + + +
+
+ +
+
+ WEB + MOVIL +
+
+
+
+ + +
+ +
+
+
+
+
diff --git a/src/app/views/pages/catalogos/roles/roles-edit/roles-edit.component.scss b/src/app/views/pages/catalogos/roles/roles-edit/roles-edit.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/pages/catalogos/roles/roles-edit/roles-edit.component.ts b/src/app/views/pages/catalogos/roles/roles-edit/roles-edit.component.ts new file mode 100644 index 0000000..0a0e5b1 --- /dev/null +++ b/src/app/views/pages/catalogos/roles/roles-edit/roles-edit.component.ts @@ -0,0 +1,153 @@ +import {AfterViewInit, ChangeDetectorRef, Component, OnInit} from '@angular/core'; +import {FormBuilder, FormGroup, Validators} from '@angular/forms'; +import {Subscription} from 'rxjs'; +import {ActivatedRoute, Router} from '@angular/router'; +import {LayoutUtilsService, MessageType} from '../../../../../core/_base/crud'; +import {ApiService} from '../../../../../core/api/api.service'; +import {Rol} from '../roles.model'; + +@Component({ + selector: 'kt-roles-edit', + templateUrl: './roles-edit.component.html', + styleUrls: ['./roles-edit.component.scss'] +}) +export class RolesEditComponent implements OnInit, AfterViewInit { + //Forms + rolForm: FormGroup; + selectedTab = 0; + subscriptions: Subscription[] = []; + + isNewRol = true; + isLoading = true; + rolId = 0; + loading = false; + permissions = []; + + constructor(private fb: FormBuilder, + private router: Router, + private layoutUtilsService: LayoutUtilsService, + private activatedRoute: ActivatedRoute, + private ref: ChangeDetectorRef, + private api: ApiService) { + } + + ngOnInit() { + this.crearFormulario(); + } + + getPermisos() { + this.api.roles.getPermisos().subscribe(res => { + for (let key in res.permissions) { + this.permissions.push({name: key, value: res[key]}); + } + this.ref.detectChanges(); + }) + } + + crearFormulario() { + this.rolForm = this.fb.group({ + name: [null, [Validators.required, Validators.maxLength(128)]], + slug: [null, [Validators.required, Validators.maxLength(128)]], + web: [false, [Validators.required]], + movil: [false, [Validators.required]] + }) + } + + getRol() { + let routeSubscription = this.activatedRoute.params.subscribe(params => { + this.rolId = params.id; + if (this.rolId && this.rolId > 0) { + this.isNewRol = false; + this.api.roles.show(this.rolId) + .subscribe(res => { + this.isLoading = false; + res.web = res.web == '1' || res.web == 1; + res.movil = res.movil == '1' || res.movil == 1; + this.rolForm.reset(res); + for (let key in res.permissions) { + this.permissions.push({name: key, value: res.permissions[key]}); + } + this.ref.detectChanges(); + }); + } else { + this.getPermisos(); + this.isNewRol = true; + this.isLoading = false; + this.ref.detectChanges(); + } + }); + this.subscriptions.push(routeSubscription); + } + + prepararRol() { + let rol: Rol = this.rolForm.value as Rol; + + let obj = {}; + + this.permissions.forEach((v, i) => { + obj[v.name] = v.value; + }); + + rol.permissions = obj; + + return rol; + } + + onSubmit() { + let controls = this.rolForm.controls; + if (this.rolForm.invalid) { + Object.keys(controls).forEach(controlName => + controls[controlName].markAsTouched() + ); + return; + } + + let rol = this.prepararRol(); + if (this.isNewRol) { + this.addRol(rol); + } else + this.updateRol(this.rolId, rol); + } + + addRol(rol) { + this.api.roles.create(rol).subscribe(() => { + this.loading = false; + this.layoutUtilsService.showActionNotification('Rol guardado con éxito.', MessageType.Update); + this.router.navigate(['../'], {relativeTo: this.activatedRoute}) + }, () => { + this.loading = false; + }); + } + + updateRol(id, rol) { + this.api.roles.update(id, rol).subscribe(() => { + this.loading = false; + this.layoutUtilsService.showActionNotification('Rol actualizado con éxito.', MessageType.Update); + this.router.navigate(['../../'], {relativeTo: this.activatedRoute}) + }, () => { + this.loading = false; + }); + } + + isControlValid(controlName: string): boolean { + let control = this.rolForm.controls[controlName]; + if (!control) { + return false; + } else if (control.valid) { + return false; + } + return true; + } + + isControlHasError(controlName: string, validationType: string): boolean { + let control = this.rolForm.controls[controlName]; + if (!control) { + return false; + } + return control.hasError(validationType) && (control.dirty || control.touched); + } + + ngAfterViewInit(): void { + this.getRol(); + } +} diff --git a/src/app/views/pages/catalogos/roles/roles-list/roles-list.component.html b/src/app/views/pages/catalogos/roles/roles-list/roles-list.component.html new file mode 100644 index 0000000..2842ae5 --- /dev/null +++ b/src/app/views/pages/catalogos/roles/roles-list/roles-list.component.html @@ -0,0 +1,76 @@ + + +
+ +
+
+ + + +
+
+
+
+ + + + Buscar en todos los campos + + +
+
+
+
+ +
+ + + + Nombre + {{rol.name}} + + + + Slug + {{rol.slug}} + + + + Web + {{(rol.web == 1 || rol.web == '1') ? 'done' : 'clear'}} + + + + Móvil + {{(rol.movil == 1 || rol.movil == '1') ? 'done' : 'clear'}} + + + + + + + + + + + + + +
No se encontraron registros.
+
Espera un momento....
+
+ +
+ + +
+
+ +
diff --git a/src/app/views/pages/catalogos/roles/roles-list/roles-list.component.scss b/src/app/views/pages/catalogos/roles/roles-list/roles-list.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/pages/catalogos/roles/roles-list/roles-list.component.ts b/src/app/views/pages/catalogos/roles/roles-list/roles-list.component.ts new file mode 100644 index 0000000..c3769b3 --- /dev/null +++ b/src/app/views/pages/catalogos/roles/roles-list/roles-list.component.ts @@ -0,0 +1,130 @@ +import {AfterViewInit, ChangeDetectorRef, Component, OnInit} from '@angular/core'; +import {MatTableDataSource} from '@angular/material'; +import {ApiService} from '../../../../../core/api/api.service'; +import {ActivatedRoute, Router} from '@angular/router'; +import {LayoutUtilsService, MessageType} from '../../../../../core/_base/crud'; +import {Rol} from '../roles.model'; + +@Component({ + selector: 'kt-roles-list', + templateUrl: './roles-list.component.html', + styleUrls: ['./roles-list.component.scss'] +}) +export class RolesListComponent implements OnInit, AfterViewInit { + //Search + lastLength = 0; + typingTimer; + typingInterval = 700; + + displayedColumns: string[] = ['name', 'slug', 'web', 'movil', 'actions']; + dataSourceRol: MatTableDataSource; + + //Loadings + isLoading = true; + showMessageWait = true; + + //Paginator, Searcher + searchText: string; + sortBy = 'name'; + order = 'asc'; + page = '1'; + perPage = '10'; + total = 0; + pages = [10, 25, 50, 100]; + titulo = 'Roles'; + + constructor(private api: ApiService, + private router: Router, + private layoutUtilsService: LayoutUtilsService, + private activatedRoute: ActivatedRoute, + private ref: ChangeDetectorRef) { + this.dataSourceRol = new MatTableDataSource(); + } + + ngOnInit() { + } + + getRoles(){ + this.isLoading = true; + this.api.roles.index(this.page, this.searchText, this.sortBy, this.order, this.perPage).subscribe(res =>{ + this.isLoading = false; + this.showMessageWait = false; + this.dataSourceRol.data = res.data; + this.total = res.total; + this.ref.detectChanges(); + }, ()=>{ + this.isLoading = false; + this.showMessageWait = false; + }) + } + + //Search + filtrarBusqueda(filterValue: string) { + if (filterValue.length != 0) { + this.searchText = filterValue.trim().toLowerCase(); + this.getRoles(); + } else if (this.lastLength != 0) { + this.searchText = ''; + this.getRoles(); + } + + this.lastLength = filterValue.length; + } + + onKeyUp(ev) { + clearTimeout(this.typingTimer); + this.typingTimer = setTimeout(() => { + this.filtrarBusqueda(ev.target.value) + }, this.typingInterval); + } + + onKeyDown() { + this.showMessageWait = true; + this.dataSourceRol.data = []; + clearTimeout(this.typingTimer); + }//Fin search + + editRol(id) { + this.router.navigate(['../roles/edit/', id], {relativeTo: this.activatedRoute}) + } + + deleteRol(rol) { + let title = 'Eliminar rol'; + let description = '¿Está seguro de eliminar el rol ' + rol.name + '?'; + let waitDesciption = 'Eliminando rol...'; + let deleteMessage = `El rol ha sido eliminado con éxito`; + let errorMessage = `El rol no se ha podido eliminar`; + let btnTex = 'Eliminar' + + let dialogRef = this.layoutUtilsService.deleteElement(title, description, waitDesciption, btnTex); + dialogRef.afterClosed().subscribe(res => { + if (!res) { + return; + } + this.api.roles.delete(rol.id).subscribe(() => { + this.getRoles(); + this.layoutUtilsService.showActionNotification(deleteMessage, MessageType.Delete); + }, () => { + this.layoutUtilsService.showActionNotification(errorMessage, MessageType.Delete); + }); + }); + + } + + sort(event) { + this.order = event.direction; + this.sortBy = event.active; + this.getRoles(); + } + + paginator(event) { + let nextPage = event.pageIndex + 1; + this.page = nextPage.toString(); + this.perPage = event.pageSize.toString(); + this.getRoles(); + } + + ngAfterViewInit(): void { + this.getRoles(); + } +} diff --git a/src/app/views/pages/catalogos/roles/roles.model.ts b/src/app/views/pages/catalogos/roles/roles.model.ts new file mode 100644 index 0000000..21713f7 --- /dev/null +++ b/src/app/views/pages/catalogos/roles/roles.model.ts @@ -0,0 +1,9 @@ +export class Rol { + id: number; + slug: string; + name: string; + permissions : any; + created_at : string; + updated_at : string; + deleted_at : string; +} diff --git a/src/app/views/pages/catalogos/roles/roles.service.ts b/src/app/views/pages/catalogos/roles/roles.service.ts new file mode 100644 index 0000000..c14f2f2 --- /dev/null +++ b/src/app/views/pages/catalogos/roles/roles.service.ts @@ -0,0 +1,21 @@ +import {Injectable} from '@angular/core'; +import {ResourceBase} from '../../../../core/api/resource'; +import {HttpClient} from '@angular/common/http'; +import {Observable} from 'rxjs'; +import {catchError} from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root' +}) +export class RolesService extends ResourceBase { + + constructor(public http: HttpClient) { + super(http, 'administrador/roles'); + } + + public getPermisos(): Observable{ + return this.http.get(this.baseUrl + 'administrador/roles/rutas').pipe( + catchError(this.handleError('index')) + ); + } +} diff --git a/src/app/views/pages/catalogos/servicios/servicios-edit/servicios-edit.component.html b/src/app/views/pages/catalogos/servicios/servicios-edit/servicios-edit.component.html new file mode 100644 index 0000000..2c0bf57 --- /dev/null +++ b/src/app/views/pages/catalogos/servicios/servicios-edit/servicios-edit.component.html @@ -0,0 +1,71 @@ + + +
+ + + +
+
+ + + + + + Información básica + + + + +
+
+ +
+ Espera un momento.... +
+
+
+
+
+
+ + + Por favor introduce el + nombre + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+
+
+
+
+
+
+ +
+
+
+
+
\ No newline at end of file diff --git a/src/app/views/pages/catalogos/servicios/servicios-edit/servicios-edit.component.scss b/src/app/views/pages/catalogos/servicios/servicios-edit/servicios-edit.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/pages/catalogos/servicios/servicios-edit/servicios-edit.component.ts b/src/app/views/pages/catalogos/servicios/servicios-edit/servicios-edit.component.ts new file mode 100644 index 0000000..5a1773f --- /dev/null +++ b/src/app/views/pages/catalogos/servicios/servicios-edit/servicios-edit.component.ts @@ -0,0 +1,127 @@ +import {ChangeDetectorRef, Component, OnInit} from '@angular/core'; +import {FormBuilder, FormGroup, Validators} from '@angular/forms'; +import {Subscription} from 'rxjs'; +import {ActivatedRoute, Router} from '@angular/router'; +import {LayoutUtilsService, MessageType} from '../../../../../core/_base/crud'; +import {ApiService} from '../../../../../core/api/api.service'; +import {Servicios} from '../servicios.model'; + + +@Component({ + selector: 'kt-servicios-edit', + templateUrl: './servicios-edit.component.html', + styleUrls: ['./servicios-edit.component.scss'] +}) +export class ServiciosEditComponent implements OnInit { + + //SearchRols + typingTimerRol; + typingIntervalRol = 700; + searchTextRol: string = ''; + lastLengthRol = 0; + hidePassword = true; + + serviciosForm: FormGroup; + selectedTab = 0; + subscriptions: Subscription[] = []; + isNewServicio = false; + isLoading = true; + loading = false; + servicioID = 0; + + constructor(private fb: FormBuilder, + private router: Router, + private layoutUtilsService: LayoutUtilsService, + private activatedRoute: ActivatedRoute, + private ref: ChangeDetectorRef, + private api: ApiService) { + } + + ngOnInit() { + this.crearFormulario(); + } + + getServicios() { + let routeSubscription = this.activatedRoute.params.subscribe(params => { + this.servicioID = params.id; + if (this.servicioID && this.servicioID > 0) { + this.isNewServicio = false; + this.api.servicios.show(this.servicioID).subscribe(res => { + this.isLoading = false; + this.serviciosForm.reset(res); + this.ref.detectChanges(); + }); + } else { + this.isNewServicio = true; + this.isLoading = false; + this.ref.detectChanges(); + } + }); + this.subscriptions.push(routeSubscription); + } + + crearFormulario() { + this.serviciosForm = this.fb.group({ + nombre: [null, [Validators.required, Validators.maxLength(128)]], + }); } + + onSubmit() { + let controls = this.serviciosForm.controls; + if (this.serviciosForm.invalid) { + Object.keys(controls).forEach(controlName => { + controls[controlName].markAsTouched(); + }) + return; + } + + let servicio : Servicios = this.serviciosForm.value as Servicios; + + if (this.isNewServicio) { + this.addServicio(servicio); + } else + this.updateServicio(this.servicioID, servicio); + } + + addServicio(servicio) { + this.api.servicios.create(servicio).subscribe(() => { + this.loading = false; + this.layoutUtilsService.showActionNotification('Servicio guardado con éxito.', MessageType.Create); + this.router.navigate(['../'], {relativeTo: this.activatedRoute}) + }, () => { + this.loading = false; + }); + } + + updateServicio(id, servicio) { + this.api.servicios.update(id, servicio).subscribe(() => { + this.loading = false; + this.layoutUtilsService.showActionNotification('Servicio actualizado con éxito.', MessageType.Update); + this.router.navigate(['../../'], {relativeTo: this.activatedRoute}) + }, () => { + this.loading = false; + }); + } + + isControlValid(controlName: string): boolean { + let control = this.serviciosForm.controls[controlName]; + if (!control) { + return false; + } else if (control.valid) { + return false; + } + return true; + } + + isControlHasError(controlName: string, validationType: string): boolean { + let control = this.serviciosForm.controls[controlName]; + if (!control) { + return false; + } + return control.hasError(validationType) && (control.dirty || control.touched); + } + + ngAfterViewInit(): void { + this.getServicios(); + } + +} diff --git a/src/app/views/pages/catalogos/servicios/servicios-list/servicios-list.component.html b/src/app/views/pages/catalogos/servicios/servicios-list/servicios-list.component.html new file mode 100644 index 0000000..f29e0d7 --- /dev/null +++ b/src/app/views/pages/catalogos/servicios/servicios-list/servicios-list.component.html @@ -0,0 +1,74 @@ + + +
+
+
+ + + {{(deleted_at == '0') ? 'Mostrar eliminados' : 'Ocultar eliminados'}} + +
+ +
+
+
+ + + +
+
+
+
+ + + + Buscar en todos los campos + + +
+
+
+
+ +
+ + + + Nombre + {{servicios.nombre}} + + + + Fecha + {{servicios.created_at}} + + + + + +     + + + + + + + +
No se encontraron registros.
+
Espera un momento....
+
+ +
+ + +
+
+ +
diff --git a/src/app/views/pages/catalogos/servicios/servicios-list/servicios-list.component.scss b/src/app/views/pages/catalogos/servicios/servicios-list/servicios-list.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/pages/catalogos/servicios/servicios-list/servicios-list.component.ts b/src/app/views/pages/catalogos/servicios/servicios-list/servicios-list.component.ts new file mode 100644 index 0000000..1b0d5d9 --- /dev/null +++ b/src/app/views/pages/catalogos/servicios/servicios-list/servicios-list.component.ts @@ -0,0 +1,143 @@ +import {AfterViewInit, ChangeDetectorRef, Component, OnInit} from '@angular/core'; +import {MatTableDataSource} from '@angular/material'; +import {ApiService} from '../../../../../core/api/api.service'; +import {ActivatedRoute, Router} from '@angular/router'; +import {LayoutUtilsService, MessageType} from '../../../../../core/_base/crud'; +import {Servicios} from '../servicios.model'; + +@Component({ + selector: 'kt-servicios-list', + templateUrl: './servicios-list.component.html', + styleUrls: ['./servicios-list.component.scss'] +}) +export class ServiciosListComponent implements OnInit { + + //Search + lastLength = 0; + typingTimer; + typingInterval = 700; + + displayedColumns: string[] = ['nombre', 'created_at', 'actions']; + dataSourceServicios: MatTableDataSource; + + //Loadings + isLoading = true; + showMessageWait = true; + + deleted_at = '0'; + + //Paginator, Searcher + searchText: string; + sortBy = 'nombre'; + order = 'asc'; + page = '1'; + perPage = '10'; + total = 0; + pages = [10, 25, 50, 100]; + titulo = 'Servicios'; + + constructor(private api: ApiService, + private router: Router, + private layoutUtilsService: LayoutUtilsService, + private activatedRoute: ActivatedRoute, + private ref: ChangeDetectorRef) { + this.dataSourceServicios = new MatTableDataSource(); + } + + ngOnInit() { + } + + toggle(event){ + this.deleted_at = event.checked == false ? '0' : '1'; + this.getServicios(); + } + + getServicios(){ + this.isLoading = true; + this.api.servicios.index(this.page, this.searchText, this.sortBy, this.order, this.perPage, null, this.deleted_at).subscribe(res =>{ + this.isLoading = false; + this.showMessageWait = false; + this.dataSourceServicios.data = res.data; + this.total = res.total; + this.ref.detectChanges(); + }, ()=>{ + this.isLoading = false; + this.showMessageWait = false; + }) + } + + //Search + filtrarBusqueda(filterValue: string) { + if (filterValue.length != 0) { + this.searchText = filterValue.trim().toLowerCase(); + this.getServicios(); + } else if (this.lastLength != 0) { + this.searchText = ''; + this.getServicios(); + } + + this.lastLength = filterValue.length; + } + + onKeyUp(ev) { + clearTimeout(this.typingTimer); + this.typingTimer = setTimeout(() => { + this.filtrarBusqueda(ev.target.value) + }, this.typingInterval); + } + + onKeyDown() { + this.showMessageWait = true; + this.dataSourceServicios.data = []; + clearTimeout(this.typingTimer); + }//Fin search + + editServicios(id) { + this.router.navigate(['../servicios/edit/', id], {relativeTo: this.activatedRoute}) + } + + deleteServicios(servicios) { + let title = (!servicios.deleted_at) ? 'Eliminar servicio' : 'Activar servicio'; + let name = (servicios.nombre)? servicios.nombre : ''; + let description = (!servicios.deleted_at) ? '¿Está seguro de eliminar el servicio ' + name + '?' : '¿Está seguro de activar el servicio ' + name + '?'; + let waitDesciption = (!servicios.deleted_at) ? 'Eliminando servicio...' : 'Activando servicio...'; + let deleteMessage = (!servicios.deleted_at) ? `El servicio ha sido eliminado con éxito`: `El servicio ha sido activado con éxito`; + let errorMessage = (!servicios.deleted_at) ? `El servicio no se ha podido eliminar` : `El servicio no se ha podido activar`; + let btnText = (!servicios.deleted_at) ? 'Eliminar' : 'Activar'; + + let dialogRef = this.layoutUtilsService.deleteElement(title, description, waitDesciption, btnText); + dialogRef.afterClosed().subscribe(res => { + if (!res) { + return; + } + + let reactivate = (servicios.deleted_at != null) + + this.api.servicios.delete(servicios.id, reactivate).subscribe(() => { + this.getServicios(); + this.layoutUtilsService.showActionNotification(deleteMessage, MessageType.Delete); + }, () => { + this.layoutUtilsService.showActionNotification(errorMessage, MessageType.Delete); + }); + }); + + } + + sort(event) { + this.order = event.direction; + this.sortBy = event.active; + this.getServicios(); + } + + paginator(event) { + let nextPage = event.pageIndex + 1; + this.page = nextPage.toString(); + this.perPage = event.pageSize.toString(); + this.getServicios(); + } + + ngAfterViewInit(): void { + this.getServicios(); + } + +} diff --git a/src/app/views/pages/catalogos/servicios/servicios.model.ts b/src/app/views/pages/catalogos/servicios/servicios.model.ts new file mode 100644 index 0000000..ace6e26 --- /dev/null +++ b/src/app/views/pages/catalogos/servicios/servicios.model.ts @@ -0,0 +1,5 @@ +export class Servicios { + id: number; + nombre: string; + created_at: string; +} diff --git a/src/app/views/pages/catalogos/servicios/servicios.service.ts b/src/app/views/pages/catalogos/servicios/servicios.service.ts new file mode 100644 index 0000000..b68df28 --- /dev/null +++ b/src/app/views/pages/catalogos/servicios/servicios.service.ts @@ -0,0 +1,13 @@ +import {Injectable} from '@angular/core'; +import {ResourceBase} from '../../../../core/api/resource'; +import {HttpClient} from '@angular/common/http'; + +@Injectable({ + providedIn: 'root' +}) +export class ServiciosService extends ResourceBase { + + constructor(public http: HttpClient) { + super(http, 'administrador/servicios'); + } +} diff --git a/src/app/views/pages/catalogos/sucursales/sucursales-edit/sucursales-edit.component.html b/src/app/views/pages/catalogos/sucursales/sucursales-edit/sucursales-edit.component.html new file mode 100644 index 0000000..d370e77 --- /dev/null +++ b/src/app/views/pages/catalogos/sucursales/sucursales-edit/sucursales-edit.component.html @@ -0,0 +1,219 @@ + + +
+ + + +
+
+ + + + + + Información básica + + + + +
+
+ +
+ Espera un momento.... +
+
+
+
+
+
+ + + Por favor introduce el + nombre + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+ +
+ + + Por favor introduce el + calle + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+ +
+ + + Por favor introduce el + número exterior + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+
+ +
+
+ + + Por favor introduce el + número interior + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+ +
+ + + Por favor introduce el + colonia + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+ +
+ + + Por favor introduce el + código postal + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+
+ +
+
+ + + Por favor introduce el + teléfono + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+ +
+ + + Por favor introduce el + gerente + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+ +
+ + + Por favor introduce el + encargado + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+
+
+
+
+
+
+ +
+
+
+
+
\ No newline at end of file diff --git a/src/app/views/pages/catalogos/sucursales/sucursales-edit/sucursales-edit.component.scss b/src/app/views/pages/catalogos/sucursales/sucursales-edit/sucursales-edit.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/pages/catalogos/sucursales/sucursales-edit/sucursales-edit.component.ts b/src/app/views/pages/catalogos/sucursales/sucursales-edit/sucursales-edit.component.ts new file mode 100644 index 0000000..e5413d9 --- /dev/null +++ b/src/app/views/pages/catalogos/sucursales/sucursales-edit/sucursales-edit.component.ts @@ -0,0 +1,132 @@ +import {ChangeDetectorRef, Component, OnInit} from '@angular/core'; +import {FormBuilder, FormGroup, Validators} from '@angular/forms'; +import {Subscription} from 'rxjs'; +import {ActivatedRoute, Router} from '@angular/router'; +import {LayoutUtilsService, MessageType} from '../../../../../core/_base/crud'; +import {ApiService} from '../../../../../core/api/api.service'; +import {Sucursales} from '../sucursales.model'; + +@Component({ + selector: 'kt-sucursales-edit', + templateUrl: './sucursales-edit.component.html', + styleUrls: ['./sucursales-edit.component.scss'] +}) +export class SucursalesEditComponent implements OnInit { +//SearchRols +typingTimerRol; +typingIntervalRol = 700; +searchTextRol: string = ''; +lastLengthRol = 0; +hidePassword = true; + +sucursalesForm: FormGroup; +selectedTab = 0; +subscriptions: Subscription[] = []; +isNewSucursal = false; +isLoading = true; +loading = false; +sucursalID = 0; + +constructor(private fb: FormBuilder, + private router: Router, + private layoutUtilsService: LayoutUtilsService, + private activatedRoute: ActivatedRoute, + private ref: ChangeDetectorRef, + private api: ApiService) { +} + +ngOnInit() { + this.crearFormulario(); +} + +getSucursales() { + let routeSubscription = this.activatedRoute.params.subscribe(params => { + this.sucursalID = params.id; + if (this.sucursalID && this.sucursalID > 0) { + this.isNewSucursal = false; + this.api.sucursales.show(this.sucursalID).subscribe(res => { + this.isLoading = false; + this.sucursalesForm.reset(res); + this.ref.detectChanges(); + }); + } else { + this.isNewSucursal = true; + this.isLoading = false; + this.ref.detectChanges(); + } + }); + this.subscriptions.push(routeSubscription); +} + +crearFormulario() { + this.sucursalesForm = this.fb.group({ + nombre: [null, [Validators.required, Validators.maxLength(128)]], + calle: [null, [Validators.required, Validators.maxLength(128)]], + num_ext: [null, [Validators.required, Validators.maxLength(128)]], + num_int: [null, [Validators.maxLength(128)]], + colonia: [null, [Validators.required, Validators.maxLength(128)]], + cp: [null, [Validators.required, Validators.maxLength(128)]], + telefono: [null, [Validators.required, Validators.maxLength(128)]], + gerente: [null, [Validators.required, Validators.maxLength(128)]], + encargado: [null, [Validators.required, Validators.maxLength(128)]], + }); } + +onSubmit() { + let controls = this.sucursalesForm.controls; + if (this.sucursalesForm.invalid) { + Object.keys(controls).forEach(controlName => { + controls[controlName].markAsTouched(); + }) + return; + } + + let sucursal : Sucursales = this.sucursalesForm.value as Sucursales; + + if (this.isNewSucursal) { + this.addSucursal(sucursal); + } else + this.updateSucursal(this.sucursalID, sucursal); +} + +addSucursal(sucursal) { + this.api.sucursales.create(sucursal).subscribe(() => { + this.loading = false; + this.layoutUtilsService.showActionNotification('Sucursal guardada con éxito.', MessageType.Create); + this.router.navigate(['../'], {relativeTo: this.activatedRoute}) + }, () => { + this.loading = false; + }); +} + +updateSucursal(id, sucursal) { + this.api.sucursales.update(id, sucursal).subscribe(() => { + this.loading = false; + this.layoutUtilsService.showActionNotification('Sucursal actualizada con éxito.', MessageType.Update); + this.router.navigate(['../../'], {relativeTo: this.activatedRoute}) + }, () => { + this.loading = false; + }); +} + +isControlValid(controlName: string): boolean { + let control = this.sucursalesForm.controls[controlName]; + if (!control) { + return false; + } else if (control.valid) { + return false; + } + return true; +} + +isControlHasError(controlName: string, validationType: string): boolean { + let control = this.sucursalesForm.controls[controlName]; + if (!control) { + return false; + } + return control.hasError(validationType) && (control.dirty || control.touched); +} + +ngAfterViewInit(): void { + this.getSucursales(); +} +} diff --git a/src/app/views/pages/catalogos/sucursales/sucursales-list/sucursales-list.component.html b/src/app/views/pages/catalogos/sucursales/sucursales-list/sucursales-list.component.html new file mode 100644 index 0000000..016d353 --- /dev/null +++ b/src/app/views/pages/catalogos/sucursales/sucursales-list/sucursales-list.component.html @@ -0,0 +1,94 @@ + + +
+
+
+ + + {{(deleted_at == '0') ? 'Mostrar eliminados' : 'Ocultar eliminados'}} + +
+ +
+
+
+ + + +
+
+
+
+ + + + Buscar en todos los campos + + +
+
+
+
+ +
+ + + + Nombre + {{sucursal.nombre}} + + + + Domicilio + {{sucursal.calle + ' #' + sucursal.num_ext + ', ' + sucursal.colonia + ' C.P.' + sucursal.cp}} + + + + Teléfono + {{sucursal.telefono}} + + + + Responsable/Gerente + {{sucursal.gerente}} + + + + Encargado/Mantenimiento + {{sucursal.encargado}} + + + + Fecha + {{sucursal.created_at}} + + + + + +     + + + + + + + +
No se encontraron registros.
+
Espera un momento....
+
+ +
+ + +
+
+ +
diff --git a/src/app/views/pages/catalogos/sucursales/sucursales-list/sucursales-list.component.scss b/src/app/views/pages/catalogos/sucursales/sucursales-list/sucursales-list.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/pages/catalogos/sucursales/sucursales-list/sucursales-list.component.ts b/src/app/views/pages/catalogos/sucursales/sucursales-list/sucursales-list.component.ts new file mode 100644 index 0000000..6edc50d --- /dev/null +++ b/src/app/views/pages/catalogos/sucursales/sucursales-list/sucursales-list.component.ts @@ -0,0 +1,142 @@ +import {AfterViewInit, ChangeDetectorRef, Component, OnInit} from '@angular/core'; +import {MatTableDataSource} from '@angular/material'; +import {ApiService} from '../../../../../core/api/api.service'; +import {ActivatedRoute, Router} from '@angular/router'; +import {LayoutUtilsService, MessageType} from '../../../../../core/_base/crud'; +import {Sucursales} from '../sucursales.model'; + +@Component({ + selector: 'kt-sucursales-list', + templateUrl: './sucursales-list.component.html', + styleUrls: ['./sucursales-list.component.scss'] +}) +export class SucursalesListComponent implements OnInit { + + //Search + lastLength = 0; + typingTimer; + typingInterval = 700; + + displayedColumns: string[] = ['nombre', 'domicilio', 'telefono', 'gerente', 'encargado', 'created_at', 'actions']; + dataSourceSucursales: MatTableDataSource; + + //Loadings + isLoading = true; + showMessageWait = true; + + deleted_at = '0'; + + //Paginator, Searcher + searchText: string; + sortBy = 'nombre'; + order = 'asc'; + page = '1'; + perPage = '10'; + total = 0; + pages = [10, 25, 50, 100]; + titulo = 'Sucursales'; + + constructor(private api: ApiService, + private router: Router, + private layoutUtilsService: LayoutUtilsService, + private activatedRoute: ActivatedRoute, + private ref: ChangeDetectorRef) { + this.dataSourceSucursales = new MatTableDataSource(); + } + + ngOnInit() { + } + + toggle(event){ + this.deleted_at = event.checked == false ? '0' : '1'; + this.getSucursales(); + } + + getSucursales(){ + this.isLoading = true; + this.api.sucursales.index(this.page, this.searchText, this.sortBy, this.order, this.perPage, null, this.deleted_at).subscribe(res =>{ + this.isLoading = false; + this.showMessageWait = false; + this.dataSourceSucursales.data = res.data; + this.total = res.total; + this.ref.detectChanges(); + }, ()=>{ + this.isLoading = false; + this.showMessageWait = false; + }) + } + + //Search + filtrarBusqueda(filterValue: string) { + if (filterValue.length != 0) { + this.searchText = filterValue.trim().toLowerCase(); + this.getSucursales(); + } else if (this.lastLength != 0) { + this.searchText = ''; + this.getSucursales(); + } + + this.lastLength = filterValue.length; + } + + onKeyUp(ev) { + clearTimeout(this.typingTimer); + this.typingTimer = setTimeout(() => { + this.filtrarBusqueda(ev.target.value) + }, this.typingInterval); + } + + onKeyDown() { + this.showMessageWait = true; + this.dataSourceSucursales.data = []; + clearTimeout(this.typingTimer); + }//Fin search + + editSucursal(id) { + this.router.navigate(['../sucursales/edit/', id], {relativeTo: this.activatedRoute}) + } + + deleteSucursal(sucursal) { + let title = (!sucursal.deleted_at) ? 'Eliminar sucursal' : 'Activar sucursal'; + let name = (sucursal.nombre) ? sucursal.nombre : ''; + let description = (!sucursal.deleted_at) ? '¿Está seguro de eliminar la sucursal ' + name + '?' : '¿Está seguro de activar la sucursal ' + name + '?'; + let waitDesciption = (!sucursal.deleted_at) ? 'Eliminando sucursal...' : 'Activando sucursal...'; + let deleteMessage = (!sucursal.deleted_at) ? `La sucursal ha sido eliminado con éxito` : `La sucursal ha sido activada con éxito`; + let errorMessage = (!sucursal.deleted_at) ? `La sucursal no se ha podido eliminar` : `La sucursal no se ha podido activar`; + let btnText = (!sucursal.deleted_at) ? 'Eliminar' : 'Activar'; + + let dialogRef = this.layoutUtilsService.deleteElement(title, description, waitDesciption, btnText); + dialogRef.afterClosed().subscribe(res => { + if (!res) { + return; + } + let reactivate = (sucursal.deleted_at != null); + + this.api.sucursales.delete(sucursal.id, reactivate).subscribe(() => { + this.getSucursales(); + this.layoutUtilsService.showActionNotification(deleteMessage, MessageType.Delete); + }, () => { + this.layoutUtilsService.showActionNotification(errorMessage, MessageType.Delete); + }); + }); + + } + + sort(event) { + this.order = event.direction; + this.sortBy = event.active; + this.getSucursales(); + } + + paginator(event) { + let nextPage = event.pageIndex + 1; + this.page = nextPage.toString(); + this.perPage = event.pageSize.toString(); + this.getSucursales(); + } + + ngAfterViewInit(): void { + this.getSucursales(); + } + +} diff --git a/src/app/views/pages/catalogos/sucursales/sucursales.model.ts b/src/app/views/pages/catalogos/sucursales/sucursales.model.ts new file mode 100644 index 0000000..dec85f1 --- /dev/null +++ b/src/app/views/pages/catalogos/sucursales/sucursales.model.ts @@ -0,0 +1,3 @@ +export class Sucursales { + id: number; +} diff --git a/src/app/views/pages/catalogos/sucursales/sucursales.service.ts b/src/app/views/pages/catalogos/sucursales/sucursales.service.ts new file mode 100644 index 0000000..60a3e33 --- /dev/null +++ b/src/app/views/pages/catalogos/sucursales/sucursales.service.ts @@ -0,0 +1,13 @@ +import {Injectable} from '@angular/core'; +import {ResourceBase} from '../../../../core/api/resource'; +import {HttpClient} from '@angular/common/http'; + +@Injectable({ + providedIn: 'root' +}) +export class SucursalesService extends ResourceBase { + + constructor(public http: HttpClient) { + super(http, 'administrador/sucursales'); + } +} diff --git a/src/app/views/pages/catalogos/tipos-servicio/tipos-servicio-edit/tipos-servicio-edit.component.html b/src/app/views/pages/catalogos/tipos-servicio/tipos-servicio-edit/tipos-servicio-edit.component.html new file mode 100644 index 0000000..a394626 --- /dev/null +++ b/src/app/views/pages/catalogos/tipos-servicio/tipos-servicio-edit/tipos-servicio-edit.component.html @@ -0,0 +1,71 @@ + + +
+ + + +
+
+ + + + + + Información básica + + + + +
+
+ +
+ Espera un momento.... +
+
+
+
+
+
+ + + Por favor introduce el + nombre + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+
+
+
+
+
+
+ +
+
+
+
+
diff --git a/src/app/views/pages/catalogos/tipos-servicio/tipos-servicio-edit/tipos-servicio-edit.component.scss b/src/app/views/pages/catalogos/tipos-servicio/tipos-servicio-edit/tipos-servicio-edit.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/pages/catalogos/tipos-servicio/tipos-servicio-edit/tipos-servicio-edit.component.ts b/src/app/views/pages/catalogos/tipos-servicio/tipos-servicio-edit/tipos-servicio-edit.component.ts new file mode 100644 index 0000000..c06b68a --- /dev/null +++ b/src/app/views/pages/catalogos/tipos-servicio/tipos-servicio-edit/tipos-servicio-edit.component.ts @@ -0,0 +1,126 @@ +import {ChangeDetectorRef, Component, OnInit} from '@angular/core'; +import {FormBuilder, FormGroup, Validators} from '@angular/forms'; +import {Subscription} from 'rxjs'; +import {ActivatedRoute, Router} from '@angular/router'; +import {LayoutUtilsService, MessageType} from '../../../../../core/_base/crud'; +import {ApiService} from '../../../../../core/api/api.service'; +import {TiposServicio} from '../tipos-servicio.model'; + +@Component({ + selector: 'kt-tipos-servicio-edit', + templateUrl: './tipos-servicio-edit.component.html', + styleUrls: ['./tipos-servicio-edit.component.scss'] +}) +export class TiposServicioEditComponent implements OnInit { + //SearchRols + typingTimerRol; + typingIntervalRol = 700; + searchTextRol: string = ''; + lastLengthRol = 0; + hidePassword = true; + + tiposServicioForm: FormGroup; + selectedTab = 0; + subscriptions: Subscription[] = []; + isNewTiposServicio = false; + isLoading = true; + loading = false; + tiposServicioID = 0; + + constructor(private fb: FormBuilder, + private router: Router, + private layoutUtilsService: LayoutUtilsService, + private activatedRoute: ActivatedRoute, + private ref: ChangeDetectorRef, + private api: ApiService) { + } + + ngOnInit() { + this.crearFormulario(); + } + + getTiposServicio() { + let routeSubscription = this.activatedRoute.params.subscribe(params => { + this.tiposServicioID = params.id; + if (this.tiposServicioID && this.tiposServicioID > 0) { + this.isNewTiposServicio = false; + this.api.tiposServicio.show(this.tiposServicioID).subscribe(res => { + this.isLoading = false; + this.tiposServicioForm.reset(res); + this.ref.detectChanges(); + }); + } else { + this.isNewTiposServicio = true; + this.isLoading = false; + this.ref.detectChanges(); + } + }); + this.subscriptions.push(routeSubscription); + } + + crearFormulario() { + this.tiposServicioForm = this.fb.group({ + nombre: [null, [Validators.required, Validators.maxLength(128)]], + zeros:[false] + }); } + + onSubmit() { + let controls = this.tiposServicioForm.controls; + if (this.tiposServicioForm.invalid) { + Object.keys(controls).forEach(controlName => { + controls[controlName].markAsTouched(); + }) + return; + } + + let tiposServicio : TiposServicio = this.tiposServicioForm.value as TiposServicio; + + if (this.isNewTiposServicio) { + this.addTiposServicio(tiposServicio); + } else + this.updateTiposServicio(this.tiposServicioID, tiposServicio); + } + + addTiposServicio(tiposServicio) { + this.api.tiposServicio.create(tiposServicio).subscribe(() => { + this.loading = false; + this.layoutUtilsService.showActionNotification('Tipo de servicio guardado con éxito.', MessageType.Create); + this.router.navigate(['../'], {relativeTo: this.activatedRoute}) + }, () => { + this.loading = false; + }); + } + + updateTiposServicio(id, tiposServicio) { + this.api.tiposServicio.update(id, tiposServicio).subscribe(() => { + this.loading = false; + this.layoutUtilsService.showActionNotification('Tipo de servicio actualizado con éxito.', MessageType.Update); + this.router.navigate(['../../'], {relativeTo: this.activatedRoute}) + }, () => { + this.loading = false; + }); + } + + isControlValid(controlName: string): boolean { + let control = this.tiposServicioForm.controls[controlName]; + if (!control) { + return false; + } else if (control.valid) { + return false; + } + return true; + } + + isControlHasError(controlName: string, validationType: string): boolean { + let control = this.tiposServicioForm.controls[controlName]; + if (!control) { + return false; + } + return control.hasError(validationType) && (control.dirty || control.touched); + } + + ngAfterViewInit(): void { + this.getTiposServicio(); + } + +} diff --git a/src/app/views/pages/catalogos/tipos-servicio/tipos-servicio-list/tipos-servicio-list.component.html b/src/app/views/pages/catalogos/tipos-servicio/tipos-servicio-list/tipos-servicio-list.component.html new file mode 100644 index 0000000..3e638e0 --- /dev/null +++ b/src/app/views/pages/catalogos/tipos-servicio/tipos-servicio-list/tipos-servicio-list.component.html @@ -0,0 +1,74 @@ + + +
+
+
+ + + {{(deleted_at == '0') ? 'Mostrar eliminados' : 'Ocultar eliminados'}} + +
+ +
+
+
+ + + +
+
+
+
+ + + + Buscar en todos los campos + + +
+
+
+
+ +
+ + + + Nombre + {{tipos_servicio.nombre}} + + + + Fecha + {{tipos_servicio.created_at}} + + + + + +     + + + + + + + +
No se encontraron registros.
+
Espera un momento....
+
+ +
+ + +
+
+ +
diff --git a/src/app/views/pages/catalogos/tipos-servicio/tipos-servicio-list/tipos-servicio-list.component.scss b/src/app/views/pages/catalogos/tipos-servicio/tipos-servicio-list/tipos-servicio-list.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/pages/catalogos/tipos-servicio/tipos-servicio-list/tipos-servicio-list.component.ts b/src/app/views/pages/catalogos/tipos-servicio/tipos-servicio-list/tipos-servicio-list.component.ts new file mode 100644 index 0000000..85aa0ca --- /dev/null +++ b/src/app/views/pages/catalogos/tipos-servicio/tipos-servicio-list/tipos-servicio-list.component.ts @@ -0,0 +1,143 @@ +import {AfterViewInit, ChangeDetectorRef, Component, OnInit} from '@angular/core'; +import {MatTableDataSource} from '@angular/material'; +import {ApiService} from '../../../../../core/api/api.service'; +import {ActivatedRoute, Router} from '@angular/router'; +import {LayoutUtilsService, MessageType} from '../../../../../core/_base/crud'; +import {TiposServicio} from '../tipos-servicio.model'; + +@Component({ + selector: 'kt-tipos-servicio-list', + templateUrl: './tipos-servicio-list.component.html', + styleUrls: ['./tipos-servicio-list.component.scss'] +}) +export class TiposServicioListComponent implements OnInit { + + //Search + lastLength = 0; + typingTimer; + typingInterval = 700; + + displayedColumns: string[] = ['nombre', 'created_at', 'actions']; + dataSourceTiposServicio: MatTableDataSource; + + //Loadings + isLoading = true; + showMessageWait = true; + + deleted_at = '0'; + + //Paginator, Searcher + searchText: string; + sortBy = 'nombre'; + order = 'asc'; + page = '1'; + perPage = '10'; + total = 0; + pages = [10, 25, 50, 100]; + titulo = 'Tipos Servicios'; + + constructor(private api: ApiService, + private router: Router, + private layoutUtilsService: LayoutUtilsService, + private activatedRoute: ActivatedRoute, + private ref: ChangeDetectorRef) { + this.dataSourceTiposServicio = new MatTableDataSource(); + } + + ngOnInit() { + } + +toggle(event){ + this.deleted_at = event.checked == false ? '0' : '1'; + this.getTiposServicio(); +} + + getTiposServicio(){ + this.isLoading = true; + this.api.tiposServicio.index(this.page, this.searchText, this.sortBy, this.order, this.perPage, null, this.deleted_at).subscribe(res =>{ + this.isLoading = false; + this.showMessageWait = false; + this.dataSourceTiposServicio.data = res.data; + this.total = res.total; + this.ref.detectChanges(); + }, ()=>{ + this.isLoading = false; + this.showMessageWait = false; + }) + } + + //Search + filtrarBusqueda(filterValue: string) { + if (filterValue.length != 0) { + this.searchText = filterValue.trim().toLowerCase(); + this.getTiposServicio(); + } else if (this.lastLength != 0) { + this.searchText = ''; + this.getTiposServicio(); + } + + this.lastLength = filterValue.length; + } + + onKeyUp(ev) { + clearTimeout(this.typingTimer); + this.typingTimer = setTimeout(() => { + this.filtrarBusqueda(ev.target.value) + }, this.typingInterval); + } + + onKeyDown() { + this.showMessageWait = true; + this.dataSourceTiposServicio.data = []; + clearTimeout(this.typingTimer); + }//Fin search + + editTiposServicio(id) { + this.router.navigate(['../tipos-servicio/edit/', id], {relativeTo: this.activatedRoute}) + } + + deleteTiposServicio(tiposServicio) { + let title = (!tiposServicio.deleted_at) ? 'Eliminar tipo de servicio' : 'Activar tipo de servicio' ; + let name = (tiposServicio.nombre)? tiposServicio.nombre : ''; + let description = (!tiposServicio.deleted_at) ? '¿Está seguro de eliminar el tipo de servicio ' + name + '?' : '¿Está seguro de activar el tipo de servicio ' + name + '?'; + let waitDesciption = (!tiposServicio.deleted_at) ? 'Eliminando tipo de servicio...' : 'Activando tipo de servicio...'; + let deleteMessage = (!tiposServicio.deleted_at) ? `El tipo de servicio ha sido eliminado con éxito` : `El tipo de servicio ha sido activado con éxito`; + let errorMessage = (!tiposServicio.deleted_at) ? `El tipo de servicio no se ha podido eliminar` : `El tipo de servicio no se ha podido activar`; + let btnText = (!tiposServicio.deleted_at) ? 'Eliminar' : 'Activar'; + + let dialogRef = this.layoutUtilsService.deleteElement(title, description, waitDesciption, btnText); + dialogRef.afterClosed().subscribe(res => { + if (!res) { + return; + } + + let reactivate = (tiposServicio.deleted_at != null) + + this.api.tiposServicio.delete(tiposServicio.id, reactivate).subscribe(() => { + this.getTiposServicio(); + this.layoutUtilsService.showActionNotification(deleteMessage, MessageType.Delete); + }, () => { + this.layoutUtilsService.showActionNotification(errorMessage, MessageType.Delete); + }); + }); + + } + + sort(event) { + this.order = event.direction; + this.sortBy = event.active; + this.getTiposServicio(); + } + + paginator(event) { + let nextPage = event.pageIndex + 1; + this.page = nextPage.toString(); + this.perPage = event.pageSize.toString(); + this.getTiposServicio(); + } + + ngAfterViewInit(): void { + this.getTiposServicio(); + } + +} diff --git a/src/app/views/pages/catalogos/tipos-servicio/tipos-servicio.model.ts b/src/app/views/pages/catalogos/tipos-servicio/tipos-servicio.model.ts new file mode 100644 index 0000000..a1c1d76 --- /dev/null +++ b/src/app/views/pages/catalogos/tipos-servicio/tipos-servicio.model.ts @@ -0,0 +1,5 @@ +export class TiposServicio { + id: number; + nombre: string; + created_at: string; +} diff --git a/src/app/views/pages/catalogos/tipos-servicio/tipos-servicio.service.ts b/src/app/views/pages/catalogos/tipos-servicio/tipos-servicio.service.ts new file mode 100644 index 0000000..05638dc --- /dev/null +++ b/src/app/views/pages/catalogos/tipos-servicio/tipos-servicio.service.ts @@ -0,0 +1,13 @@ +import {Injectable} from '@angular/core'; +import {ResourceBase} from '../../../../core/api/resource'; +import {HttpClient} from '@angular/common/http'; + +@Injectable({ + providedIn: 'root' +}) +export class TiposServicioService extends ResourceBase { + + constructor(public http: HttpClient) { + super(http, 'administrador/tipos_servicios'); + } +} diff --git a/src/app/views/pages/catalogos/tipos-vehiculo/tipos-vehiculo-edit/tipos-vehiculo-edit.component.html b/src/app/views/pages/catalogos/tipos-vehiculo/tipos-vehiculo-edit/tipos-vehiculo-edit.component.html new file mode 100644 index 0000000..bb65b65 --- /dev/null +++ b/src/app/views/pages/catalogos/tipos-vehiculo/tipos-vehiculo-edit/tipos-vehiculo-edit.component.html @@ -0,0 +1,88 @@ + + +
+ + + +
+
+ + + + + + Información básica + + + + +
+
+ +
+ Espera un momento.... +
+
+
+
+
+
+ + + Por favor introduce el + nombre + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+
+ + + Por favor introduce el + objetivo mensual + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+
+
+
+
+
+
+ +
+
+
+
+
\ No newline at end of file diff --git a/src/app/views/pages/catalogos/tipos-vehiculo/tipos-vehiculo-edit/tipos-vehiculo-edit.component.scss b/src/app/views/pages/catalogos/tipos-vehiculo/tipos-vehiculo-edit/tipos-vehiculo-edit.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/pages/catalogos/tipos-vehiculo/tipos-vehiculo-edit/tipos-vehiculo-edit.component.ts b/src/app/views/pages/catalogos/tipos-vehiculo/tipos-vehiculo-edit/tipos-vehiculo-edit.component.ts new file mode 100644 index 0000000..3febbb8 --- /dev/null +++ b/src/app/views/pages/catalogos/tipos-vehiculo/tipos-vehiculo-edit/tipos-vehiculo-edit.component.ts @@ -0,0 +1,127 @@ +import {ChangeDetectorRef, Component, OnInit} from '@angular/core'; +import {FormBuilder, FormGroup, Validators} from '@angular/forms'; +import {Subscription} from 'rxjs'; +import {ActivatedRoute, Router} from '@angular/router'; +import {LayoutUtilsService, MessageType} from '../../../../../core/_base/crud'; +import {ApiService} from '../../../../../core/api/api.service'; +import {TiposVehiculo} from '../tipos-vehiculo.model'; + +@Component({ + selector: 'kt-tipos-vehiculo-edit', + templateUrl: './tipos-vehiculo-edit.component.html', + styleUrls: ['./tipos-vehiculo-edit.component.scss'] +}) +export class TiposVehiculoEditComponent implements OnInit { + + //SearchRols + typingTimerRol; + typingIntervalRol = 700; + searchTextRol: string = ''; + lastLengthRol = 0; + hidePassword = true; + + tiposVehiculoForm: FormGroup; + selectedTab = 0; + subscriptions: Subscription[] = []; + isNewTiposVehiculo = false; + isLoading = true; + loading = false; + tiposVehiculoID = 0; + + constructor(private fb: FormBuilder, + private router: Router, + private layoutUtilsService: LayoutUtilsService, + private activatedRoute: ActivatedRoute, + private ref: ChangeDetectorRef, + private api: ApiService) { + } + + ngOnInit() { + this.crearFormulario(); + } + + getTiposVehiculo() { + let routeSubscription = this.activatedRoute.params.subscribe(params => { + this.tiposVehiculoID = params.id; + if (this.tiposVehiculoID && this.tiposVehiculoID > 0) { + this.isNewTiposVehiculo = false; + this.api.tiposVehiculos.show(this.tiposVehiculoID).subscribe(res => { + this.isLoading = false; + this.tiposVehiculoForm.reset(res); + this.ref.detectChanges(); + }); + } else { + this.isNewTiposVehiculo = true; + this.isLoading = false; + this.ref.detectChanges(); + } + }); + this.subscriptions.push(routeSubscription); + } + + crearFormulario() { + this.tiposVehiculoForm = this.fb.group({ + nombre: [null, [Validators.required, Validators.maxLength(128)]], + objetivo_mensual: [null, [Validators.maxLength(128), Validators.pattern("^[0-9]*$"), Validators.minLength(1), Validators.maxLength(10)]], + }); + } + + onSubmit() { + let controls = this.tiposVehiculoForm.controls; + if (this.tiposVehiculoForm.invalid) { + Object.keys(controls).forEach(controlName => { + controls[controlName].markAsTouched(); + }) + return; + } + + let tiposVehiculo : TiposVehiculo = this.tiposVehiculoForm.value as TiposVehiculo; + + if (this.isNewTiposVehiculo) { + this.addTiposVehiculo(tiposVehiculo); + } else + this.updateTiposVehiculo(this.tiposVehiculoID, tiposVehiculo); + } + + addTiposVehiculo(formaPago) { + this.api.tiposVehiculos.create(formaPago).subscribe(() => { + this.loading = false; + this.layoutUtilsService.showActionNotification('Tipo de vehículo guardado con éxito.', MessageType.Create); + this.router.navigate(['../'], {relativeTo: this.activatedRoute}) + }, () => { + this.loading = false; + }); + } + + updateTiposVehiculo(id, tiposVehiculo) { + this.api.tiposVehiculos.update(id, tiposVehiculo).subscribe(() => { + this.loading = false; + this.layoutUtilsService.showActionNotification('Tipo de vehículo actualizado con éxito.', MessageType.Update); + this.router.navigate(['../../'], {relativeTo: this.activatedRoute}) + }, () => { + this.loading = false; + }); + } + + isControlValid(controlName: string): boolean { + let control = this.tiposVehiculoForm.controls[controlName]; + if (!control) { + return false; + } else if (control.valid) { + return false; + } + return true; + } + + isControlHasError(controlName: string, validationType: string): boolean { + let control = this.tiposVehiculoForm.controls[controlName]; + if (!control) { + return false; + } + return control.hasError(validationType) && (control.dirty || control.touched); + } + + ngAfterViewInit(): void { + this.getTiposVehiculo(); + } +} diff --git a/src/app/views/pages/catalogos/tipos-vehiculo/tipos-vehiculo-list/tipos-vehiculo-list.component.html b/src/app/views/pages/catalogos/tipos-vehiculo/tipos-vehiculo-list/tipos-vehiculo-list.component.html new file mode 100644 index 0000000..76e3518 --- /dev/null +++ b/src/app/views/pages/catalogos/tipos-vehiculo/tipos-vehiculo-list/tipos-vehiculo-list.component.html @@ -0,0 +1,71 @@ + + +
+ +
+
+ + + +
+
+
+
+ + + + Buscar en todos los campos + + +
+
+
+
+ +
+ + + + Nombre + {{tipos_vehiculos.nombre}} + + + + Objetivo mensual + {{tipos_vehiculos.objetivo_mensual}} + + + + Fecha + {{tipos_vehiculos.created_at}} + + + + + +     + + + + + + + +
No se encontraron registros.
+
Espera un momento....
+
+ +
+ + +
+
+ +
diff --git a/src/app/views/pages/catalogos/tipos-vehiculo/tipos-vehiculo-list/tipos-vehiculo-list.component.scss b/src/app/views/pages/catalogos/tipos-vehiculo/tipos-vehiculo-list/tipos-vehiculo-list.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/pages/catalogos/tipos-vehiculo/tipos-vehiculo-list/tipos-vehiculo-list.component.ts b/src/app/views/pages/catalogos/tipos-vehiculo/tipos-vehiculo-list/tipos-vehiculo-list.component.ts new file mode 100644 index 0000000..33eefa9 --- /dev/null +++ b/src/app/views/pages/catalogos/tipos-vehiculo/tipos-vehiculo-list/tipos-vehiculo-list.component.ts @@ -0,0 +1,130 @@ +import {AfterViewInit, ChangeDetectorRef, Component, OnInit} from '@angular/core'; +import {MatTableDataSource} from '@angular/material'; +import {ApiService} from '../../../../../core/api/api.service'; +import {ActivatedRoute, Router} from '@angular/router'; +import {LayoutUtilsService, MessageType} from '../../../../../core/_base/crud'; +import {TiposVehiculo} from '../tipos-vehiculo.model'; + +@Component({ + selector: 'kt-tipos-vehiculo-list', + templateUrl: './tipos-vehiculo-list.component.html', + styleUrls: ['./tipos-vehiculo-list.component.scss'] +}) +export class TiposVehiculoListComponent implements OnInit { + //Search + lastLength = 0; + typingTimer; + typingInterval = 700; + + displayedColumns: string[] = ['nombre', 'objetivo_mensual', 'created_at', 'actions']; + dataSourceTiposVehiculo: MatTableDataSource; + + //Loadings + isLoading = true; + showMessageWait = true; + + //Paginator, Searcher + searchText: string; + sortBy = 'nombre'; + order = 'asc'; + page = '1'; + perPage = '10'; + total = 0; + pages = [10, 25, 50, 100]; + titulo = 'Tipos de Vehículo'; + + constructor(private api: ApiService, + private router: Router, + private layoutUtilsService: LayoutUtilsService, + private activatedRoute: ActivatedRoute, + private ref: ChangeDetectorRef) { + this.dataSourceTiposVehiculo = new MatTableDataSource(); + } + + ngOnInit() { + } + + getTiposVehiculo(){ + this.isLoading = true; + this.api.tiposVehiculos.index(this.page, this.searchText, this.sortBy, this.order, this.perPage).subscribe(res =>{ + this.isLoading = false; + this.showMessageWait = false; + this.dataSourceTiposVehiculo.data = res.data; + this.total = res.total; + this.ref.detectChanges(); + }, ()=>{ + this.isLoading = false; + this.showMessageWait = false; + }) + } + + //Search + filtrarBusqueda(filterValue: string) { + if (filterValue.length != 0) { + this.searchText = filterValue.trim().toLowerCase(); + this.getTiposVehiculo(); + } else if (this.lastLength != 0) { + this.searchText = ''; + this.getTiposVehiculo(); + } + + this.lastLength = filterValue.length; + } + + onKeyUp(ev) { + clearTimeout(this.typingTimer); + this.typingTimer = setTimeout(() => { + this.filtrarBusqueda(ev.target.value) + }, this.typingInterval); + } + + onKeyDown() { + this.showMessageWait = true; + this.dataSourceTiposVehiculo.data = []; + clearTimeout(this.typingTimer); + }//Fin search + + editTiposVehiculo(id) { + this.router.navigate(['../tipos-vehiculo/edit/', id], {relativeTo: this.activatedRoute}) + } + + deleteTiposVehiculo(tiposVehiculo) { + let title = 'Eliminar tipo de vehículo'; + let name = (tiposVehiculo.nombre)? tiposVehiculo.nombre : ''; + let description = '¿Está seguro de eliminar el tipo de vehículo ' + name + '?'; + let waitDesciption = 'Eliminando tipo de vehículo...'; + let deleteMessage = `El tipo de vehículo ha sido eliminado con éxito`; + let errorMessage = `El tipo de vehículo no se ha podido eliminar`; + + let dialogRef = this.layoutUtilsService.deleteElement(title, description, waitDesciption); + dialogRef.afterClosed().subscribe(res => { + if (!res) { + return; + } + this.api.tiposVehiculos.delete(tiposVehiculo.id).subscribe(() => { + this.getTiposVehiculo(); + this.layoutUtilsService.showActionNotification(deleteMessage, MessageType.Delete); + }, () => { + this.layoutUtilsService.showActionNotification(errorMessage, MessageType.Delete); + }); + }); + + } + + sort(event) { + this.order = event.direction; + this.sortBy = event.active; + this.getTiposVehiculo(); + } + + paginator(event) { + let nextPage = event.pageIndex + 1; + this.page = nextPage.toString(); + this.perPage = event.pageSize.toString(); + this.getTiposVehiculo(); + } + + ngAfterViewInit(): void { + this.getTiposVehiculo(); + } +} diff --git a/src/app/views/pages/catalogos/tipos-vehiculo/tipos-vehiculo.model.ts b/src/app/views/pages/catalogos/tipos-vehiculo/tipos-vehiculo.model.ts new file mode 100644 index 0000000..29910fc --- /dev/null +++ b/src/app/views/pages/catalogos/tipos-vehiculo/tipos-vehiculo.model.ts @@ -0,0 +1,6 @@ +export class TiposVehiculo { + id: number; + nombre: string; + objetivo_mensual: number; + created_at: string; +} diff --git a/src/app/views/pages/catalogos/tipos-vehiculo/tipos-vehiculo.service.ts b/src/app/views/pages/catalogos/tipos-vehiculo/tipos-vehiculo.service.ts new file mode 100644 index 0000000..68583bb --- /dev/null +++ b/src/app/views/pages/catalogos/tipos-vehiculo/tipos-vehiculo.service.ts @@ -0,0 +1,13 @@ +import {Injectable} from '@angular/core'; +import {ResourceBase} from '../../../../core/api/resource'; +import {HttpClient} from '@angular/common/http'; + +@Injectable({ + providedIn: 'root' +}) +export class TiposVehiculoService extends ResourceBase { + + constructor(public http: HttpClient) { + super(http, 'administrador/tipos_vehiculos'); + } +} diff --git a/src/app/views/pages/catalogos/usuarios/models/filtros-usuarios-response.model.ts b/src/app/views/pages/catalogos/usuarios/models/filtros-usuarios-response.model.ts new file mode 100644 index 0000000..6f80dd9 --- /dev/null +++ b/src/app/views/pages/catalogos/usuarios/models/filtros-usuarios-response.model.ts @@ -0,0 +1,5 @@ +export class FiltrosUsuariosResponseModel { + sucursales: any; + tipos_empleados: any; + roles: any; +} diff --git a/src/app/views/pages/catalogos/usuarios/usuarios-edit/usuarios-edit.component.html b/src/app/views/pages/catalogos/usuarios/usuarios-edit/usuarios-edit.component.html new file mode 100644 index 0000000..31e83ad --- /dev/null +++ b/src/app/views/pages/catalogos/usuarios/usuarios-edit/usuarios-edit.component.html @@ -0,0 +1,238 @@ + + +
+ + + +
+
+ + + + + + Información básica + + + + +
+
+ +
+ Espera un momento.... +
+
+
+
+
+
+ + + Por favor introduce el + nombre + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+ +
+ + + Por favor introduce los + apellido paterno + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+ +
+ + + Por favor introduce los + apellido materno + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+ +
+ + + Por favor introduce el + el usuario + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + + Correo inválido, ej. correo@mail.com + + +
+ +
+ + + Por favor introduce el + el teléfono + + + Datos correctos + + + El campo es requerido + + + Debe contener mínimo 10 caracteres + + + Debe contener máximo 10 caracteres + + +
+
+ +
+
+ + + {{hidePassword ? 'visibility_off' : 'visibility'}} + Por favor introduce la + contraseña + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + + Debe contener mínimo 5 caracteres + + +
+
+ + + {{hidePassword ? 'visibility_off' : 'visibility'}} + Por favor confirma la + contraseña + + + Datos correctos + + + El campo es requerido + + + Debes introducir al menos 3 caracteres + + + El límite es de 128 caracteres + + + Las contraseñas no coinciden + + +
+
+ +
+
+ + + + {{rol.name}} + + + + El campo es requerido + + +
+ +
+ + + + {{sucursal.nombre}} + + + + El campo es requerido + + +
+ +
+ + + + {{tipo_empleado.nombre}} + + + + El campo es requerido + + +
+
+
+
+
+ +
+
+
+
+
diff --git a/src/app/views/pages/catalogos/usuarios/usuarios-edit/usuarios-edit.component.scss b/src/app/views/pages/catalogos/usuarios/usuarios-edit/usuarios-edit.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/pages/catalogos/usuarios/usuarios-edit/usuarios-edit.component.ts b/src/app/views/pages/catalogos/usuarios/usuarios-edit/usuarios-edit.component.ts new file mode 100644 index 0000000..6dab6d2 --- /dev/null +++ b/src/app/views/pages/catalogos/usuarios/usuarios-edit/usuarios-edit.component.ts @@ -0,0 +1,223 @@ +import {AfterViewInit, ChangeDetectorRef, Component, OnInit, ViewRef} from '@angular/core'; +import {FormBuilder, FormControl, FormGroup, Validators} from '@angular/forms'; +import {Subscription} from 'rxjs'; +import {ActivatedRoute, Router} from '@angular/router'; +import {LayoutUtilsService, MessageType} from '../../../../../core/_base/crud'; +import {ApiService} from '../../../../../core/api/api.service'; +import {MatTableDataSource} from '@angular/material'; +import {Usuario} from '../usuarios.model'; +import {ConfirmPasswordValidator} from '../../../../../../app/views/pages/auth/register/confirm-password.validator'; +import {FiltrosServiciosResponseModel} from '../../../servicios/models/filtros-servicios-response.model'; +import {FiltrosUsuariosResponseModel} from '../models/filtros-usuarios-response.model'; +import Utils from "../../../../../utils"; + +@Component({ + selector: 'kt-usuarios-edit', + templateUrl: './usuarios-edit.component.html', + styleUrls: ['./usuarios-edit.component.scss'] +}) +export class UsuariosEditComponent implements OnInit, AfterViewInit { + //SearchRols + typingTimerRol; + typingIntervalRol = 700; + searchTextRol: string = ''; + lastLengthRol = 0; + hidePassword = true; + sucursales; + tipos_empleados; + roles; + + dataSourceRoles: MatTableDataSource; + + usuarioForm: FormGroup; + selectedTab = 0; + subscriptions: Subscription[] = []; + isNewUsuario = false; + isLoading = true; + loading = false; + usuarioId = 0; + imagen; + rolesObj = []; + + constructor(private fb: FormBuilder, + private router: Router, + private layoutUtilsService: LayoutUtilsService, + private activatedRoute: ActivatedRoute, + private ref: ChangeDetectorRef, + private api: ApiService) { + this.dataSourceRoles = new MatTableDataSource(); + } + + ngOnInit() { + this.crearFormulario(); + this.getFiltros(); + } + + getUsuario() { + let routeSubscription = this.activatedRoute.params.subscribe(params => { + this.usuarioId = params.id; + if (this.usuarioId && this.usuarioId > 0) { + this.isNewUsuario = false; + this.api.usuarios.show(this.usuarioId).subscribe(res => { + this.isLoading = false; + this.usuarioForm.get('password').clearValidators(); + this.usuarioForm.get('confirmPassword').clearValidators(); + + res.role_id = Utils.toNumber(res.role_id); + res.sucursal_id = Utils.toNumber(res.sucursal_id); + res.tipo_empleado_id = Utils.toNumber(res.tipo_empleado_id); + + this.usuarioForm.reset(res); + this.dataSourceRoles.data = res.roles; + this.ref.detectChanges(); + }); + } else { + this.isNewUsuario = true; + this.isLoading = false; + this.ref.detectChanges(); + } + }); + this.subscriptions.push(routeSubscription); + } + + crearFormulario() { + this.usuarioForm = this.fb.group({ + nombre: [null, [Validators.required, Validators.maxLength(128)]], + apellido_paterno: [null, [Validators.required, Validators.maxLength(128)]], + apellido_materno: [null, [Validators.required, Validators.maxLength(128)]], + email: [null, [Validators.required, Validators.email, Validators.maxLength(128)]], + telefono: [null, [Validators.required, Validators.minLength(10), Validators.maxLength(10)]], + password: [null, [Validators.required, Validators.maxLength(128), Validators.minLength(5)]], + confirmPassword: [null, Validators.compose([Validators.required, Validators.minLength(5), Validators.maxLength(128)])], + sucursal_id: [null, [Validators.required]], + tipo_empleado_id: [null, [Validators.required]], + role_id: [null, [Validators.required]], + }, { + validator: ConfirmPasswordValidator.MatchPassword + }); } + + //Busqueda de articulos + onKeyUpRol(ev) { + clearTimeout(this.typingTimerRol); + this.typingTimerRol = setTimeout(() => { + this.filterRol(ev.target.value) + }, this.typingIntervalRol); + } + + onKeyDownRol() { + clearTimeout(this.typingTimerRol); + } + + filterRol(filterValue: string,) { + if (filterValue.length != 0) { + this.searchTextRol = filterValue.trim().toLowerCase(); + this.searchRol(); + } else if (this.lastLengthRol != 0) { + this.searchTextRol = ''; + this.searchRol(); + this.ref.detectChanges(); + } + + this.lastLengthRol = filterValue.length; + } + + searchRol() { + this.api.usuarios.getRoles('security/roles',this.searchTextRol).subscribe(res => { + this.rolesObj = res.data; + + setTimeout(() => { + if (this.ref && !(this.ref as ViewRef).destroyed) { + this.ref.detectChanges(); + } + }); + }) + + } + + getFiltros(){ + this.api.usuarios.filtrosUsuarios('filtros_usuarios').subscribe((res: FiltrosUsuariosResponseModel) => { + this.sucursales = res.sucursales; + this.tipos_empleados = res.tipos_empleados; + this.roles = res.roles; + this.ref.detectChanges(); + }) + }; + + onFilterSelect(article) { + let articles = this.dataSourceRoles.data; + let indice = articles.findIndex(articlee => articlee.id == article.id); + if (indice == -1) { + this.dataSourceRoles.data.push(article); + this.dataSourceRoles._updateChangeSubscription(); + } + this.usuarioForm.get('rol').setValue(''); + } + + deleteArtcle(article) { + let articles = this.dataSourceRoles.data; + let indice = articles.findIndex(articlee => articlee.id == article.id); + this.dataSourceRoles.data.splice(indice, 1); + this.dataSourceRoles._updateChangeSubscription(); + }// Fin busqueda de articulos + + onSubmit() { + let controls = this.usuarioForm.controls; + if (this.usuarioForm.invalid) { + Object.keys(controls).forEach(controlName => { + controls[controlName].markAsTouched(); + }) + return; + } + + let usuario : Usuario = this.usuarioForm.value as Usuario; + + usuario.roles = this.dataSourceRoles.data; + + if (this.isNewUsuario) { + this.addUsuario(usuario); + } else + this.updateUsuario(this.usuarioId, usuario); + } + + addUsuario(usuario) { + this.api.usuarios.create(usuario).subscribe(() => { + this.loading = false; + this.layoutUtilsService.showActionNotification('Usuario guardado con éxito.', MessageType.Create); + this.router.navigate(['../'], {relativeTo: this.activatedRoute}) + }, () => { + this.loading = false; + }); + } + + updateUsuario(id, usuario) { + this.api.usuarios.update(id, usuario).subscribe(() => { + this.loading = false; + this.layoutUtilsService.showActionNotification('Usuario actualizado con éxito.', MessageType.Update); + this.router.navigate(['../../'], {relativeTo: this.activatedRoute}) + }, () => { + this.loading = false; + }); + } + + isControlValid(controlName: string): boolean { + let control = this.usuarioForm.controls[controlName]; + if (!control) { + return false; + } else if (control.valid) { + return false; + } + return true; + } + + isControlHasError(controlName: string, validationType: string): boolean { + let control = this.usuarioForm.controls[controlName]; + if (!control) { + return false; + } + return control.hasError(validationType) && (control.dirty || control.touched); + } + + ngAfterViewInit(): void { + this.getUsuario(); + } +} diff --git a/src/app/views/pages/catalogos/usuarios/usuarios-list/usuarios-list.component.html b/src/app/views/pages/catalogos/usuarios/usuarios-list/usuarios-list.component.html new file mode 100644 index 0000000..113314e --- /dev/null +++ b/src/app/views/pages/catalogos/usuarios/usuarios-list/usuarios-list.component.html @@ -0,0 +1,99 @@ + + +
+
+
+ + + {{(deleted_at == '0') ? 'Mostrar eliminados' : 'Ocultar eliminados'}} + +
+ +
+
+
+ + + +
+
+
+
+ + + + Buscar en todos los campos + + +
+
+
+
+ +
+ + + + Nombre + {{usuario.nombre}} {{usuario.apellido_paterno}} {{usuario.apellido_materno}} + + + + Correo electrónico + {{usuario.email}} + + + + Teléfono + {{(usuario.telefono != null)? usuario.telefono : '-'}} + + + + Rol + {{usuario.role}} + + + + Tipo empleado + {{usuario.tipo_empleado}} + + + + Sucursal + {{usuario.sucursal}} + + + + Fecha + {{usuario.created_at}} + + + + + +     + + + + + + + +
No se encontraron registros.
+
Espera un momento....
+
+ +
+ + +
+
+ +
diff --git a/src/app/views/pages/catalogos/usuarios/usuarios-list/usuarios-list.component.scss b/src/app/views/pages/catalogos/usuarios/usuarios-list/usuarios-list.component.scss new file mode 100644 index 0000000..bada278 --- /dev/null +++ b/src/app/views/pages/catalogos/usuarios/usuarios-list/usuarios-list.component.scss @@ -0,0 +1,3 @@ +.mat-cell-users{ + font-size: 12pt !important; +} diff --git a/src/app/views/pages/catalogos/usuarios/usuarios-list/usuarios-list.component.ts b/src/app/views/pages/catalogos/usuarios/usuarios-list/usuarios-list.component.ts new file mode 100644 index 0000000..76a1d8e --- /dev/null +++ b/src/app/views/pages/catalogos/usuarios/usuarios-list/usuarios-list.component.ts @@ -0,0 +1,138 @@ +import {AfterViewInit, ChangeDetectorRef, Component, OnInit} from '@angular/core'; +import {MatTableDataSource} from '@angular/material'; +import {ApiService} from '../../../../../core/api/api.service'; +import {ActivatedRoute, Router} from '@angular/router'; +import {LayoutUtilsService, MessageType} from '../../../../../core/_base/crud'; +import {Usuario} from '../usuarios.model'; + +@Component({ + selector: 'kt-usuarios-list', + templateUrl: './usuarios-list.component.html', + styleUrls: ['./usuarios-list.component.scss'] +}) +export class UsuariosListComponent implements OnInit, AfterViewInit { + //Search + lastLength = 0; + typingTimer; + typingInterval = 700; + deleted_at = '0'; + + displayedColumns: string[] = ['nombre', 'email', 'telefono', 'role', 'tipo_empleado', 'sucursal', 'created_at', 'actions']; + dataSourceUsuario: MatTableDataSource; + + //Loadings + isLoading = true; + showMessageWait = true; + + //Paginator, Searcher + searchText: string; + sortBy = 'nombre'; + order = 'asc'; + page = '1'; + perPage = '10'; + total = 0; + pages = [10, 25, 50, 100]; + titulo = 'Usuarios'; + + constructor(private api: ApiService, + private router: Router, + private layoutUtilsService: LayoutUtilsService, + private activatedRoute: ActivatedRoute, + private ref: ChangeDetectorRef) { + this.dataSourceUsuario = new MatTableDataSource(); + } + + ngOnInit() { + } + + toggle(event){ + this.deleted_at = event.checked == false ? '0' : '1'; + this.getUsuarios(); + } + + getUsuarios(){ + this.isLoading = true; + this.api.usuarios.index(this.page, this.searchText, this.sortBy, this.order, this.perPage, null, this.deleted_at).subscribe(res =>{ + this.isLoading = false; + this.showMessageWait = false; + this.dataSourceUsuario.data = res.data; + this.total = res.total; + this.ref.detectChanges(); + }, ()=>{ + this.isLoading = false; + this.showMessageWait = false; + }) + } + + //Search + filtrarBusqueda(filterValue: string) { + if (filterValue.length != 0) { + this.searchText = filterValue.trim().toLowerCase(); + this.getUsuarios(); + } else if (this.lastLength != 0) { + this.searchText = ''; + this.getUsuarios(); + } + + this.lastLength = filterValue.length; + } + + onKeyUp(ev) { + clearTimeout(this.typingTimer); + this.typingTimer = setTimeout(() => { + this.filtrarBusqueda(ev.target.value) + }, this.typingInterval); + } + + onKeyDown() { + this.showMessageWait = true; + this.dataSourceUsuario.data = []; + clearTimeout(this.typingTimer); + }//Fin search + + editUsuario(id) { + this.router.navigate(['../usuarios/edit/', id], {relativeTo: this.activatedRoute}) + } + + deleteUsuario(usuario) { + let title = (!usuario.deleted_at) ? 'Eliminar usuario' : 'Activar usuario'; + let name = (usuario.first_name)? usuario.first_name : ''; + let description = (!usuario.deleted_at) ? '¿Está seguro de eliminar el usuario ' + name + '?' : '¿Está seguro de activar el usuario ' + name + '?' ; + let waitDesciption = (!usuario.deleted_at) ? 'Eliminando usuario...': 'Activando usuario...'; + let deleteMessage = (!usuario.deleted_at) ? `El usuario ha sido eliminado con éxito`: `El usuario ha sido activado con éxito`; + let errorMessage = (!usuario.deleted_at) ? `El usuario no se ha podido eliminar` : 'El usuario no se ha podido activar'; + let btnText = (!usuario.deleted_at) ? 'Eliminar' : 'Activar'; + + let dialogRef = this.layoutUtilsService.deleteElement(title, description, waitDesciption, btnText); + dialogRef.afterClosed().subscribe(res => { + if (!res) { + return; + } + let reactivate = (usuario.deleted_at != null) + this.api.usuarios.delete(usuario.id, reactivate).subscribe(() => { + this.getUsuarios(); + this.layoutUtilsService.showActionNotification(deleteMessage, MessageType.Delete); + }, () => { + this.layoutUtilsService.showActionNotification(errorMessage, MessageType.Delete); + }); + }); + + } + + sort(event) { + this.order = event.direction; + this.sortBy = event.active; + this.getUsuarios(); + } + + paginator(event) { + let nextPage = event.pageIndex + 1; + this.page = nextPage.toString(); + this.perPage = event.pageSize.toString(); + this.getUsuarios(); + } + + ngAfterViewInit(): void { + this.getUsuarios(); + } +} diff --git a/src/app/views/pages/catalogos/usuarios/usuarios.model.ts b/src/app/views/pages/catalogos/usuarios/usuarios.model.ts new file mode 100644 index 0000000..f045884 --- /dev/null +++ b/src/app/views/pages/catalogos/usuarios/usuarios.model.ts @@ -0,0 +1,24 @@ +export class Usuario { + id: number; + email: string; + nombre: string; + apellido_paterno: string; + apellido_materno: string; + telefono: string; + sucursal_id: number; + solicitar: boolean; + tipo_empleado_id: number; + permissions: any; + permiso_especial: boolean; + token_firebase: string; + dispositivo_id: string; + last_login: string; + created_at: string; + updated_at: string; + deleted_at: string; + role: string; + role_id: number; + tipo_empleado: string; + sucursal: string; + roles: any; +} diff --git a/src/app/views/pages/catalogos/usuarios/usuarios.service.ts b/src/app/views/pages/catalogos/usuarios/usuarios.service.ts new file mode 100644 index 0000000..d3be3fb --- /dev/null +++ b/src/app/views/pages/catalogos/usuarios/usuarios.service.ts @@ -0,0 +1,36 @@ +import {Injectable} from '@angular/core'; +import {ResourceBase} from '../../../../core/api/resource'; +import {HttpClient, HttpParams} from '@angular/common/http'; +import {Observable} from 'rxjs'; +import {catchError} from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root' +}) +export class UsuariosService extends ResourceBase { + + constructor(public http: HttpClient) { + super(http, 'administrador/usuarios'); + } + + public getRoles(url, searchText): Observable{ + let params = new HttpParams() + .set('perPage', '10') + .set('visible', '1') + .set('deleted_at', '1') + .set('query', (searchText) ? searchText : ''); + + let options = {params: params}; + return this.http.get(this.baseUrl + url, options).pipe( + catchError(this.handleError('index')) + ); + } + + public filtrosUsuarios(url: string){ + return this.http.get(this.baseUrl + 'administrador/usuarios/' + url).pipe(catchError(this.handleError('index'))); + } + + public getRolesUsuarios(url: string){ + return this.http.get(this.baseUrl + 'administrador/usuarios/' + url).pipe(catchError(this.handleError('index'))); + } +} diff --git a/src/app/views/pages/catalogos/vehiculos/vehiculos-edit/vehiculos-edit.component.html b/src/app/views/pages/catalogos/vehiculos/vehiculos-edit/vehiculos-edit.component.html new file mode 100644 index 0000000..de1ce02 --- /dev/null +++ b/src/app/views/pages/catalogos/vehiculos/vehiculos-edit/vehiculos-edit.component.html @@ -0,0 +1,122 @@ + + +
+ + + +
+
+ + + + + + Información básica + + + + +
+
+ +
+ Espera un momento.... +
+
+
+
+
+
+ + + Por favor introduce el + Número económico + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+
+ + + Por favor introduce el + Descripción + + + Datos correctos + + + El campo es requerido + + + Debe contener máximo 128 caracteres + + +
+
+ +
+
+ + + + + + + {{sucursal.nombre}} + + + + El campo es requerido + + +
+ +
+ + + + + + + {{tipo_vehiculo.nombre}} + + + + El campo es requerido + + +
+
+
+
+
+
+
+ +
+
+
+
+
diff --git a/src/app/views/pages/catalogos/vehiculos/vehiculos-edit/vehiculos-edit.component.scss b/src/app/views/pages/catalogos/vehiculos/vehiculos-edit/vehiculos-edit.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/pages/catalogos/vehiculos/vehiculos-edit/vehiculos-edit.component.ts b/src/app/views/pages/catalogos/vehiculos/vehiculos-edit/vehiculos-edit.component.ts new file mode 100644 index 0000000..570edc1 --- /dev/null +++ b/src/app/views/pages/catalogos/vehiculos/vehiculos-edit/vehiculos-edit.component.ts @@ -0,0 +1,248 @@ +import {ChangeDetectorRef, Component, OnInit} from '@angular/core'; +import {FormBuilder, FormGroup, Validators} from '@angular/forms'; +import {ReplaySubject, Subscription} from 'rxjs'; +import {ActivatedRoute, Router} from '@angular/router'; +import {LayoutUtilsService, MessageType} from '../../../../../core/_base/crud'; +import {ApiService} from '../../../../../core/api/api.service'; +import {Vehiculos} from '../vehiculos.model'; +import {MatTableDataSource} from '@angular/material'; +import Utils from '../../../../../utils'; + +@Component({ + selector: 'kt-vehiculos-edit', + templateUrl: './vehiculos-edit.component.html', + styleUrls: ['./vehiculos-edit.component.scss'] +}) +export class VehiculosEditComponent implements OnInit { + + //Search + typingTimer; + typingInterval = 700; + + dataSourceTiposVehiculos: MatTableDataSource; + + vehiculosForm: FormGroup; + selectedTab = 0; + subscriptions: Subscription[] = []; + isNewVehiculo = false; + isLoading = true; + loading = false; + vehiculoID = 0; + recently = true; + isLoadingInputSearch = true; + + filteredSucursales: ReplaySubject = new ReplaySubject(1); + sucursales = []; + + filteredTiposVehiculos: ReplaySubject = new ReplaySubject(1); + tipos_vehiculos = []; + + constructor(private fb: FormBuilder, + private router: Router, + private layoutUtilsService: LayoutUtilsService, + private activatedRoute: ActivatedRoute, + private ref: ChangeDetectorRef, + private api: ApiService) { + this.dataSourceTiposVehiculos = new MatTableDataSource(); + } + + ngOnInit() { + this.crearFormulario(); + this.getTiposVehiculos(); + this.getSucursales(); + } + + getVehiculo() { + let routeSubscription = this.activatedRoute.params.subscribe(params => { + this.vehiculoID = params.id; + if (this.vehiculoID && this.vehiculoID > 0) { + this.isNewVehiculo = false; + this.api.vehiculos.show(this.vehiculoID).subscribe(res => { + this.isLoading = false; + if(res.sucursales.length > 0){ + res.sucursal_id = Utils.toNumber(res.sucursales[0].sucursal_id); + } + res.tipo_vehiculo_id = Utils.toNumber(res.tipo_vehiculo_id); + + this.vehiculosForm.reset(res); + this.ref.detectChanges(); + }); + } else { + this.isNewVehiculo = true; + this.isLoading = false; + this.ref.detectChanges(); + } + }); + this.subscriptions.push(routeSubscription); + } + + crearFormulario() { + this.vehiculosForm = this.fb.group({ + num_economico: [null, [Validators.required, Validators.maxLength(128)]], + descripcion: [null, [Validators.required, Validators.maxLength(128)]], + tipo_vehiculo_id: [null, [Validators.required, Validators.maxLength(128)]], + sucursal_id: [null, [Validators.required, Validators.maxLength(128)]], + searchSucursal: [''], + searchTipoVehiculo: [''], + }); + } + + onSubmit() { + let controls = this.vehiculosForm.controls; + let sucursalesArray = []; + + if (this.vehiculosForm.invalid) { + Object.keys(controls).forEach(controlName => { + controls[controlName].markAsTouched(); + }) + return; + } + + let vehiculo : Vehiculos = this.vehiculosForm.value as Vehiculos; + + sucursalesArray.push(this.vehiculosForm.value['sucursal_id']); + vehiculo.sucursales = sucursalesArray; + + if (this.isNewVehiculo) { + this.addVehiculo(vehiculo); + } else + this.updateVehiculo(this.vehiculoID, vehiculo); + } + + getSucursales() { + this.api.vehiculos.sucursales('administrador/vehiculos/sucursales').subscribe(res => { + this.sucursales = res; + this.filteredSucursales.next(res.slice()); + this.ref.detectChanges(); + }); + } + + getTiposVehiculos() { + this.api.vehiculos.tiposVehiculos('administrador/vehiculos/tipos_vehiculos').subscribe(res => { + this.tipos_vehiculos = res.data; + this.filteredTiposVehiculos.next(res.data.slice()); + this.ref.detectChanges(); + }); + } + + getTipoVehiculoFilter(query = null) { + this.vehiculosForm.controls['searchTipoVehiculo'].setValue(query); + if (query != '') { + this.api.vehiculos.tiposVehiculos('administrador/vehiculos/tipos_vehiculos?query=' + query).subscribe(res => { + this.filteredTiposVehiculos.next(res.data.slice()); + this.isLoadingInputSearch = false; + this.ref.detectChanges(); + }); + } + } + + getSucursalFilter(query = null) { + this.vehiculosForm.controls['searchSucursal'].setValue(query); + if (query != '') { + this.api.vehiculos.sucursales('administrador/vehiculos/sucursales?query=' + query).subscribe(res => { + this.filteredSucursales.next(res.slice()); + this.isLoadingInputSearch = false; + this.ref.detectChanges(); + }); + } + } + + onKeyUpManual(ev, tipo) { + let text = ev.target.value; + + if (text != '') { + this.recently = false; + } + + if (!this.recently) { + this.isLoadingInputSearch = true; + clearTimeout(this.typingTimer); + this.typingTimer = setTimeout(() => { + + switch (tipo) { + case 'sucursal_id': { + this.getSucursalFilter(text); + break; + } + case 'tipo_vehiculo': { + this.getTipoVehiculoFilter(text); + break; + } + } + + if (text == '') { + this.recently = true; + } + + }, this.typingInterval); + } else { + this.isLoadingInputSearch = false; + } + + } + + onKeyDown(tipo) { + this.isLoadingInputSearch = false; + + switch (tipo) { + case 'sucursal_id': { + this.filteredSucursales.next([]); + break; + } + case 'tipo_vehiculo': { + if (!this.recently) + this.filteredTiposVehiculos.next([]); + break; + } + } + + clearTimeout(this.typingTimer); + } + + changeNoFoundLabel() { + return this.isLoadingInputSearch ? 'Espere un momento...' : 'No se encontraron resultados'; + } + + addVehiculo(vehiculo) { + this.api.vehiculos.create(vehiculo).subscribe(() => { + this.loading = false; + this.layoutUtilsService.showActionNotification('Vehículo guardado con éxito.', MessageType.Create); + this.router.navigate(['../'], {relativeTo: this.activatedRoute}) + }, () => { + this.loading = false; + }); + } + + updateVehiculo(id, vehiculo) { + this.api.vehiculos.update(id, vehiculo).subscribe(() => { + this.loading = false; + this.layoutUtilsService.showActionNotification('Vehículo actualizado con éxito.', MessageType.Update); + this.router.navigate(['../../'], {relativeTo: this.activatedRoute}) + }, () => { + this.loading = false; + }); + } + + isControlValid(controlName: string): boolean { + let control = this.vehiculosForm.controls[controlName]; + if (!control) { + return false; + } else if (control.valid) { + return false; + } + return true; + } + + isControlHasError(controlName: string, validationType: string): boolean { + let control = this.vehiculosForm.controls[controlName]; + if (!control) { + return false; + } + return control.hasError(validationType) && (control.dirty || control.touched); + } + + ngAfterViewInit(): void { + this.getVehiculo(); + } + +} diff --git a/src/app/views/pages/catalogos/vehiculos/vehiculos-list/vehiculos-list.component.html b/src/app/views/pages/catalogos/vehiculos/vehiculos-list/vehiculos-list.component.html new file mode 100644 index 0000000..dcca4bb --- /dev/null +++ b/src/app/views/pages/catalogos/vehiculos/vehiculos-list/vehiculos-list.component.html @@ -0,0 +1,93 @@ + + +
+
+
+ + + {{(deleted_at == '0') ? 'Mostrar eliminados' : 'Ocultar eliminados'}} + +
+ +
+
+
+ + + +
+
+
+
+ + + + Buscar en todos los campos + + +
+
+
+
+ +
+ + + + Número económico + {{vehiculo.num_economico}} + + + + Descripción + {{(vehiculo.descripcion) ? vehiculo.descripcion : 'SIN DESCRIPCIÓN'}} + + + + Tipo de vehículo + {{vehiculo.tipo_vehiculo}} + + + + Sucursal + + + {{veh.sucursal}} + + + + + + Fecha + {{vehiculo.created_at}} + + + + + +     + + + + + + + +
No se encontraron registros.
+
Espera un momento....
+
+ +
+ + +
+
+ +
diff --git a/src/app/views/pages/catalogos/vehiculos/vehiculos-list/vehiculos-list.component.scss b/src/app/views/pages/catalogos/vehiculos/vehiculos-list/vehiculos-list.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/pages/catalogos/vehiculos/vehiculos-list/vehiculos-list.component.ts b/src/app/views/pages/catalogos/vehiculos/vehiculos-list/vehiculos-list.component.ts new file mode 100644 index 0000000..5a3cb3a --- /dev/null +++ b/src/app/views/pages/catalogos/vehiculos/vehiculos-list/vehiculos-list.component.ts @@ -0,0 +1,143 @@ +import {AfterViewInit, ChangeDetectorRef, Component, OnInit} from '@angular/core'; +import {MatTableDataSource} from '@angular/material'; +import {ApiService} from '../../../../../core/api/api.service'; +import {ActivatedRoute, Router} from '@angular/router'; +import {LayoutUtilsService, MessageType} from '../../../../../core/_base/crud'; +import {Vehiculos} from '../vehiculos.model'; + +@Component({ + selector: 'kt-vehiculos-list', + templateUrl: './vehiculos-list.component.html', + styleUrls: ['./vehiculos-list.component.scss'] +}) +export class VehiculosListComponent implements OnInit { + + //Search + lastLength = 0; + typingTimer; + typingInterval = 700; + + displayedColumns: string[] = ['num_economico', 'descripcion', 'tipo_vehiculo', 'sucursal', 'created_at', 'actions']; + dataSourceVehiculos: MatTableDataSource; + + //Loadings + isLoading = true; + showMessageWait = true; + + deleted_at = '0'; + + //Paginator, Searcher + searchText: string; + sortBy = 'num_economico'; + order = 'asc'; + page = '1'; + perPage = '10'; + total = 0; + pages = [10, 25, 50, 100]; + titulo = 'Vehículos'; + + constructor(private api: ApiService, + private router: Router, + private layoutUtilsService: LayoutUtilsService, + private activatedRoute: ActivatedRoute, + private ref: ChangeDetectorRef) { + this.dataSourceVehiculos = new MatTableDataSource(); + } + + ngOnInit() { + } + + toggle(event){ + this.deleted_at = event.checked == false ? '0' : '1'; + this.getVehiculos(); + } + + getVehiculos(){ + this.isLoading = true; + this.api.vehiculos.index(this.page, this.searchText, this.sortBy, this.order, this.perPage,null, this.deleted_at).subscribe(res =>{ + this.isLoading = false; + this.showMessageWait = false; + this.dataSourceVehiculos.data = res.data; + this.total = res.total; + this.ref.detectChanges(); + }, ()=>{ + this.isLoading = false; + this.showMessageWait = false; + }) + } + + //Search + filtrarBusqueda(filterValue: string) { + if (filterValue.length != 0) { + this.searchText = filterValue.trim().toLowerCase(); + this.getVehiculos(); + } else if (this.lastLength != 0) { + this.searchText = ''; + this.getVehiculos(); + } + + this.lastLength = filterValue.length; + } + + onKeyUp(ev) { + clearTimeout(this.typingTimer); + this.typingTimer = setTimeout(() => { + this.filtrarBusqueda(ev.target.value) + }, this.typingInterval); + } + + onKeyDown() { + this.showMessageWait = true; + this.dataSourceVehiculos.data = []; + clearTimeout(this.typingTimer); + }//Fin search + + editVehiculo(id) { + this.router.navigate(['../vehiculos/edit/', id], {relativeTo: this.activatedRoute}) + } + + deleteVehiculo(vehiculo) { + let title = (!vehiculo.deleted_at) ? 'Eliminar vehículo' : 'Activar vehículo'; + let name = (vehiculo.nombre)? vehiculo.nombre : ''; + let description = (!vehiculo.deleted_at) ? '¿Está seguro de eliminar el vehículo ' + name + '?' : '¿Está seguro de activar el vehículo ' + name + '?'; + let waitDesciption = (!vehiculo.deleted_at) ? 'Eliminando vehículo...' : 'Activando vehículo...'; + let deleteMessage = (!vehiculo.deleted_at) ? `El vehículo ha sido eliminado con éxito` : `El vehículo ha sido activado con éxito`; + let errorMessage = (!vehiculo.deleted_at) ? `El vehículo no se ha podido eliminar` : `El vehículo no se ha podido activar`; + let btnText = (!vehiculo.deleted_at) ? 'Eliminar' : 'Activar'; + + let dialogRef = this.layoutUtilsService.deleteElement(title, description, waitDesciption, btnText); + dialogRef.afterClosed().subscribe(res => { + if (!res) { + return; + } + + let reactivated = (vehiculo.deleted_at != null); + + this.api.vehiculos.delete(vehiculo.id, reactivated).subscribe(() => { + this.getVehiculos(); + this.layoutUtilsService.showActionNotification(deleteMessage, MessageType.Delete); + }, () => { + this.layoutUtilsService.showActionNotification(errorMessage, MessageType.Delete); + }); + }); + + } + + sort(event) { + this.order = event.direction; + this.sortBy = event.active; + this.getVehiculos(); + } + + paginator(event) { + let nextPage = event.pageIndex + 1; + this.page = nextPage.toString(); + this.perPage = event.pageSize.toString(); + this.getVehiculos(); + } + + ngAfterViewInit(): void { + this.getVehiculos(); + } + +} diff --git a/src/app/views/pages/catalogos/vehiculos/vehiculos.model.ts b/src/app/views/pages/catalogos/vehiculos/vehiculos.model.ts new file mode 100644 index 0000000..c354e86 --- /dev/null +++ b/src/app/views/pages/catalogos/vehiculos/vehiculos.model.ts @@ -0,0 +1,4 @@ +export class Vehiculos { + id: number; + sucursales: any; +} diff --git a/src/app/views/pages/catalogos/vehiculos/vehiculos.service.ts b/src/app/views/pages/catalogos/vehiculos/vehiculos.service.ts new file mode 100644 index 0000000..6158168 --- /dev/null +++ b/src/app/views/pages/catalogos/vehiculos/vehiculos.service.ts @@ -0,0 +1,27 @@ +import {Injectable} from '@angular/core'; +import {ResourceBase} from '../../../../core/api/resource'; +import {HttpClient} from '@angular/common/http'; +import {Observable} from 'rxjs'; +import {catchError} from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root' +}) +export class VehiculosService extends ResourceBase { + + constructor(public http: HttpClient) { + super(http, 'administrador/vehiculos'); + } + + public sucursales(url) : Observable { + return this.http.get(this.baseUrl+url).pipe( + catchError(this.handleError('index')) + ); + } + + public tiposVehiculos(url) : Observable { + return this.http.get(this.baseUrl+url).pipe( + catchError(this.handleError('index')) + ); + } +} diff --git a/src/app/views/pages/dashboard/dashboard.component.html b/src/app/views/pages/dashboard/dashboard.component.html new file mode 100644 index 0000000..d99c5e4 --- /dev/null +++ b/src/app/views/pages/dashboard/dashboard.component.html @@ -0,0 +1,3 @@ +
+ Bienvenidos, Drenax! +
diff --git a/src/app/views/pages/dashboard/dashboard.component.scss b/src/app/views/pages/dashboard/dashboard.component.scss new file mode 100644 index 0000000..05307a6 --- /dev/null +++ b/src/app/views/pages/dashboard/dashboard.component.scss @@ -0,0 +1,7 @@ +:host { + ::ng-deep { + ngb-tabset > .nav-tabs { + display: none; + } + } +} diff --git a/src/app/views/pages/dashboard/dashboard.component.ts b/src/app/views/pages/dashboard/dashboard.component.ts new file mode 100644 index 0000000..cfb9bcc --- /dev/null +++ b/src/app/views/pages/dashboard/dashboard.component.ts @@ -0,0 +1,204 @@ +// Angular +import {Component, OnInit} from '@angular/core'; +// Lodash +import {shuffle} from 'lodash'; +// Services +// Widgets model +import {LayoutConfigService, SparklineChartOptions} from '../../../core/_base/layout'; +import {Widget4Data} from '../../partials/content/widgets/widget4/widget4.component'; +import {tick} from "@angular/core/testing"; + +@Component({ + selector: 'kt-dashboard', + templateUrl: './dashboard.component.html', + styleUrls: ['dashboard.component.scss'], +}) +export class DashboardComponent implements OnInit { + chartOptions1: SparklineChartOptions; + chartOptions2: SparklineChartOptions; + chartOptions3: SparklineChartOptions; + chartOptions4: SparklineChartOptions; + widget4_1: Widget4Data; + widget4_2: Widget4Data; + widget4_3: Widget4Data; + widget4_4: Widget4Data; + + + prettierPermision = [] + + constructor(private layoutConfigService: LayoutConfigService) { + } + + + + ngOnInit(): void { + this.chartOptions1 = { + data: [10, 14, 18, 11, 9, 12, 14, 17, 18, 14], + color: this.layoutConfigService.getConfig('colors.state.brand'), + border: 3 + }; + this.chartOptions2 = { + data: [11, 12, 18, 13, 11, 12, 15, 13, 19, 15], + color: this.layoutConfigService.getConfig('colors.state.danger'), + border: 3 + }; + this.chartOptions3 = { + data: [12, 12, 18, 11, 15, 12, 13, 16, 11, 18], + color: this.layoutConfigService.getConfig('colors.state.success'), + border: 3 + }; + this.chartOptions4 = { + data: [11, 9, 13, 18, 13, 15, 14, 13, 18, 15], + color: this.layoutConfigService.getConfig('colors.state.primary'), + border: 3 + }; + + // @ts-ignore + this.widget4_1 = shuffle([ + { + pic: './assets/media/files/doc.svg', + title: 'Metronic Documentation', + url: 'https://keenthemes.com.my/metronic', + }, { + pic: './assets/media/files/jpg.svg', + title: 'Project Launch Evgent', + url: 'https://keenthemes.com.my/metronic', + }, { + pic: './assets/media/files/pdf.svg', + title: 'Full Developer Manual For 4.7', + url: 'https://keenthemes.com.my/metronic', + }, { + pic: './assets/media/files/javascript.svg', + title: 'Make JS Development', + url: 'https://keenthemes.com.my/metronic', + }, { + pic: './assets/media/files/zip.svg', + title: 'Download Ziped version OF 5.0', + url: 'https://keenthemes.com.my/metronic', + }, { + pic: './assets/media/files/pdf.svg', + title: 'Finance Report 2016/2017', + url: 'https://keenthemes.com.my/metronic', + }, + ]); + // @ts-ignore + this.widget4_2 = shuffle([ + { + pic: './assets/media/users/100_4.jpg', + username: 'Anna Strong', + desc: 'Visual Designer,Google Inc.', + url: 'https://keenthemes.com.my/metronic', + buttonClass: 'btn-label-brand' + }, { + pic: './assets/media/users/100_14.jpg', + username: 'Milano Esco', + desc: 'Product Designer, Apple Inc.', + url: 'https://keenthemes.com.my/metronic', + buttonClass: 'btn-label-warning' + }, { + pic: './assets/media/users/100_11.jpg', + username: 'Nick Bold', + desc: 'Web Developer, Facebook Inc.', + url: 'https://keenthemes.com.my/metronic', + buttonClass: 'btn-label-danger' + }, { + pic: './assets/media/users/100_1.jpg', + username: 'Wilter Delton', + desc: 'Project Manager, Amazon Inc.', + url: 'https://keenthemes.com.my/metronic', + buttonClass: 'btn-label-success' + }, { + pic: './assets/media/users/100_5.jpg', + username: 'Nick Stone', + desc: 'Visual Designer, Github Inc.', + url: 'https://keenthemes.com.my/metronic', + buttonClass: 'btn-label-dark' + }, + ]); + // @ts-ignore + this.widget4_3 = shuffle([ + { + icon: 'flaticon-pie-chart-1 kt-font-info', + title: 'Metronic v6 has been arrived!', + url: 'https://keenthemes.com.my/metronic', + value: '+$500', + valueColor: 'kt-font-info' + }, { + icon: 'flaticon-safe-shield-protection kt-font-success', + title: 'Metronic community meet-up 2019 in Rome.', + url: 'https://keenthemes.com.my/metronic', + value: '+$1260', + valueColor: 'kt-font-success' + }, { + icon: 'flaticon2-line-chart kt-font-danger', + title: 'Metronic Angular 8 version will be landing soon..', + url: 'https://keenthemes.com.my/metronic', + value: '+$1080', + valueColor: 'kt-font-danger' + }, { + icon: 'flaticon2-pie-chart-1 kt-font-primary', + title: 'ale! Purchase Metronic at 70% off for limited time', + url: 'https://keenthemes.com.my/metronic', + value: '70% Off!', + valueColor: 'kt-font-primary' + }, { + icon: 'flaticon2-rocket kt-font-brand', + title: 'Metronic VueJS version is in progress. Stay tuned!', + url: 'https://keenthemes.com.my/metronic', + value: '+134', + valueColor: 'kt-font-brand' + }, { + icon: 'flaticon2-notification kt-font-warning', + title: 'Black Friday! Purchase Metronic at ever lowest 90% off for limited time', + url: 'https://keenthemes.com.my/metronic', + value: '70% Off!', + valueColor: 'kt-font-warning' + }, { + icon: 'flaticon2-file kt-font-focus', + title: 'Metronic React version is in progress.', + url: 'https://keenthemes.com.my/metronic', + value: '+13%', + valueColor: 'kt-font-focus' + }, + ]); + // @ts-ignore + this.widget4_4 = shuffle([ + { + pic: './assets/media/client-logos/logo5.png', + title: 'Trump Themes', + desc: 'Make Metronic Development', + url: 'https://keenthemes.com.my/metronic', + value: '+$2500', + valueColor: 'kt-font-brand' + }, { + pic: './assets/media/client-logos/logo4.png', + title: 'StarBucks', + desc: 'Good Coffee & Snacks', + url: 'https://keenthemes.com.my/metronic', + value: '-$290', + valueColor: 'kt-font-brand' + }, { + pic: './assets/media/client-logos/logo3.png', + title: 'Phyton', + desc: 'A Programming Language', + url: 'https://keenthemes.com.my/metronic', + value: '+$17', + valueColor: 'kt-font-brand' + }, { + pic: './assets/media/client-logos/logo2.png', + title: 'GreenMakers', + desc: 'Make Green Development', + url: 'https://keenthemes.com.my/metronic', + value: '-$2.50', + valueColor: 'kt-font-brand' + }, { + pic: './assets/media/client-logos/logo1.png', + title: 'FlyThemes', + desc: 'A Let\'s Fly Fast Again Language', + url: 'https://keenthemes.com.my/metronic', + value: '+200', + valueColor: 'kt-font-brand' + }, + ]); + } +} diff --git a/src/app/views/pages/dashboard/dashboard.module.ts b/src/app/views/pages/dashboard/dashboard.module.ts new file mode 100644 index 0000000..40d5140 --- /dev/null +++ b/src/app/views/pages/dashboard/dashboard.module.ts @@ -0,0 +1,28 @@ +// Angular +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { CommonModule } from '@angular/common'; +// Core Module +import { CoreModule } from '../../../core/core.module'; +import { PartialsModule } from '../../partials/partials.module'; +import { DashboardComponent } from './dashboard.component'; + +@NgModule({ + imports: [ + CommonModule, + PartialsModule, + CoreModule, + RouterModule.forChild([ + { + path: '', + component: DashboardComponent + }, + ]), + ], + providers: [], + declarations: [ + DashboardComponent, + ] +}) +export class DashboardModule { +} diff --git a/src/app/views/pages/encuesta/encuesta-general/encuesta-general.component.html b/src/app/views/pages/encuesta/encuesta-general/encuesta-general.component.html new file mode 100644 index 0000000..a84c470 --- /dev/null +++ b/src/app/views/pages/encuesta/encuesta-general/encuesta-general.component.html @@ -0,0 +1,41 @@ + + +
+ +
+ +
+ +
+ +
+ +
+
+ + +
+ +
+
+
+
+
+
+
+
+ +
+ + Espere un momento... + No es posible mostrar información sin seleccionar filtros. +
diff --git a/src/app/views/pages/encuesta/encuesta-general/encuesta-general.component.scss b/src/app/views/pages/encuesta/encuesta-general/encuesta-general.component.scss new file mode 100644 index 0000000..ba1c561 --- /dev/null +++ b/src/app/views/pages/encuesta/encuesta-general/encuesta-general.component.scss @@ -0,0 +1,25 @@ +.card { + box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2); + transition: 0.3s; + padding: 2%; + border-radius: 8px; + margin-bottom: 50px +} + +.card:hover { + box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2); +} + +.container { + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + gap: 20px; +} + +.spinner-text { + font-size: 1.2em; +} diff --git a/src/app/views/pages/encuesta/encuesta-general/encuesta-general.component.spec.ts b/src/app/views/pages/encuesta/encuesta-general/encuesta-general.component.spec.ts new file mode 100644 index 0000000..8c37f26 --- /dev/null +++ b/src/app/views/pages/encuesta/encuesta-general/encuesta-general.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EncuestaGeneralComponent } from './encuesta-general.component'; + +describe('EncuestaGeneralComponent', () => { + let component: EncuestaGeneralComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EncuestaGeneralComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EncuestaGeneralComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/views/pages/encuesta/encuesta-general/encuesta-general.component.ts b/src/app/views/pages/encuesta/encuesta-general/encuesta-general.component.ts new file mode 100644 index 0000000..f0ed762 --- /dev/null +++ b/src/app/views/pages/encuesta/encuesta-general/encuesta-general.component.ts @@ -0,0 +1,212 @@ +import { AfterViewInit, ChangeDetectorRef, Component, OnInit } from '@angular/core'; +import { MatDialog } from '@angular/material'; +import { ApiService } from '../../../../core/api/api.service'; +import { ModalFiltrosEncuestaGeneralComponent } from './modal-filtros-encuesta-general/modal-filtros-encuesta-general.component'; + +declare var require: any; +var Highcharts = require('highcharts'); +require('highcharts/modules/exporting')(Highcharts); +require('highcharts/modules/export-data')(Highcharts); +@Component({ + selector: 'kt-encuesta-general', + templateUrl: './encuesta-general.component.html', + styleUrls: ['./encuesta-general.component.scss'] +}) +export class EncuestaGeneralComponent implements OnInit, AfterViewInit { + + data = null; + showMessageSetFilters = true; + showMessageWait = false; + canExport = false; + isLoading = false; + titulo = "Reporte Encuestas Doméstico y Empresarial" + colores = ['#fecd6c','#d7ad5b','#a98847','#7b6333','#77c298','#5c9675','#367f56','#165532','#718dbf','#5c729a','#364f7b','#193059','#a4547d','#7e4060','#6b274a','#521333','#e84d60','#c24050','#9a333f','#761e28','#570b15','#000000','#363636','#4a4a4a','#5e5e5e','#787878','#9a9a9a','#f1001e','#e800f1']; + + constructor(private api: ApiService, private ref: ChangeDetectorRef, private dialog: MatDialog) { } + + ngOnInit() { + } + + ngAfterViewInit() { + this.filters(); + } + + filters(){ + const dialogRef = this.dialog.open(ModalFiltrosEncuestaGeneralComponent, { + data: this.data, + disableClose: true + }); + + dialogRef.afterClosed().subscribe(data => { + if(data){ + this.showMessageSetFilters = false; + this.data = data; + this.titulo = 'Reporte Encuestas Doméstico y Empresarial (' + data.user + ')'; + this.getInformation(); + } + }); + } + + getInformation(excel = false){ + if(this.data){ + this.isLoading = true; + this.canExport = false; + this.showMessageSetFilters = true; + this.ref.detectChanges(); + let url = excel? 'servicios/encuesta/excel' : 'servicios/encuesta'; + + this.api.reportesService.getInformation(url, this.data).subscribe(res => { + + this.isLoading = false; + this.canExport = true; + this.showMessageSetFilters = false; + + if(excel){ + if (res.nombre_archivo) { + document.location.href = this.api.reportesService.baseUrlStorage + 'servicios_encuestas/' + res.nombre_archivo; + } + }else{ + this.showCharts(res); + } + + this.ref.detectChanges(); + }, () => { + this.isLoading = false; + this.showMessageWait = false; + this.canExport = true; + this.showMessageSetFilters = false; + }); + } + } + + showCharts(result){ + + var rpt1_nombre_reporte = 'Encuesta General Doméstico'; + var rpt1_nombre_id = 'rpt_encuesta_general_domesticos'; + var rpt1_nombre_reporte_filename = 'Encuesta General Doméstico'; + + var rpt2_nombre_reporte = 'Encuesta General Empresarial'; + var rpt2_nombre_id = 'rpt_encuesta_general_empresariales'; + var rpt2_nombre_reporte_filename = 'Encuesta General Empresarial'; + + this.crearGraficaBarrasEncuesta(result.domestico, rpt1_nombre_reporte, rpt1_nombre_id, rpt1_nombre_reporte_filename); + this.crearGraficaBarrasEncuesta(result.empresarial, rpt2_nombre_reporte, rpt2_nombre_id, rpt2_nombre_reporte_filename); + } + + crearGraficaBarrasEncuesta(data, nombre_reporte, id, filename) { + + let coloresRandom = this.shuffleColor(this.colores); + Highcharts.setOptions({ + colors: Highcharts.map(coloresRandom, function (color) { + return { + radialGradient: { + cx: 0.5, + cy: 0.3, + r: 0.7 + }, + stops: [ + [0, color], + [1, Highcharts.Color(color).brighten(-0.2).get('rgb')] // darken + ] + }; + }), + lang: { + decimalPoint: '.', + thousandsSep: ',' + } + }); + + Highcharts.chart(id, { + chart: { + type: 'column' + }, + title: { + text: nombre_reporte + }, + exporting: { + buttons: { + contextButton: { + menuItems: [ + { + text: 'Generar PDF', + textKey: 'downloadPDF', + onclick: function () { + this.exportChart({ + type: 'application/pdf', + filename: filename + }); + } + }, { + text: 'Generar PNG', + textKey: 'downloadPNG', + onclick: function () { + this.exportChart({ + type: 'image/png', + filename: filename + }); + } + } + ] + } + }, + sourceWidth: 1024, + sourceHeight:500 + }, + credits: { + enabled: false + }, + xAxis: { + type: 'category', + labels: { + style: { + fontSize: '11px', + fontFamily: 'Verdana, sans-serif' + } + } + }, + yAxis: { + tickInterval: 10, + max: 100, + title: { + text: 'Porcentaje Mensual' + } + }, + legend: { + enabled: false + }, + tooltip: { + pointFormat: 'Porcentaje {point.y:.1f} %', + valueSuffix: ' %' + }, + series: [{ + name: 'Porcentaje de Encuesta', + data: data, + dataLabels: { + enabled: true, + rotation: 0, + color: '#ffffff', + align: 'center', + format: '{point.y:.1f}', // one decimal + y: 30, // 10 pixels down from the top + style: { + fontSize: '13px', + fontFamily: 'Verdana, sans-serif' + } + } + }] + }); + } + + shuffleColor(arra1) { + var ctr = arra1.length, temp, index; + + while (ctr > 0) { + index = Math.floor(Math.random() * ctr); + ctr--; + temp = arra1[ctr]; + arra1[ctr] = arra1[index]; + arra1[index] = temp; + } + return arra1; + } +} diff --git a/src/app/views/pages/encuesta/encuesta-general/modal-filtros-encuesta-general/modal-filtros-encuesta-general.component.html b/src/app/views/pages/encuesta/encuesta-general/modal-filtros-encuesta-general/modal-filtros-encuesta-general.component.html new file mode 100644 index 0000000..3bf5210 --- /dev/null +++ b/src/app/views/pages/encuesta/encuesta-general/modal-filtros-encuesta-general/modal-filtros-encuesta-general.component.html @@ -0,0 +1,71 @@ +
+
+ +
+
+ +
+
+
+ Filtros +
+ +
+
+
+ + + {{filtro.nombre}} + + + Sucursal + + +
+ +
+ + + {{filtro.nombre}} + + + Mes + + +
+ +
+ + + {{filtro.nombre}} + + + Año + + +
+ +
+ + + ({{filtro.servicios_cantidad}}) {{filtro.nombre}} {{filtro.apellido_paterno}} {{filtro.apellido_materno}} - {{filtro.tipo_empleado}} + + + Usuarios + + +
+
+
+ +
+ +
+
+
diff --git a/src/app/views/pages/encuesta/encuesta-general/modal-filtros-encuesta-general/modal-filtros-encuesta-general.component.scss b/src/app/views/pages/encuesta/encuesta-general/modal-filtros-encuesta-general/modal-filtros-encuesta-general.component.scss new file mode 100644 index 0000000..f639d29 --- /dev/null +++ b/src/app/views/pages/encuesta/encuesta-general/modal-filtros-encuesta-general/modal-filtros-encuesta-general.component.scss @@ -0,0 +1,68 @@ +.span-titulo { + text-align: center; + font-size: 1.6em; + font-weight: 600; + color: #404040; +} + +.c-titulo{ + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; + align-items: center; + align-content: center; + background-color: #19385E; +} + +.c-titulo div:last-child { + margin-left: auto; +} + +.c-modal{ + text-align:center; + margin-bottom: 5px; +} + +.button-filled{ + background-color: #E63C2D; + color: white; +} + +.button-filled:focus, .button-filled.focus { + color: #fff; + background-color: #e71b08; + border-color: #e71b08; + box-shadow: none; +} + +.button-filled:disabled { + color: rgba(0,0,0,.26) !important; +} + +.button-filled:hover:enabled { + color: #fff; + background-color: #e71b08; + border-color: #e71b08; +} + +.input-lit { + outline: 0; + background-color: #eaeaea; + border-width: 0 0 0px; + width: 50%; + height: 50px; + margin-left: 2px; + margin-right: 2px; + text-align: center; + font-size: 1.2em; +} + +.input-lit:focus { + border-width: 0 0 2px; + border-color: #313131; +} + +.input-lit::placeholder, .input-lit::-webkit-input-placeholder{ + font-size: 1.1em !important; +} diff --git a/src/app/views/pages/encuesta/encuesta-general/modal-filtros-encuesta-general/modal-filtros-encuesta-general.component.ts b/src/app/views/pages/encuesta/encuesta-general/modal-filtros-encuesta-general/modal-filtros-encuesta-general.component.ts new file mode 100644 index 0000000..52f558f --- /dev/null +++ b/src/app/views/pages/encuesta/encuesta-general/modal-filtros-encuesta-general/modal-filtros-encuesta-general.component.ts @@ -0,0 +1,183 @@ +import { ApiService } from './../../../../../core/api/api.service'; +import {ChangeDetectorRef, Component, Inject, OnInit} from '@angular/core'; +import {FormBuilder, FormControl, FormGroup, Validators} from "@angular/forms"; +import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from "@angular/material/dialog"; + +@Component({ + selector: 'kt-modal-filtros-encuesta-general', + templateUrl: './modal-filtros-encuesta-general.component.html', + styleUrls: ['./modal-filtros-encuesta-general.component.scss'] +}) +export class ModalFiltrosEncuestaGeneralComponent implements OnInit { + + form: FormGroup; + loading: boolean = false; + sucursales = null; + usuarios = []; + months = []; + years = []; + + constructor(private fb: FormBuilder, + public dialog: MatDialog, + public dialogRef: MatDialogRef, + private api: ApiService, + private cdr: ChangeDetectorRef, + @Inject(MAT_DIALOG_DATA) public data: any) { + + this.initLoginForm(); + this.setStaticSelects(); + this.filtros(); + } + + ngOnInit() {} + + initLoginForm() { + let sucursal = this.data? this.data.sucursal : null; + let mes = this.data? this.data.mes : null; + let year = this.data? this.data.year : null; + let operador_id = this.data? this.data.operador_id : null; + + this.form = this.fb.group({ + sucursal: new FormControl({value: sucursal, disabled: true}, [Validators.required]), + mes: new FormControl({value: mes, disabled: true}, [Validators.required]), + year: new FormControl({value: year, disabled: true}, [Validators.required]), + operador_id: new FormControl({value: operador_id, disabled: true}, [Validators.required]), + }); + } + + setFilters(){ + let data = this.form.value; + + let user = this.searchUserById(data.operador_id); + data.user = user.nombre + ' ' + user.apellido_paterno + ' ' + user.apellido_materno; + + this.dialogRef.close(data); + } + + filtros(){ + this.loading = true; + this.api.reportesService.filtros('sucursales').subscribe(res => { + this.form.controls['sucursal'].enable(); + + this.sucursales = res.data; + + if(this.data) + this.getUsers(true); + + this.loading = false; + }, () => { + this.loading = false; + }); + } + + getUsers(reOpen = false){ + let sucursal = this.form.value.sucursal; + let mes = this.form.value.mes; + let year = this.form.value.year; + + if(sucursal && mes && year){ + this.changeStatusInputs(false); + this.loading = true; + this.usuarios = []; + + if(!reOpen) + this.form.get('operador_id').reset(); + + this.api.reportesService.getInformation('filtros/asesores', this.form.value).subscribe(res => { + this.usuarios = res.data; + this.changeStatusInputs(true); + this.loading = false; + this.cdr.detectChanges(); + }, () => { + this.changeStatusInputs(true); + this.loading = false; + }); + } + } + + changeStatusInputs(enable){ + if(enable){ + this.form.controls['sucursal'].enable(); + this.form.controls['mes'].enable(); + this.form.controls['year'].enable(); + this.form.controls['operador_id'].enable(); + }else{ + this.form.controls['sucursal'].disable(); + this.form.controls['mes'].disable(); + this.form.controls['year'].disable(); + this.form.controls['operador_id'].disable(); + } + } + + searchUserById(valor){ + let index = this.usuarios.findIndex((user => valor == user.id)); + if(index != -1){ + return this.usuarios[index]; + } + return false; + } + + + setStaticSelects(){ + this.months = [ + { + id: 1, + nombre: 'Enero' + }, + { + id: 2, + nombre: 'Febrero' + }, + { + id: 3, + nombre: 'Marzo' + }, + { + id: 4, + nombre: 'Abril' + }, + { + id: 5, + nombre: 'Mayo' + }, + { + id: 6, + nombre: 'Junio' + }, + { + id: 7, + nombre: 'Julio' + }, + { + id: 8, + nombre: 'Agosto' + }, + { + id: 9, + nombre: 'Septiembre' + }, + { + id: 10, + nombre: 'Octubre' + }, + { + id: 11, + nombre: 'Noviembre' + }, + { + id: 12, + nombre: 'Diciembre' + } + ]; + + let startYear = 2018; + let endYear = new Date().getFullYear() + 30; + + for(let i = startYear; i <= endYear ; i++){ + this.years.push({id: i, nombre: i}); + } + + this.form.controls['mes'].enable(); + this.form.controls['year'].enable(); + } +} diff --git a/src/app/views/pages/encuesta/encuesta.module.ts b/src/app/views/pages/encuesta/encuesta.module.ts new file mode 100644 index 0000000..765f6e6 --- /dev/null +++ b/src/app/views/pages/encuesta/encuesta.module.ts @@ -0,0 +1,104 @@ +import {NgModule} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {PartialsModule} from '../../partials/partials.module'; +import {CoreModule} from '../../../core/core.module'; +import {RouterModule} from '@angular/router'; +import { + MAT_DIALOG_DEFAULT_OPTIONS, + MatAutocompleteModule, + MatButtonModule, + MatCardModule, + MatCheckboxModule, + MatDatepickerModule, + MatDialogModule, + MatExpansionModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatMenuModule, + MatNativeDateModule, + MatPaginatorModule, + MatProgressBarModule, + MatProgressSpinnerModule, + MatRadioModule, + MatSelectModule, + MatSnackBarModule, + MatSortModule, + MatTableModule, + MatTabsModule, + MatTooltipModule +} from '@angular/material'; +import {FormsModule, ReactiveFormsModule} from '@angular/forms'; +import {NgxPermissionsModule} from 'ngx-permissions'; +import {HttpUtilsService, InterceptService, LayoutUtilsService, TypesUtilsService} from '../../../core/_base/crud'; +import {HTTP_INTERCEPTORS} from '@angular/common/http'; +import {ActionNotificationComponent, DeleteEntityDialogComponent} from '../../partials/content/crud'; +import { EncuestaGeneralComponent } from './encuesta-general/encuesta-general.component'; +import { ModalFiltrosEncuestaGeneralComponent } from './encuesta-general/modal-filtros-encuesta-general/modal-filtros-encuesta-general.component'; + +@NgModule({ + declarations: [EncuestaGeneralComponent, ModalFiltrosEncuestaGeneralComponent], + imports: [ + CommonModule, + PartialsModule, + CoreModule, + RouterModule.forChild([ + { + path: 'encuesta-general', + component: EncuestaGeneralComponent + }, + ]), + MatButtonModule, + MatTooltipModule, + MatFormFieldModule, + MatInputModule, + MatSelectModule, + MatIconModule, + MatTableModule, + MatMenuModule, + MatCheckboxModule, + MatSortModule, + MatProgressSpinnerModule, + MatPaginatorModule, + FormsModule, + ReactiveFormsModule, + MatAutocompleteModule, + MatRadioModule, + MatNativeDateModule, + MatProgressBarModule, + MatDatepickerModule, + MatCardModule, + MatSnackBarModule, + MatExpansionModule, + MatTabsModule, + MatDialogModule, + NgxPermissionsModule + ], + providers: [ + InterceptService, + { + provide: HTTP_INTERCEPTORS, + useClass: InterceptService, + multi: true + }, + { + provide: MAT_DIALOG_DEFAULT_OPTIONS, + useValue: { + hasBackdrop: true, + panelClass: 'kt-mat-dialog-container__wrapper', + height: 'auto', + width: '900px' + } + }, + HttpUtilsService, + TypesUtilsService, + LayoutUtilsService, + ], + entryComponents: [ + DeleteEntityDialogComponent, + ActionNotificationComponent, + ModalFiltrosEncuestaGeneralComponent + ] +}) + +export class EncuestaModule { } diff --git a/src/app/views/pages/pages.module.ts b/src/app/views/pages/pages.module.ts new file mode 100644 index 0000000..67104f9 --- /dev/null +++ b/src/app/views/pages/pages.module.ts @@ -0,0 +1,37 @@ +// Angular +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import {HTTP_INTERCEPTORS, HttpClientModule} from '@angular/common/http'; +// Partials +import { PartialsModule } from '../partials/partials.module'; +// Pages +import { CoreModule } from '../../core/core.module'; +import {UrlInterceptorService} from "../../core/api/url-interceptor.service"; +import {MatNativeDateModule, MAT_DIALOG_DATA, MatDialogRef} from '@angular/material'; + +@NgModule({ + declarations: [], + exports: [], + imports: [ + CommonModule, + HttpClientModule, + FormsModule, + CoreModule, + PartialsModule, + MatNativeDateModule + ], + providers: [ + {provide: HTTP_INTERCEPTORS, useClass: UrlInterceptorService, multi: true}, + { + provide: MatDialogRef, + useValue: {} + }, + { + provide: MAT_DIALOG_DATA, + useValue: {} + }, + ], +}) +export class PagesModule { +} diff --git a/src/app/views/pages/reportes/capacidad-aprovechada/capacidad-aprovechada.component.html b/src/app/views/pages/reportes/capacidad-aprovechada/capacidad-aprovechada.component.html new file mode 100644 index 0000000..3526347 --- /dev/null +++ b/src/app/views/pages/reportes/capacidad-aprovechada/capacidad-aprovechada.component.html @@ -0,0 +1,108 @@ + + +
+ +
+ +
+ +
+ +
+ +
+
+ + + +
+
+
Totales ({{totalServicios}})
+
${{ totalCosto | number:'1.2-2'}}
+
{{totalDuracion}}
+
+
+ +
+ + + + Núm. de solicitud + {{data.numero_solicitud}} + + + + Fecha del servicio + {{(data.fecha_servicio != null)? data.fecha_servicio : '-'}} + + + + Hora del servicio + {{(data.hora_servicio != null)? data.hora_servicio : '-'}} + + + + Servicio + {{(data.servicio != null)? data.servicio : '-'}} + + + + Costo de servicio + ${{ data.costo | number:'1.2-2'}} + + + + Tipo de servicio + {{(data.tipo_servicio != null)? data.tipo_servicio : '-'}} + + + + Estado de servicio + {{(data.estatus_servicio != null)? data.estatus_servicio : '-'}} + + + + Domicilio del servicio + {{(data.colonia_cliente != null)? data.calle_cliente + ' #' + data.num_ext_cliente + ', ' + data.colonia_cliente + ' C.P. ' + data.cp_cliente : '-'}} + + + + Asesor de operaciones + {{(data.nombre_asesor != null)? data.nombre_asesor + ' ' + data.apellido_paterno_asesor + ' ' + data.apellido_materno_asesor : '-'}} + + + + Auxiliar de operaciones + {{(data.nombre_auxiliar != null)? data.nombre_auxiliar + ' ' + data.apellido_paterno_auxiliar + ' ' + data.apellido_materno_auxiliar : '-'}} + + + + Duración del servicio + {{(data.duracion_servicio != null)? data.duracion_servicio : '-'}} + + + + + +
No es posible mostrar información sin seleccionar filtros.
+
No se encontraron registros.
+
Espera un momento....
+
+ +
+ + +
+ +
+ +
diff --git a/src/app/views/pages/reportes/capacidad-aprovechada/capacidad-aprovechada.component.scss b/src/app/views/pages/reportes/capacidad-aprovechada/capacidad-aprovechada.component.scss new file mode 100644 index 0000000..9ea7320 --- /dev/null +++ b/src/app/views/pages/reportes/capacidad-aprovechada/capacidad-aprovechada.component.scss @@ -0,0 +1,44 @@ +.container-detail { + display: flex; + flex-direction: row; + justify-content: flex-end; + flex-flow: row wrap; + text-align-last: right; +} + +.row-detail { + font-size: 1.2em; + font-weight: 500; + color: #00000094; +} + +.table-responsive { + display: block; + width: 100%; + overflow-x: auto; + text-align: center; + z-index: 1; + mat-table { + width: 100%; + max-width: 100%; + margin-bottom: 1rem; + display: table; + border-collapse: collapse; + margin: 0px; + } + mat-row, + mat-header-row { + display: table-row; + } + mat-cell, + mat-header-cell { + word-wrap: initial; + display: table-cell; + padding: 0px 5px; + line-break: unset; + width: auto; + white-space: nowrap; + overflow: hidden; + vertical-align: middle; + } +} diff --git a/src/app/views/pages/reportes/capacidad-aprovechada/capacidad-aprovechada.component.spec.ts b/src/app/views/pages/reportes/capacidad-aprovechada/capacidad-aprovechada.component.spec.ts new file mode 100644 index 0000000..22f36f1 --- /dev/null +++ b/src/app/views/pages/reportes/capacidad-aprovechada/capacidad-aprovechada.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CapacidadAprovechadaComponent } from './capacidad-aprovechada.component'; + +describe('CapacidadAprovechadaComponent', () => { + let component: CapacidadAprovechadaComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CapacidadAprovechadaComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CapacidadAprovechadaComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/views/pages/reportes/capacidad-aprovechada/capacidad-aprovechada.component.ts b/src/app/views/pages/reportes/capacidad-aprovechada/capacidad-aprovechada.component.ts new file mode 100644 index 0000000..f9878f7 --- /dev/null +++ b/src/app/views/pages/reportes/capacidad-aprovechada/capacidad-aprovechada.component.ts @@ -0,0 +1,115 @@ +import { ChangeDetectorRef, Component, OnInit } from '@angular/core'; +import { MatDialog, MatTableDataSource } from '@angular/material'; +import { ApiService } from '../../../../core/api/api.service'; +import { CapacidadAprovechadaModel } from './capacidad-aprovechada.model'; +import { ModalFiltrosCapacidadAprovechadaComponent } from './modal-filtros-capacidad-aprovechada/modal-filtros-capacidad-aprovechada.component'; + +@Component({ + selector: 'kt-capacidad-aprovechada', + templateUrl: './capacidad-aprovechada.component.html', + styleUrls: ['./capacidad-aprovechada.component.scss'] +}) +export class CapacidadAprovechadaComponent implements OnInit { + + titulo = 'Reporte de capacidad aprovechada'; + + displayedColumns: string[] = ['numero_solicitud', 'fecha_servicio', 'hora_servicio', 'servicio', 'costo', 'tipo_servicio', 'estatus_servicio', 'colonia_cliente', 'nombre_asesor', 'nombre_auxiliar', 'duracion_servicio']; + dataSource: MatTableDataSource; + + //Loadings + isLoading = false; + showMessageWait = false; + showMessageSetFilters = true; + + //Paginator, Searcher + page = '1'; + perPage = '10'; + total = 0; + sortBy = 'denominacion'; + order = 'asc'; + pages = [10, 25, 50, 100]; + deleted = '0'; + + data = null; + totalServicios = 0; + totalCosto = 0.00; + totalDuracion = '00h 00m 00s'; + + constructor(private api: ApiService, private ref: ChangeDetectorRef, private dialog: MatDialog) { + this.dataSource = new MatTableDataSource(); + } + + ngOnInit() { + } + + getInformation(excel = false){ + if(this.data){ + this.isLoading = true; + this.showMessageWait = true; + + let url = excel? 'servicios/capacidad/excel' : 'servicios/capacidad'; + + this.api.reportesService.getInformation(url, this.data, this.page, this.perPage, this.deleted).subscribe(res => { + + this.isLoading = false; + this.showMessageWait = false; + + if(excel){ + if (res.nombre_archivo) { + document.location.href = this.api.reportesService.baseUrlStorage + 'servicios_capacidad/' + res.nombre_archivo; + } + }else{ + this.totalServicios = 0; + this.totalCosto = 0.00; + this.totalDuracion = '00h 00m 00s'; + this.dataSource.data = []; + + this.dataSource.data = res.data; + this.total = res.total; + this.totalServicios = res.total_servicios; + this.totalDuracion = res.total_duracion; + this.totalCosto = res.total_costo; + } + + this.ref.detectChanges(); + }, () => { + this.isLoading = false; + this.showMessageWait = false; + }); + } + } + + filters(){ + const dialogRef = this.dialog.open(ModalFiltrosCapacidadAprovechadaComponent, { + data: this.data, + disableClose: true + }); + + dialogRef.afterClosed().subscribe(data => { + if(data){ + this.showMessageSetFilters = false; + this.data = data; + this.dataSource.data = []; + this.titulo = 'Reporte de capacidad aprovechada (' + data.vehiculo + ')'; + this.getInformation(); + } + }); + } + + sort(event) { + this.order = event.direction; + this.sortBy = event.active; + this.getInformation(); + } + + paginator(event) { + let nextPage = event.pageIndex + 1; + this.page = nextPage.toString(); + this.perPage = event.pageSize.toString(); + this.getInformation(); + } + + ngAfterViewInit() { + this.filters(); + } +} diff --git a/src/app/views/pages/reportes/capacidad-aprovechada/capacidad-aprovechada.model.ts b/src/app/views/pages/reportes/capacidad-aprovechada/capacidad-aprovechada.model.ts new file mode 100644 index 0000000..15bc520 --- /dev/null +++ b/src/app/views/pages/reportes/capacidad-aprovechada/capacidad-aprovechada.model.ts @@ -0,0 +1,30 @@ +export class CapacidadAprovechadaModel { + apellido_materno_asesor: string; + apellido_materno_auxiliar: string; + apellido_paterno_asesor: string; + apellido_paterno_auxiliar: string; + calle_cliente: string; + ciudad_cliente: string; + colonia_cliente: string; + costo: string; + cp_cliente: string; + diferencia: string; + duracion_servicio: string; + entre_calles_cliente: string; + estatus_servicio: string; + fecha_inicio_servicio: string; + fecha_servicio: string; + hora_inicio_servicio: string; + hora_servicio: string; + litraje: string; + nombre_asesor: string; + nombre_auxiliar: string; + nombre_cliente: string; + num_ext_cliente: string; + num_int_cliente: string; + numero_solicitud: string; + origen: string; + servicio: string; + tipo_servicio: string; + vehiculo: string; +} diff --git a/src/app/views/pages/reportes/capacidad-aprovechada/modal-filtros-capacidad-aprovechada/modal-filtros-capacidad-aprovechada.component.html b/src/app/views/pages/reportes/capacidad-aprovechada/modal-filtros-capacidad-aprovechada/modal-filtros-capacidad-aprovechada.component.html new file mode 100644 index 0000000..267b034 --- /dev/null +++ b/src/app/views/pages/reportes/capacidad-aprovechada/modal-filtros-capacidad-aprovechada/modal-filtros-capacidad-aprovechada.component.html @@ -0,0 +1,75 @@ +
+
+ +
+
+ +
+
+
+ Filtros +
+ +
+
+
+ + + {{filtro.nombre}} + + + Sucursal + + +
+ +
+
+ + Fecha inicial + + + + + Fecha inicial + + +
+ +
+ + Fecha final + + + + + Fecha final + + +
+
+ +
+ + + ({{filtro.servicios_cantidad}} servicios) {{filtro.num_economico}} + + + Vehículos + + +
+
+
+ +
+ +
+
+
diff --git a/src/app/views/pages/reportes/capacidad-aprovechada/modal-filtros-capacidad-aprovechada/modal-filtros-capacidad-aprovechada.component.scss b/src/app/views/pages/reportes/capacidad-aprovechada/modal-filtros-capacidad-aprovechada/modal-filtros-capacidad-aprovechada.component.scss new file mode 100644 index 0000000..f639d29 --- /dev/null +++ b/src/app/views/pages/reportes/capacidad-aprovechada/modal-filtros-capacidad-aprovechada/modal-filtros-capacidad-aprovechada.component.scss @@ -0,0 +1,68 @@ +.span-titulo { + text-align: center; + font-size: 1.6em; + font-weight: 600; + color: #404040; +} + +.c-titulo{ + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; + align-items: center; + align-content: center; + background-color: #19385E; +} + +.c-titulo div:last-child { + margin-left: auto; +} + +.c-modal{ + text-align:center; + margin-bottom: 5px; +} + +.button-filled{ + background-color: #E63C2D; + color: white; +} + +.button-filled:focus, .button-filled.focus { + color: #fff; + background-color: #e71b08; + border-color: #e71b08; + box-shadow: none; +} + +.button-filled:disabled { + color: rgba(0,0,0,.26) !important; +} + +.button-filled:hover:enabled { + color: #fff; + background-color: #e71b08; + border-color: #e71b08; +} + +.input-lit { + outline: 0; + background-color: #eaeaea; + border-width: 0 0 0px; + width: 50%; + height: 50px; + margin-left: 2px; + margin-right: 2px; + text-align: center; + font-size: 1.2em; +} + +.input-lit:focus { + border-width: 0 0 2px; + border-color: #313131; +} + +.input-lit::placeholder, .input-lit::-webkit-input-placeholder{ + font-size: 1.1em !important; +} diff --git a/src/app/views/pages/reportes/capacidad-aprovechada/modal-filtros-capacidad-aprovechada/modal-filtros-capacidad-aprovechada.component.ts b/src/app/views/pages/reportes/capacidad-aprovechada/modal-filtros-capacidad-aprovechada/modal-filtros-capacidad-aprovechada.component.ts new file mode 100644 index 0000000..58b9b87 --- /dev/null +++ b/src/app/views/pages/reportes/capacidad-aprovechada/modal-filtros-capacidad-aprovechada/modal-filtros-capacidad-aprovechada.component.ts @@ -0,0 +1,140 @@ +import { ApiService } from './../../../../../core/api/api.service'; +import {ChangeDetectorRef, Component, Inject, OnInit} from '@angular/core'; +import {FormBuilder, FormControl, FormGroup, Validators} from "@angular/forms"; +import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from "@angular/material/dialog"; + +@Component({ + selector: 'kt-modal-filtros-capacidad-aprovechada', + templateUrl: './modal-filtros-capacidad-aprovechada.component.html', + styleUrls: ['./modal-filtros-capacidad-aprovechada.component.scss'] +}) +export class ModalFiltrosCapacidadAprovechadaComponent implements OnInit { + + form: FormGroup; + loading: boolean = false; + sucursales = null; + vehiculos = []; + origenes = null; + startDate = null; + + addDays = (date: Date, days: number): Date => { + let result = new Date(date); + result.setDate(result.getDate() + days); + return result; + }; + + constructor(private fb: FormBuilder, + public dialog: MatDialog, + public dialogRef: MatDialogRef, + private api: ApiService, + private cdr: ChangeDetectorRef, + @Inject(MAT_DIALOG_DATA) public data: any) { + + this.initLoginForm(); + this.filtros(); + } + + ngOnInit() {} + + initLoginForm() { + let fechaInicio = this.data? this.addDays(new Date(this.data.fecha_inicio+'T00:00:00.000Z'), 1) : null; + let fechaFinal = this.data? this.addDays(new Date(this.data.fecha_final+'T00:00:00.000Z'), 1) : null; + let sucursal = this.data? this.data.sucursal : null; + let vehiculo_id = this.data? this.data.vehiculo_id : null; + + this.form = this.fb.group({ + sucursal: new FormControl({value: sucursal, disabled: true}, [Validators.required]), + fecha_inicio: new FormControl({value: fechaInicio, disabled: false}, [Validators.required]), + fecha_final: new FormControl({value: fechaFinal, disabled: false}, [Validators.required]), + vehiculo_id: new FormControl({value: vehiculo_id, disabled: true}, [Validators.required]), + }); + } + + setFilters(){ + let data = this.form.value; + data.fecha_inicio = new Date(data.fecha_inicio).toLocaleDateString('en-CA'); + data.fecha_final = new Date(data.fecha_final).toLocaleDateString('en-CA'); + + let vehiculo = this.searchVehiculoById(data.vehiculo_id); + data.vehiculo = vehiculo.num_economico; + + this.dialogRef.close(data); + } + + filtros(){ + this.loading = true; + this.api.reportesService.filtros('sucursales').subscribe(res => { + this.form.controls['sucursal'].enable(); + + this.sucursales = res.data; + + if(this.data) + this.getUsers(true); + + this.loading = false; + }, () => { + this.loading = false; + }); + } + + dateChanged(dateModal: any){ + if(dateModal){ + this.startDate = this.form.value.fecha_inicio; + this.form.get('fecha_final').reset(); + dateModal.open(); + } + + this.getUsers(); + } + + getUsers(reOpen = false){ + let sucursal = this.form.value.sucursal; + let fechaInicio = this.form.value.fecha_inicio; + let fechaFinal = this.form.value.fecha_final; + + if(sucursal && fechaInicio && fechaFinal){ + this.changeStatusInputs(false); + this.loading = true; + this.vehiculos = []; + + if(!reOpen) + this.form.get('vehiculo_id').reset(); + + let data = this.form.value; + data.fecha_inicio = new Date(data.fecha_inicio).toLocaleDateString('en-CA'); + data.fecha_final = new Date(data.fecha_final).toLocaleDateString('en-CA'); + + this.api.reportesService.getInformation('servicios/capacidad/vehiculos', data).subscribe(res => { + this.vehiculos = res.data; + this.changeStatusInputs(true); + this.loading = false; + this.cdr.detectChanges(); + }, () => { + this.changeStatusInputs(true); + this.loading = false; + }); + } + } + + changeStatusInputs(enable){ + if(enable){ + this.form.controls['sucursal'].enable(); + this.form.controls['fecha_inicio'].enable(); + this.form.controls['fecha_final'].enable(); + this.form.controls['vehiculo_id'].enable(); + }else{ + this.form.controls['sucursal'].disable(); + this.form.controls['fecha_inicio'].disable(); + this.form.controls['fecha_final'].disable(); + this.form.controls['vehiculo_id'].disable(); + } + } + + searchVehiculoById(valor){ + let index = this.vehiculos.findIndex((vehiculo => valor == vehiculo.id)); + if(index != -1){ + return this.vehiculos[index]; + } + return false; + } +} diff --git a/src/app/views/pages/reportes/mensual/mensual.component.html b/src/app/views/pages/reportes/mensual/mensual.component.html new file mode 100644 index 0000000..f514a6a --- /dev/null +++ b/src/app/views/pages/reportes/mensual/mensual.component.html @@ -0,0 +1,37 @@ + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+ + Espere un momento... +
diff --git a/src/app/views/pages/reportes/mensual/mensual.component.scss b/src/app/views/pages/reportes/mensual/mensual.component.scss new file mode 100644 index 0000000..ba1c561 --- /dev/null +++ b/src/app/views/pages/reportes/mensual/mensual.component.scss @@ -0,0 +1,25 @@ +.card { + box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2); + transition: 0.3s; + padding: 2%; + border-radius: 8px; + margin-bottom: 50px +} + +.card:hover { + box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2); +} + +.container { + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + gap: 20px; +} + +.spinner-text { + font-size: 1.2em; +} diff --git a/src/app/views/pages/reportes/mensual/mensual.component.spec.ts b/src/app/views/pages/reportes/mensual/mensual.component.spec.ts new file mode 100644 index 0000000..56c9f67 --- /dev/null +++ b/src/app/views/pages/reportes/mensual/mensual.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MensualComponent } from './mensual.component'; + +describe('MensualComponent', () => { + let component: MensualComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ MensualComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MensualComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/views/pages/reportes/mensual/mensual.component.ts b/src/app/views/pages/reportes/mensual/mensual.component.ts new file mode 100644 index 0000000..70098cc --- /dev/null +++ b/src/app/views/pages/reportes/mensual/mensual.component.ts @@ -0,0 +1,364 @@ +import { ChangeDetectorRef, Component, OnInit } from '@angular/core'; +import { ApiService } from '../../../../core/api/api.service.js'; + +declare var require: any; +var Highcharts = require('highcharts'); +require('highcharts/modules/exporting')(Highcharts); +require('highcharts/modules/export-data')(Highcharts); + +@Component({ + selector: 'kt-mensual', + templateUrl: './mensual.component.html', + styleUrls: ['./mensual.component.scss'] +}) +export class MensualComponent implements OnInit { + + titulo = 'Reporte mensual'; + colores = ['#fecd6c','#d7ad5b','#a98847','#7b6333','#77c298','#5c9675','#367f56','#165532','#718dbf','#5c729a','#364f7b','#193059','#a4547d','#7e4060','#6b274a','#521333','#e84d60','#c24050','#9a333f','#761e28','#570b15','#000000','#363636','#4a4a4a','#5e5e5e','#787878','#9a9a9a','#f1001e','#e800f1']; + isLoading = true; + + constructor(private api: ApiService, private ref: ChangeDetectorRef) {} + + ngOnInit() { + this.getInformation(); + } + + getInformation(){ + this.isLoading = true; + this.api.reportesService.getChartReports('mensual').subscribe(res => { + this.isLoading = false; + this.showCharts(res); + this.ref.detectChanges(); + }, () => { + this.isLoading = false; + }); + } + + setChartConfig(){ + let coloresRandom = this.shuffleColor(this.colores); + + Highcharts.setOptions({ + lang: { + decimalPoint: '.', + thousandsSep: ',' + }, + colors: Highcharts.map(coloresRandom, function (color) { + return { + radialGradient: { + cx: 0.5, + cy: 0.3, + r: 0.7 + }, + stops: [ + [0, color], + [1, Highcharts.Color(color).brighten(-0.2).get('rgb')] // darken + ] + }; + }) + }); + } + + showCharts(result){ + + let rpt1_nombre_reporte = 'Total de servicios por nombre y precios totales'; + let rpt1_nombre_id = 'rpt_servicios_nombre_precios'; + let rpt1_etiquetas = 'Total de servicios: {point.y}
'+'Total de costo: ${point.costo:,.2f}'; + let rpt1_nombre_reporte_filename = 'Total de servicios por nombre y precios totales'; + + let rpt2_nombre_reporte = 'Total de tipos de servicio'; + let rpt2_nombre_id = 'rpt_tipos_servicios'; + let rpt2_etiquetas = 'Total de servicios: {point.y}'; + let rpt2_nombre_reporte_filename = 'Total de tipos de servicio'; + + let rpt3_nombre_reporte = 'Total de estados de servicio'; + let rpt3_nombre_id = 'rpt_tipos_estados_servicios'; + let rpt3_etiquetas = 'Total de servicios: {point.y}'; + let rpt3_nombre_reporte_filename = 'Total de estados de servicio'; + + let rpt4_nombre_reporte = 'Total de origenes'; + let rpt4_nombre_id = 'rpt_tipos_origenes'; + let rpt4_etiquetas = 'Total de servicios: {point.y}'; + let rpt4_nombre_reporte_filename = 'Total de origenes'; + + let rpt5_nombre_reporte = 'Total de servicios de atención a cliente'; + let rpt5_nombre_id = 'rpt_atencion_cliente'; + let rpt5_nombre_reporte_filename = 'Total de servicios de atención a cliente'; + + let rpt6_nombre_reporte = 'Total de servicios de operadores'; + let rpt6_nombre_id = 'rpt_operadores'; + let rpt6_nombre_reporte_filename = 'Total de servicios de operadores'; + + let rpt7_nombre_reporte = 'Total de servicios por vehiculos y precios totales'; + let rpt7_nombre_id = 'rpt_servicios_vehiculos_precios'; + let rpt7_etiquetas = 'Total de servicios: {point.y}
'+'Total de costo: ${point.costo:,.2f}'; + let rpt7_nombre_reporte_filename = 'Total de servicios por vehiculos y precios totales'; + + let rpt8_nombre_reporte = 'Capacidad aprovechada'; + let rpt8_nombre_id = 'rpt_capacidad_aprovechada_semanal'; + let rpt8_etiquetas = 'Total de servicios: {point.y}
'+'Total de costo: ${point.costo:,.2f}'; + let rpt8_nombre_reporte_filename = 'Capacidad aprovechada - semanal'; + + this.crearGraficaPastel(result.servicios_nombre_precios.servicios, rpt1_nombre_reporte, rpt1_nombre_id, rpt1_etiquetas, rpt1_nombre_reporte_filename); + this.crearGraficaPastel(result.tipos_servicios, rpt2_nombre_reporte, rpt2_nombre_id, rpt2_etiquetas, rpt2_nombre_reporte_filename); + this.crearGraficaPastel(result.tipos_estados_servicio, rpt3_nombre_reporte, rpt3_nombre_id, rpt3_etiquetas, rpt3_nombre_reporte_filename); + this.crearGraficaPastel(result.tipos_origen, rpt4_nombre_reporte, rpt4_nombre_id, rpt4_etiquetas, rpt4_nombre_reporte_filename); + this.crearGraficaBarras(result.atencion_cliente, rpt5_nombre_reporte, rpt5_nombre_id, rpt5_nombre_reporte_filename); + this.crearGraficaBarras(result.operadores, rpt6_nombre_reporte, rpt6_nombre_id, rpt6_nombre_reporte_filename); + this.crearGraficaPastel(result.servicios_vehiculos_precios, rpt7_nombre_reporte, rpt7_nombre_id, rpt7_etiquetas, rpt7_nombre_reporte_filename); + this.crearGraficaCapacidadAprovechada(result.capacidad_aprovechada, rpt8_nombre_reporte, rpt8_nombre_id, rpt8_nombre_reporte_filename); + } + + crearGraficaPastel(datos, nombre_reporte, id, etiquetas, filename) { + var datosFloat = []; + for(var i=0; i{point.name}
"+ + etiquetas, + style: { + color: (Highcharts.theme && Highcharts.theme.contrastTextColor) || '#404040' + } + } + } + }, + series: [{ + name: '', + data: datosFloat + }] + }); + } + + crearGraficaBarras(datos, nombre_reporte, id, filename) { + Highcharts.chart(id, { + chart: { + type: 'column' + }, + title: { + text: nombre_reporte + }, + exporting: { + buttons: { + contextButton: { + menuItems: [ + { + text: 'Generar PDF', + textKey: 'downloadPDF', + onclick: function () { + this.exportChart({ + type: 'application/pdf', + filename: 'Semanal ' + filename + }); + } + }, { + text: 'Generar PNG', + textKey: 'downloadPNG', + onclick: function () { + this.exportChart({ + type: 'image/png', + filename: 'Semanal ' + filename + }); + } + } + ] + } + }, + sourceWidth: 1920, + sourceHeight: 1080 + }, + credits: { + enabled: false + }, + subtitle: { + //text: 'Source: WorldClimate.com' + }, + xAxis: { + categories: datos.usuarios + }, + yAxis: { + tickInterval: 1, + min: 0, + title: { + text: 'Servicios' + } + }, + tooltip: { + headerFormat: '{point.key}', + pointFormat: '' + + '', + footerFormat: '
{series.name}: {point.y}
', + shared: true, + useHTML: true + }, + plotOptions: { + column: { + pointPadding: 0.2, + borderWidth: 0 + } + }, + series: datos.datos + }); + } + + crearGraficaCapacidadAprovechada(datos, nombre_reporte, id, filename) { + var datos_xAxis = []; + var datos_series = []; + + for(var i=0; i0 && parseFloat(datos[i].objetivo_mensual)>0){ + tmpCalculo = (parseFloat(datos[i].total_duracion_fracc)/parseFloat(datos[i].objetivo_semanal))*100; + } + + datos_xAxis.push(datos[i].tipo_vehiculo); + datos_series.push({name: datos[i].tipo_vehiculo, y: tmpCalculo}); + } + + Highcharts.chart(id, { + chart: { + type: 'column' + }, + title: { + text: nombre_reporte + }, + exporting: { + buttons: { + contextButton: { + menuItems: [{ + text: 'Generar PDF', + textKey: 'downloadPDF', + onclick: function () { + this.exportChart({ + type: 'application/pdf', + filename: filename + }); + } + }, { + text: 'Generar PNG', + textKey: 'downloadPNG', + onclick: function () { + this.exportChart({ + type: 'image/png', + filename: filename + }); + } + }] + } + }, + sourceWidth: 1920, + sourceHeight: 1080 + }, + credits: { + enabled: false + }, + subtitle: { + //text: 'Source: WorldClimate.com' + }, + xAxis: { + type: 'category' + }, + yAxis: { + //tickInterval: 10, + min: 0, + title: { + text: 'Cumplimiento Objetivo' + } + }, + legend: { + enabled: false + }, + tooltip: { + headerFormat: '{point.key}', + pointFormat: '' + + '', + footerFormat: '
Cumplimiento: {point.y}%
', + shared: true, + useHTML: true + }, + plotOptions: { + column: { + pointPadding: 0.2, + borderWidth: 0 + } + }, + series: [{ + name: "Tipos de Vehículo", + colorByPoint: true, + data: datos_series + }] + }); + } + + shuffleColor(arra1) { + var ctr = arra1.length, temp, index; + + while (ctr > 0) { + index = Math.floor(Math.random() * ctr); + ctr--; + temp = arra1[ctr]; + arra1[ctr] = arra1[index]; + arra1[index] = temp; + } + return arra1; + } + +} diff --git a/src/app/views/pages/reportes/productividad/modal-filtros-productividad/modal-filtros-productividad.component.html b/src/app/views/pages/reportes/productividad/modal-filtros-productividad/modal-filtros-productividad.component.html new file mode 100644 index 0000000..3c5366c --- /dev/null +++ b/src/app/views/pages/reportes/productividad/modal-filtros-productividad/modal-filtros-productividad.component.html @@ -0,0 +1,87 @@ +
+
+ +
+
+ +
+
+
+ Filtros +
+ +
+
+
+ + + {{filtro.nombre}} + + + Sucursal + + +
+ +
+ + + Todos + {{filtro.nombre}} + + + Definió + + +
+ +
+
+ + Fecha inicial + + + + + Fecha inicial + + +
+ +
+ + Fecha final + + + + + Fecha final + + +
+
+ +
+ + + ({{filtro.servicios_cantidad}} servicios) {{filtro.nombre}} {{filtro.apellido_paterno}} {{filtro.apellido_materno}} + + + Usuarios + + +
+
+
+ +
+ +
+
+
diff --git a/src/app/views/pages/reportes/productividad/modal-filtros-productividad/modal-filtros-productividad.component.scss b/src/app/views/pages/reportes/productividad/modal-filtros-productividad/modal-filtros-productividad.component.scss new file mode 100644 index 0000000..f639d29 --- /dev/null +++ b/src/app/views/pages/reportes/productividad/modal-filtros-productividad/modal-filtros-productividad.component.scss @@ -0,0 +1,68 @@ +.span-titulo { + text-align: center; + font-size: 1.6em; + font-weight: 600; + color: #404040; +} + +.c-titulo{ + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; + align-items: center; + align-content: center; + background-color: #19385E; +} + +.c-titulo div:last-child { + margin-left: auto; +} + +.c-modal{ + text-align:center; + margin-bottom: 5px; +} + +.button-filled{ + background-color: #E63C2D; + color: white; +} + +.button-filled:focus, .button-filled.focus { + color: #fff; + background-color: #e71b08; + border-color: #e71b08; + box-shadow: none; +} + +.button-filled:disabled { + color: rgba(0,0,0,.26) !important; +} + +.button-filled:hover:enabled { + color: #fff; + background-color: #e71b08; + border-color: #e71b08; +} + +.input-lit { + outline: 0; + background-color: #eaeaea; + border-width: 0 0 0px; + width: 50%; + height: 50px; + margin-left: 2px; + margin-right: 2px; + text-align: center; + font-size: 1.2em; +} + +.input-lit:focus { + border-width: 0 0 2px; + border-color: #313131; +} + +.input-lit::placeholder, .input-lit::-webkit-input-placeholder{ + font-size: 1.1em !important; +} diff --git a/src/app/views/pages/reportes/productividad/modal-filtros-productividad/modal-filtros-productividad.component.ts b/src/app/views/pages/reportes/productividad/modal-filtros-productividad/modal-filtros-productividad.component.ts new file mode 100644 index 0000000..593ffef --- /dev/null +++ b/src/app/views/pages/reportes/productividad/modal-filtros-productividad/modal-filtros-productividad.component.ts @@ -0,0 +1,150 @@ +import { ApiService } from './../../../../../core/api/api.service'; +import {ChangeDetectorRef, Component, Inject, OnInit} from '@angular/core'; +import {FormBuilder, FormControl, FormGroup, Validators} from "@angular/forms"; +import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from "@angular/material/dialog"; + +@Component({ + selector: 'kt-modal-filtros-productividad', + templateUrl: './modal-filtros-productividad.component.html', + styleUrls: ['./modal-filtros-productividad.component.scss'] +}) +export class ModalFiltrosProductividadComponent implements OnInit { + + form: FormGroup; + loading: boolean = false; + sucursales = null; + usuarios = []; + origenes = null; + startDate = null; + + filtroDefinio = [ + {id: '1', nombre: 'Definió cliente'}, + {id: '2', nombre: 'Definió atención a clientes'} + ]; + + addDays = (date: Date, days: number): Date => { + let result = new Date(date); + result.setDate(result.getDate() + days); + return result; + }; + + constructor(private fb: FormBuilder, + public dialog: MatDialog, + public dialogRef: MatDialogRef, + private api: ApiService, + private cdr: ChangeDetectorRef, + @Inject(MAT_DIALOG_DATA) public data: any) { + + this.initLoginForm(); + this.filtros(); + } + + ngOnInit() {} + + initLoginForm() { + let fechaInicio = this.data? this.addDays(new Date(this.data.fecha_inicio+'T00:00:00.000Z'), 1) : null; + let fechaFinal = this.data? this.addDays(new Date(this.data.fecha_final+'T00:00:00.000Z'), 1) : null; + let sucursal = this.data? this.data.sucursal : null; + let definio = this.data? this.data.definio : 0; + let usuario_id = this.data? this.data.usuario_id : null; + + this.form = this.fb.group({ + sucursal: new FormControl({value: sucursal, disabled: true}, [Validators.required]), + definio: new FormControl({value: definio, disabled: false}, [Validators.required]), + fecha_inicio: new FormControl({value: fechaInicio, disabled: false}, [Validators.required]), + fecha_final: new FormControl({value: fechaFinal, disabled: false}, [Validators.required]), + usuario_id: new FormControl({value: usuario_id, disabled: true}, [Validators.required]), + }); + } + + setFilters(){ + let data = this.form.value; + data.fecha_inicio = new Date(data.fecha_inicio).toLocaleDateString('en-CA'); + data.fecha_final = new Date(data.fecha_final).toLocaleDateString('en-CA'); + + let user = this.searchUserById(data.usuario_id); + data.user = user.nombre + ' ' + user.apellido_paterno + ' ' + user.apellido_materno; + + this.dialogRef.close(data); + } + + filtros(){ + this.loading = true; + this.api.reportesService.filtros('sucursales').subscribe(res => { + this.form.controls['sucursal'].enable(); + + this.sucursales = res.data; + + if(this.data) + this.getUsers(true); + + this.loading = false; + }, () => { + this.loading = false; + }); + } + + dateChanged(dateModal: any){ + if(dateModal){ + this.startDate = this.form.value.fecha_inicio; + this.form.get('fecha_final').reset(); + dateModal.open(); + } + + this.getUsers(); + } + + getUsers(reOpen = false){ + let sucursal = this.form.value.sucursal; + let definio = this.form.value.definio; + let fechaInicio = this.form.value.fecha_inicio; + let fechaFinal = this.form.value.fecha_final; + + if(sucursal && definio != null && fechaInicio && fechaFinal){ + this.changeStatusInputs(false); + this.loading = true; + this.usuarios = []; + + if(!reOpen) + this.form.get('usuario_id').reset(); + + let data = this.form.value; + data.fecha_inicio = new Date(data.fecha_inicio).toLocaleDateString('en-CA'); + data.fecha_final = new Date(data.fecha_final).toLocaleDateString('en-CA'); + + this.api.reportesService.getInformation('productividad/atencionclientes/usuarios', data).subscribe(res => { + this.usuarios = res.data; + this.changeStatusInputs(true); + this.loading = false; + this.cdr.detectChanges(); + }, () => { + this.changeStatusInputs(true); + this.loading = false; + }); + } + } + + changeStatusInputs(enable){ + if(enable){ + this.form.controls['sucursal'].enable(); + this.form.controls['definio'].enable(); + this.form.controls['fecha_inicio'].enable(); + this.form.controls['fecha_final'].enable(); + this.form.controls['usuario_id'].enable(); + }else{ + this.form.controls['sucursal'].disable(); + this.form.controls['definio'].disable(); + this.form.controls['fecha_inicio'].disable(); + this.form.controls['fecha_final'].disable(); + this.form.controls['usuario_id'].disable(); + } + } + + searchUserById(valor){ + let index = this.usuarios.findIndex((user => valor == user.id)); + if(index != -1){ + return this.usuarios[index]; + } + return false; + } +} diff --git a/src/app/views/pages/reportes/productividad/productividad.component.html b/src/app/views/pages/reportes/productividad/productividad.component.html new file mode 100644 index 0000000..b01a2ca --- /dev/null +++ b/src/app/views/pages/reportes/productividad/productividad.component.html @@ -0,0 +1,113 @@ + + +
+ +
+ +
+ +
+ +
+ +
+
+ + + +
+
+ +
+ + + + Núm. de solicitud + {{data.numero_solicitud}} + + + + Fecha del servicio + {{(data.fecha_servicio != null)? data.fecha_servicio : '-'}} + + + + Hora del servicio + {{(data.hora_servicio != null)? data.hora_servicio : '-'}} + + + + Servicio + {{(data.servicio != null)? data.servicio : '-'}} + + + + Costo de servicio + ${{ data.costo | number:'1.2-2'}} + + + + Tipo de servicio + {{(data.tipo_servicio != null)? data.tipo_servicio : '-'}} + + + + Estado de servicio + {{(data.estatus_servicio != null)? data.estatus_servicio : '-'}} + + + + Nombre del cliente + {{(data.nombre_cliente != null)? data.nombre_cliente : '-'}} + + + + Domicilio del servicio + {{(data.colonia_cliente != null)? data.calle_cliente + ' #' + data.num_ext_cliente + ', ' + data.colonia_cliente + ' C.P. ' + data.cp_cliente : '-'}} + + + + Asesor de operaciones + {{(data.nombre_asesor != null)? data.nombre_asesor + ' ' + data.apellido_paterno_asesor + ' ' + data.apellido_materno_asesor : '-'}} + + + + Auxiliar de operaciones + {{(data.nombre_auxiliar != null)? data.nombre_auxiliar + ' ' + data.apellido_paterno_auxiliar + ' ' + data.apellido_materno_auxiliar : '-'}} + + + + Vehículo asignado + {{(data.vehiculo != null)? data.vehiculo : '-'}} + + + + Duración del servicio + {{(data.duracion_servicio != null)? data.duracion_servicio : '-'}} + + + + + +
No es posible mostrar información sin seleccionar filtros.
+
No se encontraron registros.
+
Espera un momento....
+
+ +
+ + +
+ +
+ +
diff --git a/src/app/views/pages/reportes/productividad/productividad.component.scss b/src/app/views/pages/reportes/productividad/productividad.component.scss new file mode 100644 index 0000000..5e95c1b --- /dev/null +++ b/src/app/views/pages/reportes/productividad/productividad.component.scss @@ -0,0 +1,30 @@ +.table-responsive { + display: block; + width: 100%; + overflow-x: auto; + text-align: center; + z-index: 1; + mat-table { + width: 100%; + max-width: 100%; + margin-bottom: 1rem; + display: table; + border-collapse: collapse; + margin: 0px; + } + mat-row, + mat-header-row { + display: table-row; + } + mat-cell, + mat-header-cell { + word-wrap: initial; + display: table-cell; + padding: 0px 5px; + line-break: unset; + width: auto; + white-space: nowrap; + overflow: hidden; + vertical-align: middle; + } +} diff --git a/src/app/views/pages/reportes/productividad/productividad.component.spec.ts b/src/app/views/pages/reportes/productividad/productividad.component.spec.ts new file mode 100644 index 0000000..d59b457 --- /dev/null +++ b/src/app/views/pages/reportes/productividad/productividad.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ProductividadComponent } from './productividad.component'; + +describe('ProductividadComponent', () => { + let component: ProductividadComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ProductividadComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ProductividadComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/views/pages/reportes/productividad/productividad.component.ts b/src/app/views/pages/reportes/productividad/productividad.component.ts new file mode 100644 index 0000000..ab3da30 --- /dev/null +++ b/src/app/views/pages/reportes/productividad/productividad.component.ts @@ -0,0 +1,107 @@ +import { AfterViewInit, ChangeDetectorRef, Component, OnInit } from '@angular/core'; +import { MatDialog, MatTableDataSource } from '@angular/material'; +import { ApiService } from '../../../../core/api/api.service'; +import { ModalFiltrosProductividadComponent } from './modal-filtros-productividad/modal-filtros-productividad.component'; +import { ProductividadModel } from './productividad.model'; + +@Component({ + selector: 'kt-productividad', + templateUrl: './productividad.component.html', + styleUrls: ['./productividad.component.scss'] +}) +export class ProductividadComponent implements OnInit, AfterViewInit { + + titulo = 'Reporte de productividad atención a clientes'; + + displayedColumns: string[] = ['numero_solicitud', 'fecha_servicio', 'hora_servicio', 'servicio', 'costo', 'tipo_servicio', 'estatus_servicio', 'nombre_cliente', 'colonia_cliente', 'nombre_asesor', 'nombre_auxiliar', 'vehiculo', 'duracion_servicio']; + dataSource: MatTableDataSource; + + //Loadings + isLoading = false; + showMessageWait = false; + showMessageSetFilters = true; + + //Paginator, Searcher + page = '1'; + perPage = '10'; + total = 0; + sortBy = 'denominacion'; + order = 'asc'; + pages = [10, 25, 50, 100]; + deleted = '0'; + + data = null; + + constructor(private api: ApiService, private ref: ChangeDetectorRef, private dialog: MatDialog) { + this.dataSource = new MatTableDataSource(); + } + + ngOnInit() { + } + + getInformation(excel = false){ + if(this.data){ + this.isLoading = true; + this.showMessageWait = true; + + let url = excel? 'productividad/atencionclientes/excel' : 'productividad/atencionclientes'; + + this.api.reportesService.getInformation(url, this.data, this.page, this.perPage, this.deleted).subscribe(res => { + + this.isLoading = false; + this.showMessageWait = false; + + if(excel){ + if (res.nombre_archivo) { + document.location.href = this.api.reportesService.baseUrlStorage + 'productividad_atencion_clientes/' + res.nombre_archivo; + } + }else{ + this.dataSource.data = []; + + this.dataSource.data = res.data; + this.total = res.total; + } + + this.ref.detectChanges(); + }, () => { + this.isLoading = false; + this.showMessageWait = false; + }); + } + } + + filters(){ + const dialogRef = this.dialog.open(ModalFiltrosProductividadComponent, { + data: this.data, + disableClose: true + }); + + dialogRef.afterClosed().subscribe(data => { + if(data){ + this.showMessageSetFilters = false; + this.data = data; + this.dataSource.data = []; + this.titulo = 'Reporte de productividad atención a clientes (' + data.user + ')'; + this.getInformation(); + } + }); + } + + sort(event) { + this.order = event.direction; + this.sortBy = event.active; + this.getInformation(); + } + + + paginator(event) { + let nextPage = event.pageIndex + 1; + this.page = nextPage.toString(); + this.perPage = event.pageSize.toString(); + this.getInformation(); + } + + ngAfterViewInit() { + this.filters(); + } +} diff --git a/src/app/views/pages/reportes/productividad/productividad.model.ts b/src/app/views/pages/reportes/productividad/productividad.model.ts new file mode 100644 index 0000000..a1ade4c --- /dev/null +++ b/src/app/views/pages/reportes/productividad/productividad.model.ts @@ -0,0 +1,30 @@ +export class ProductividadModel { + apellido_materno_asesor: string; + apellido_materno_auxiliar: string; + apellido_paterno_asesor: string; + apellido_paterno_auxiliar: string; + calle_cliente: string; + ciudad_cliente: string; + colonia_cliente: string; + costo: string; + cp_cliente: string; + diferencia: string; + duracion_servicio: string; + entre_calles_cliente: string; + estatus_servicio: string; + fecha_inicio_servicio: string; + fecha_servicio: string; + hora_inicio_servicio: string; + hora_servicio: string; + litraje: string; + nombre_asesor: string; + nombre_auxiliar: string; + nombre_cliente: string; + num_ext_cliente: string; + num_int_cliente: string; + numero_solicitud: string; + origen: string; + servicio: string; + tipo_servicio: string; + vehiculo: string; +} diff --git a/src/app/views/pages/reportes/reportes.module.ts b/src/app/views/pages/reportes/reportes.module.ts new file mode 100644 index 0000000..e7807dd --- /dev/null +++ b/src/app/views/pages/reportes/reportes.module.ts @@ -0,0 +1,155 @@ +import {NgModule} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {PartialsModule} from '../../partials/partials.module'; +import {CoreModule} from '../../../core/core.module'; +import {RouterModule} from '@angular/router'; +import { + MAT_DIALOG_DEFAULT_OPTIONS, + MatAutocompleteModule, + MatButtonModule, + MatCardModule, + MatCheckboxModule, + MatDatepickerModule, + MatDialogModule, + MatExpansionModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatMenuModule, + MatNativeDateModule, + MatPaginatorModule, + MatProgressBarModule, + MatProgressSpinnerModule, + MatRadioModule, + MatSelectModule, + MatSnackBarModule, + MatSortModule, + MatTableModule, + MatTabsModule, + MatTooltipModule +} from '@angular/material'; +import {FormsModule, ReactiveFormsModule} from '@angular/forms'; +import {NgxPermissionsModule} from 'ngx-permissions'; +import {HttpUtilsService, InterceptService, LayoutUtilsService, TypesUtilsService} from '../../../core/_base/crud'; +import {HTTP_INTERCEPTORS} from '@angular/common/http'; +import {ActionNotificationComponent, DeleteEntityDialogComponent} from '../../partials/content/crud'; +import { ServiciosComponent } from './servicios/servicios.component'; +import { ProductividadComponent } from './productividad/productividad.component'; +import { ServiciosAsesorComponent } from './servicios-asesor/servicios-asesor.component'; +import { ServiciosClienteComponent } from './servicios-cliente/servicios-cliente.component'; +import { CapacidadAprovechadaComponent } from './capacidad-aprovechada/capacidad-aprovechada.component'; +import { SemanalComponent } from './semanal/semanal.component'; +import { MensualComponent } from './mensual/mensual.component'; +import { ModalFiltrosServiciosComponent } from './servicios/modal-filtros-servicios/modal-filtros-servicios.component'; +import { ModalFiltrosProductividadComponent } from './productividad/modal-filtros-productividad/modal-filtros-productividad.component'; +import { ModalFiltrosServiciosAsesorComponent } from './servicios-asesor/modal-filtros-servicios-asesor/modal-filtros-servicios-asesor.component'; +import { ModalFiltrosServiciosClienteComponent } from './servicios-cliente/modal-filtros-servicios-cliente/modal-filtros-servicios-cliente.component'; +import { ModalFiltrosCapacidadAprovechadaComponent } from './capacidad-aprovechada/modal-filtros-capacidad-aprovechada/modal-filtros-capacidad-aprovechada.component'; + +@NgModule({ + declarations: [ + ServiciosComponent, + ProductividadComponent, + ServiciosAsesorComponent, + ServiciosClienteComponent, + CapacidadAprovechadaComponent, + SemanalComponent, + MensualComponent, + ModalFiltrosServiciosComponent, + ModalFiltrosProductividadComponent, + ModalFiltrosServiciosAsesorComponent, + ModalFiltrosServiciosClienteComponent, + ModalFiltrosCapacidadAprovechadaComponent + ], + imports: [ + CommonModule, + PartialsModule, + CoreModule, + RouterModule.forChild([ + { + path: 'servicios', + component: ServiciosComponent + }, + { + path: 'productividad', + component: ProductividadComponent + }, + { + path: 'servicios-asesor', + component: ServiciosAsesorComponent + }, + { + path: 'servicios-cliente', + component: ServiciosClienteComponent + }, + { + path: 'capacidad-aprovechada', + component: CapacidadAprovechadaComponent + }, + { + path: 'semanal', + component: SemanalComponent + }, + { + path: 'mensual', + component: MensualComponent + }, + ]), + MatButtonModule, + MatTooltipModule, + MatFormFieldModule, + MatInputModule, + MatSelectModule, + MatIconModule, + MatTableModule, + MatMenuModule, + MatCheckboxModule, + MatSortModule, + MatProgressSpinnerModule, + MatPaginatorModule, + FormsModule, + ReactiveFormsModule, + MatAutocompleteModule, + MatRadioModule, + MatNativeDateModule, + MatProgressBarModule, + MatDatepickerModule, + MatCardModule, + MatSnackBarModule, + MatExpansionModule, + MatTabsModule, + MatDialogModule, + NgxPermissionsModule + ], + providers: [ + InterceptService, + { + provide: HTTP_INTERCEPTORS, + useClass: InterceptService, + multi: true + }, + { + provide: MAT_DIALOG_DEFAULT_OPTIONS, + useValue: { + hasBackdrop: true, + panelClass: 'kt-mat-dialog-container__wrapper', + height: 'auto', + width: '900px' + } + }, + HttpUtilsService, + TypesUtilsService, + LayoutUtilsService, + ], + entryComponents: [ + DeleteEntityDialogComponent, + ActionNotificationComponent, + ModalFiltrosServiciosComponent, + ModalFiltrosProductividadComponent, + ModalFiltrosServiciosAsesorComponent, + ModalFiltrosServiciosClienteComponent, + ModalFiltrosCapacidadAprovechadaComponent + ] +}) + +export class ReportesModule { } diff --git a/src/app/views/pages/reportes/reportes.service.ts b/src/app/views/pages/reportes/reportes.service.ts new file mode 100644 index 0000000..eff128b --- /dev/null +++ b/src/app/views/pages/reportes/reportes.service.ts @@ -0,0 +1,54 @@ +import {Injectable} from '@angular/core'; +import {HttpClient, HttpParams} from '@angular/common/http'; +import { isNullOrUndefined } from 'util'; +import { catchError } from 'rxjs/operators'; +import { Observable } from 'rxjs'; +import { ResourceBase } from '../../../core/api/resource'; +import { environment } from '../../../../environments/environment'; + +@Injectable({ + providedIn: 'root' +}) +export class ReportesService extends ResourceBase { + + baseUrl = environment.API + 'reportes/'; + baseUrlStorage = environment.STORAGE + 'reportes/'; + + constructor(public http: HttpClient) { + super(http, ''); + } + + public getInformation(url: string, body: any, page = '1', perPage = '9999', deleted_at = '0'): Observable { + + const params = new HttpParams() + .set('page', isNullOrUndefined(page) ? '1' : page) + .set('perPage', isNullOrUndefined(perPage) ? '10' : perPage) + .set('deleted', isNullOrUndefined(deleted_at) ? '0' : deleted_at); + + const options = {params: params}; + + return this.http.post(this.baseUrl + url, body, options).pipe( + catchError(this.handleError('create')) + ); + } + + public filtros(url: string, page: string = '1', perPage: string = '9999', deleted_at: string = '0'): Observable { + + const params = new HttpParams() + .set('page', isNullOrUndefined(page) ? '1' : page) + .set('perPage', isNullOrUndefined(perPage) ? '10' : perPage) + .set('deleted', isNullOrUndefined(deleted_at) ? '0' : deleted_at); + + const options = {params: params}; + + return this.http.get(this.baseUrl + 'filtros/' + url, options).pipe( + catchError(this.handleError('index')) + ); + } + + public getChartReports($url){ + return this.http.get(this.baseUrl + 'reporte/' + $url).pipe( + catchError(this.handleError('index')) + ); + } +} diff --git a/src/app/views/pages/reportes/semanal/semanal.component.html b/src/app/views/pages/reportes/semanal/semanal.component.html new file mode 100644 index 0000000..f514a6a --- /dev/null +++ b/src/app/views/pages/reportes/semanal/semanal.component.html @@ -0,0 +1,37 @@ + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+ + Espere un momento... +
diff --git a/src/app/views/pages/reportes/semanal/semanal.component.scss b/src/app/views/pages/reportes/semanal/semanal.component.scss new file mode 100644 index 0000000..ba1c561 --- /dev/null +++ b/src/app/views/pages/reportes/semanal/semanal.component.scss @@ -0,0 +1,25 @@ +.card { + box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2); + transition: 0.3s; + padding: 2%; + border-radius: 8px; + margin-bottom: 50px +} + +.card:hover { + box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2); +} + +.container { + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + gap: 20px; +} + +.spinner-text { + font-size: 1.2em; +} diff --git a/src/app/views/pages/reportes/semanal/semanal.component.spec.ts b/src/app/views/pages/reportes/semanal/semanal.component.spec.ts new file mode 100644 index 0000000..3f4bd69 --- /dev/null +++ b/src/app/views/pages/reportes/semanal/semanal.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SemanalComponent } from './semanal.component'; + +describe('SemanalComponent', () => { + let component: SemanalComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SemanalComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SemanalComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/views/pages/reportes/semanal/semanal.component.ts b/src/app/views/pages/reportes/semanal/semanal.component.ts new file mode 100644 index 0000000..6142ec1 --- /dev/null +++ b/src/app/views/pages/reportes/semanal/semanal.component.ts @@ -0,0 +1,364 @@ +import { ChangeDetectorRef, Component, OnInit } from '@angular/core'; +import { ApiService } from '../../../../core/api/api.service.js'; + +declare var require: any; +var Highcharts = require('highcharts'); +require('highcharts/modules/exporting')(Highcharts); +require('highcharts/modules/export-data')(Highcharts); + +@Component({ + selector: 'kt-semanal', + templateUrl: './semanal.component.html', + styleUrls: ['./semanal.component.scss'], +}) + +export class SemanalComponent implements OnInit { + + titulo = 'Reporte semanal'; + colores = ['#fecd6c','#d7ad5b','#a98847','#7b6333','#77c298','#5c9675','#367f56','#165532','#718dbf','#5c729a','#364f7b','#193059','#a4547d','#7e4060','#6b274a','#521333','#e84d60','#c24050','#9a333f','#761e28','#570b15','#000000','#363636','#4a4a4a','#5e5e5e','#787878','#9a9a9a','#f1001e','#e800f1']; + isLoading = true; + + constructor(private api: ApiService, private ref: ChangeDetectorRef) {} + + ngOnInit() { + this.getInformation(); + } + + getInformation(){ + this.isLoading = true; + this.api.reportesService.getChartReports('semanal').subscribe(res => { + this.isLoading = false; + this.showCharts(res); + this.ref.detectChanges(); + }, () => { + this.isLoading = false; + }); + } + + setChartConfig(){ + let coloresRandom = this.shuffleColor(this.colores); + + Highcharts.setOptions({ + colors: Highcharts.map(coloresRandom, function (color) { + return { + radialGradient: { + cx: 0.5, + cy: 0.3, + r: 0.7 + }, + stops: [ + [0, color], + [1, Highcharts.Color(color).brighten(-0.2).get('rgb')] // darken + ] + }; + }), + lang: { + decimalPoint: '.', + thousandsSep: ',' + } + }); + } + + showCharts(result){ + + let rpt1_nombre_reporte = 'Total de servicios por nombre y precios totales'; + let rpt1_nombre_id = 'rpt_servicios_nombre_precios'; + let rpt1_etiquetas = 'Total de servicios: {point.y}
'+'Total de costo: ${point.costo:,.2f}'; + let rpt1_nombre_reporte_filename = 'Total de servicios por nombre y precios totales'; + + let rpt2_nombre_reporte = 'Total de tipos de servicio'; + let rpt2_nombre_id = 'rpt_tipos_servicios'; + let rpt2_etiquetas = 'Total de servicios: {point.y}'; + let rpt2_nombre_reporte_filename = 'Total de tipos de servicio'; + + let rpt3_nombre_reporte = 'Total de estados de servicio'; + let rpt3_nombre_id = 'rpt_tipos_estados_servicios'; + let rpt3_etiquetas = 'Total de servicios: {point.y}'; + let rpt3_nombre_reporte_filename = 'Total de estados de servicio'; + + let rpt4_nombre_reporte = 'Total de origenes'; + let rpt4_nombre_id = 'rpt_tipos_origenes'; + let rpt4_etiquetas = 'Total de servicios: {point.y}'; + let rpt4_nombre_reporte_filename = 'Total de origenes'; + + let rpt5_nombre_reporte = 'Total de servicios de atención a cliente'; + let rpt5_nombre_id = 'rpt_atencion_cliente'; + let rpt5_nombre_reporte_filename = 'Total de servicios de atención a cliente'; + + let rpt6_nombre_reporte = 'Total de servicios de operadores'; + let rpt6_nombre_id = 'rpt_operadores'; + let rpt6_nombre_reporte_filename = 'Total de servicios de operadores'; + + let rpt7_nombre_reporte = 'Total de servicios por vehiculos y precios totales'; + let rpt7_nombre_id = 'rpt_servicios_vehiculos_precios'; + let rpt7_etiquetas = 'Total de servicios: {point.y}
'+'Total de costo: ${point.costo:,.2f}'; + let rpt7_nombre_reporte_filename = 'Total de servicios por vehiculos y precios totales'; + + let rpt8_nombre_reporte = 'Capacidad aprovechada'; + let rpt8_nombre_id = 'rpt_capacidad_aprovechada_semanal'; + let rpt8_etiquetas = 'Total de servicios: {point.y}
'+'Total de costo: ${point.costo:,.2f}'; + let rpt8_nombre_reporte_filename = 'Capacidad aprovechada - semanal'; + + this.crearGraficaPastel(result.servicios_nombre_precios.servicios, rpt1_nombre_reporte, rpt1_nombre_id, rpt1_etiquetas, rpt1_nombre_reporte_filename); + this.crearGraficaPastel(result.tipos_servicios, rpt2_nombre_reporte, rpt2_nombre_id, rpt2_etiquetas, rpt2_nombre_reporte_filename); + this.crearGraficaPastel(result.tipos_estados_servicio, rpt3_nombre_reporte, rpt3_nombre_id, rpt3_etiquetas, rpt3_nombre_reporte_filename); + this.crearGraficaPastel(result.tipos_origen, rpt4_nombre_reporte, rpt4_nombre_id, rpt4_etiquetas, rpt4_nombre_reporte_filename); + this.crearGraficaBarras(result.atencion_cliente, rpt5_nombre_reporte, rpt5_nombre_id, rpt5_nombre_reporte_filename); + this.crearGraficaBarras(result.operadores, rpt6_nombre_reporte, rpt6_nombre_id, rpt6_nombre_reporte_filename); + this.crearGraficaPastel(result.servicios_vehiculos_precios, rpt7_nombre_reporte, rpt7_nombre_id, rpt7_etiquetas, rpt7_nombre_reporte_filename); + this.crearGraficaCapacidadAprovechada(result.capacidad_aprovechada, rpt8_nombre_reporte, rpt8_nombre_id, rpt8_nombre_reporte_filename); + } + + crearGraficaPastel(datos, nombre_reporte, id, etiquetas, filename) { + var datosFloat = []; + for(var i=0; i{point.name}
"+ + etiquetas, + style: { + color: (Highcharts.theme && Highcharts.theme.contrastTextColor) || '#404040' + } + } + } + }, + series: [{ + name: '', + data: datosFloat + }] + }); + } + + crearGraficaBarras(datos, nombre_reporte, id, filename) { + Highcharts.chart(id, { + chart: { + type: 'column' + }, + title: { + text: nombre_reporte + }, + exporting: { + buttons: { + contextButton: { + menuItems: [ + { + text: 'Generar PDF', + textKey: 'downloadPDF', + onclick: function () { + this.exportChart({ + type: 'application/pdf', + filename: 'Semanal ' + filename + }); + } + }, { + text: 'Generar PNG', + textKey: 'downloadPNG', + onclick: function () { + this.exportChart({ + type: 'image/png', + filename: 'Semanal ' + filename + }); + } + } + ] + } + }, + sourceWidth: 1920, + sourceHeight: 1080 + }, + credits: { + enabled: false + }, + subtitle: { + //text: 'Source: WorldClimate.com' + }, + xAxis: { + categories: datos.usuarios + }, + yAxis: { + tickInterval: 1, + min: 0, + title: { + text: 'Servicios' + } + }, + tooltip: { + headerFormat: '{point.key}', + pointFormat: '' + + '', + footerFormat: '
{series.name}: {point.y}
', + shared: true, + useHTML: true + }, + plotOptions: { + column: { + pointPadding: 0.2, + borderWidth: 0 + } + }, + series: datos.datos + }); + } + + crearGraficaCapacidadAprovechada(datos, nombre_reporte, id, filename) { + var datos_xAxis = []; + var datos_series = []; + + for(var i=0; i0 && parseFloat(datos[i].objetivo_mensual)>0){ + tmpCalculo = (parseFloat(datos[i].total_duracion_fracc)/parseFloat(datos[i].objetivo_semanal))*100; + } + + datos_xAxis.push(datos[i].tipo_vehiculo); + datos_series.push({name: datos[i].tipo_vehiculo, y: tmpCalculo}); + } + + Highcharts.chart(id, { + chart: { + type: 'column' + }, + title: { + text: nombre_reporte + }, + exporting: { + buttons: { + contextButton: { + menuItems: [{ + text: 'Generar PDF', + textKey: 'downloadPDF', + onclick: function () { + this.exportChart({ + type: 'application/pdf', + filename: filename + }); + } + }, { + text: 'Generar PNG', + textKey: 'downloadPNG', + onclick: function () { + this.exportChart({ + type: 'image/png', + filename: filename + }); + } + }] + } + }, + sourceWidth: 1920, + sourceHeight: 1080 + }, + credits: { + enabled: false + }, + subtitle: { + //text: 'Source: WorldClimate.com' + }, + xAxis: { + type: 'category' + }, + yAxis: { + //tickInterval: 10, + min: 0, + title: { + text: 'Cumplimiento Objetivo' + } + }, + legend: { + enabled: false + }, + tooltip: { + headerFormat: '{point.key}', + pointFormat: '' + + '', + footerFormat: '
Cumplimiento: {point.y}%
', + shared: true, + useHTML: true + }, + plotOptions: { + column: { + pointPadding: 0.2, + borderWidth: 0 + } + }, + series: [{ + name: "Tipos de Vehículo", + colorByPoint: true, + data: datos_series + }] + }); + } + + shuffleColor(arra1) { + var ctr = arra1.length, temp, index; + + while (ctr > 0) { + index = Math.floor(Math.random() * ctr); + ctr--; + temp = arra1[ctr]; + arra1[ctr] = arra1[index]; + arra1[index] = temp; + } + return arra1; + } +} diff --git a/src/app/views/pages/reportes/servicios-asesor/modal-filtros-servicios-asesor/modal-filtros-servicios-asesor.component.html b/src/app/views/pages/reportes/servicios-asesor/modal-filtros-servicios-asesor/modal-filtros-servicios-asesor.component.html new file mode 100644 index 0000000..d5a89d4 --- /dev/null +++ b/src/app/views/pages/reportes/servicios-asesor/modal-filtros-servicios-asesor/modal-filtros-servicios-asesor.component.html @@ -0,0 +1,75 @@ +
+
+ +
+
+ +
+
+
+ Filtros +
+ +
+
+
+ + + {{filtro.nombre}} + + + Sucursal + + +
+ +
+
+ + Fecha inicial + + + + + Fecha inicial + + +
+ +
+ + Fecha final + + + + + Fecha final + + +
+
+ +
+ + + ({{filtro.servicios_cantidad}} servicios) {{filtro.nombre}} {{filtro.apellido_paterno}} {{filtro.apellido_materno}} - {{filtro.tipo_empleado}} + + + Usuarios + + +
+
+
+ +
+ +
+
+
diff --git a/src/app/views/pages/reportes/servicios-asesor/modal-filtros-servicios-asesor/modal-filtros-servicios-asesor.component.scss b/src/app/views/pages/reportes/servicios-asesor/modal-filtros-servicios-asesor/modal-filtros-servicios-asesor.component.scss new file mode 100644 index 0000000..f639d29 --- /dev/null +++ b/src/app/views/pages/reportes/servicios-asesor/modal-filtros-servicios-asesor/modal-filtros-servicios-asesor.component.scss @@ -0,0 +1,68 @@ +.span-titulo { + text-align: center; + font-size: 1.6em; + font-weight: 600; + color: #404040; +} + +.c-titulo{ + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; + align-items: center; + align-content: center; + background-color: #19385E; +} + +.c-titulo div:last-child { + margin-left: auto; +} + +.c-modal{ + text-align:center; + margin-bottom: 5px; +} + +.button-filled{ + background-color: #E63C2D; + color: white; +} + +.button-filled:focus, .button-filled.focus { + color: #fff; + background-color: #e71b08; + border-color: #e71b08; + box-shadow: none; +} + +.button-filled:disabled { + color: rgba(0,0,0,.26) !important; +} + +.button-filled:hover:enabled { + color: #fff; + background-color: #e71b08; + border-color: #e71b08; +} + +.input-lit { + outline: 0; + background-color: #eaeaea; + border-width: 0 0 0px; + width: 50%; + height: 50px; + margin-left: 2px; + margin-right: 2px; + text-align: center; + font-size: 1.2em; +} + +.input-lit:focus { + border-width: 0 0 2px; + border-color: #313131; +} + +.input-lit::placeholder, .input-lit::-webkit-input-placeholder{ + font-size: 1.1em !important; +} diff --git a/src/app/views/pages/reportes/servicios-asesor/modal-filtros-servicios-asesor/modal-filtros-servicios-asesor.component.ts b/src/app/views/pages/reportes/servicios-asesor/modal-filtros-servicios-asesor/modal-filtros-servicios-asesor.component.ts new file mode 100644 index 0000000..e455700 --- /dev/null +++ b/src/app/views/pages/reportes/servicios-asesor/modal-filtros-servicios-asesor/modal-filtros-servicios-asesor.component.ts @@ -0,0 +1,140 @@ +import { ApiService } from './../../../../../core/api/api.service'; +import {ChangeDetectorRef, Component, Inject, OnInit} from '@angular/core'; +import {FormBuilder, FormControl, FormGroup, Validators} from "@angular/forms"; +import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from "@angular/material/dialog"; + +@Component({ + selector: 'kt-modal-filtros-servicios-asesor', + templateUrl: './modal-filtros-servicios-asesor.component.html', + styleUrls: ['./modal-filtros-servicios-asesor.component.scss'] +}) +export class ModalFiltrosServiciosAsesorComponent implements OnInit { + + form: FormGroup; + loading: boolean = false; + sucursales = null; + usuarios = []; + origenes = null; + startDate = null; + + addDays = (date: Date, days: number): Date => { + let result = new Date(date); + result.setDate(result.getDate() + days); + return result; + }; + + constructor(private fb: FormBuilder, + public dialog: MatDialog, + public dialogRef: MatDialogRef, + private api: ApiService, + private cdr: ChangeDetectorRef, + @Inject(MAT_DIALOG_DATA) public data: any) { + + this.initLoginForm(); + this.filtros(); + } + + ngOnInit() {} + + initLoginForm() { + let fechaInicio = this.data? this.addDays(new Date(this.data.fecha_inicio+'T00:00:00.000Z'), 1) : null; + let fechaFinal = this.data? this.addDays(new Date(this.data.fecha_final+'T00:00:00.000Z'), 1) : null; + let sucursal = this.data? this.data.sucursal : null; + let usuario_id = this.data? this.data.usuario_id : null; + + this.form = this.fb.group({ + sucursal: new FormControl({value: sucursal, disabled: true}, [Validators.required]), + fecha_inicio: new FormControl({value: fechaInicio, disabled: false}, [Validators.required]), + fecha_final: new FormControl({value: fechaFinal, disabled: false}, [Validators.required]), + usuario_id: new FormControl({value: usuario_id, disabled: true}, [Validators.required]), + }); + } + + setFilters(){ + let data = this.form.value; + data.fecha_inicio = new Date(data.fecha_inicio).toLocaleDateString('en-CA'); + data.fecha_final = new Date(data.fecha_final).toLocaleDateString('en-CA'); + + let user = this.searchUserById(data.usuario_id); + data.user = user.nombre + ' ' + user.apellido_paterno + ' ' + user.apellido_materno; + + this.dialogRef.close(data); + } + + filtros(){ + this.loading = true; + this.api.reportesService.filtros('sucursales').subscribe(res => { + this.form.controls['sucursal'].enable(); + + this.sucursales = res.data; + + if(this.data) + this.getUsers(true); + + this.loading = false; + }, () => { + this.loading = false; + }); + } + + dateChanged(dateModal: any){ + if(dateModal){ + this.startDate = this.form.value.fecha_inicio; + this.form.get('fecha_final').reset(); + dateModal.open(); + } + + this.getUsers(); + } + + getUsers(reOpen = false){ + let sucursal = this.form.value.sucursal; + let fechaInicio = this.form.value.fecha_inicio; + let fechaFinal = this.form.value.fecha_final; + + if(sucursal && fechaInicio && fechaFinal){ + this.changeStatusInputs(false); + this.loading = true; + this.usuarios = []; + + if(!reOpen) + this.form.get('usuario_id').reset(); + + let data = this.form.value; + data.fecha_inicio = new Date(data.fecha_inicio).toLocaleDateString('en-CA'); + data.fecha_final = new Date(data.fecha_final).toLocaleDateString('en-CA'); + + this.api.reportesService.getInformation('servicios/asesores/usuarios', data).subscribe(res => { + this.usuarios = res.data; + this.changeStatusInputs(true); + this.loading = false; + this.cdr.detectChanges(); + }, () => { + this.changeStatusInputs(true); + this.loading = false; + }); + } + } + + changeStatusInputs(enable){ + if(enable){ + this.form.controls['sucursal'].enable(); + this.form.controls['fecha_inicio'].enable(); + this.form.controls['fecha_final'].enable(); + this.form.controls['usuario_id'].enable(); + }else{ + this.form.controls['sucursal'].disable(); + this.form.controls['fecha_inicio'].disable(); + this.form.controls['fecha_final'].disable(); + this.form.controls['usuario_id'].disable(); + } + } + + searchUserById(valor){ + let index = this.usuarios.findIndex((user => valor == user.id)); + if(index != -1){ + return this.usuarios[index]; + } + return false; + } +} diff --git a/src/app/views/pages/reportes/servicios-asesor/servicios-asesor.component.html b/src/app/views/pages/reportes/servicios-asesor/servicios-asesor.component.html new file mode 100644 index 0000000..470df9d --- /dev/null +++ b/src/app/views/pages/reportes/servicios-asesor/servicios-asesor.component.html @@ -0,0 +1,112 @@ + + +
+ +
+ +
+ +
+ +
+ +
+
+ + + +
+
+
Totales ({{totalServicios}})
+
{{totalDuracion}}
+
+
+ +
+ + + + Núm. de solicitud + {{data.numero_solicitud}} + + + + Fecha del servicio + {{(data.fecha_servicio != null)? data.fecha_servicio : '-'}} + + + + Hora del servicio + {{(data.hora_servicio != null)? data.hora_servicio : '-'}} + + + + Servicio + {{(data.servicio != null)? data.servicio : '-'}} + + + + Costo de servicio + ${{ data.costo | number:'1.2-2'}} + + + + Tipo de servicio + {{(data.tipo_servicio != null)? data.tipo_servicio : '-'}} + + + + Estado de servicio + {{(data.estatus_servicio != null)? data.estatus_servicio : '-'}} + + + + Nombre del cliente + {{(data.nombre_cliente != null)? data.nombre_cliente : '-'}} + + + + Domicilio del servicio + {{(data.colonia_cliente != null)? data.calle_cliente + ' #' + data.num_ext_cliente + ', ' + data.colonia_cliente + ' C.P. ' + data.cp_cliente : '-'}} + + + + Vehículo asignado + {{(data.vehiculo != null)? data.vehiculo : '-'}} + + + + Duración del servicio + {{(data.duracion_servicio != null)? data.duracion_servicio : '-'}} + + + + Litraje + {{(data.litraje != null)? data.litraje : '-'}} + + + + + +
No es posible mostrar información sin seleccionar filtros.
+
No se encontraron registros.
+
Espera un momento....
+
+ +
+ + +
+ +
+ +
diff --git a/src/app/views/pages/reportes/servicios-asesor/servicios-asesor.component.scss b/src/app/views/pages/reportes/servicios-asesor/servicios-asesor.component.scss new file mode 100644 index 0000000..9ea7320 --- /dev/null +++ b/src/app/views/pages/reportes/servicios-asesor/servicios-asesor.component.scss @@ -0,0 +1,44 @@ +.container-detail { + display: flex; + flex-direction: row; + justify-content: flex-end; + flex-flow: row wrap; + text-align-last: right; +} + +.row-detail { + font-size: 1.2em; + font-weight: 500; + color: #00000094; +} + +.table-responsive { + display: block; + width: 100%; + overflow-x: auto; + text-align: center; + z-index: 1; + mat-table { + width: 100%; + max-width: 100%; + margin-bottom: 1rem; + display: table; + border-collapse: collapse; + margin: 0px; + } + mat-row, + mat-header-row { + display: table-row; + } + mat-cell, + mat-header-cell { + word-wrap: initial; + display: table-cell; + padding: 0px 5px; + line-break: unset; + width: auto; + white-space: nowrap; + overflow: hidden; + vertical-align: middle; + } +} diff --git a/src/app/views/pages/reportes/servicios-asesor/servicios-asesor.component.spec.ts b/src/app/views/pages/reportes/servicios-asesor/servicios-asesor.component.spec.ts new file mode 100644 index 0000000..9ca47cb --- /dev/null +++ b/src/app/views/pages/reportes/servicios-asesor/servicios-asesor.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ServiciosAsesorComponent } from './servicios-asesor.component'; + +describe('ServiciosAsesorComponent', () => { + let component: ServiciosAsesorComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ServiciosAsesorComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ServiciosAsesorComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/views/pages/reportes/servicios-asesor/servicios-asesor.component.ts b/src/app/views/pages/reportes/servicios-asesor/servicios-asesor.component.ts new file mode 100644 index 0000000..cb141d2 --- /dev/null +++ b/src/app/views/pages/reportes/servicios-asesor/servicios-asesor.component.ts @@ -0,0 +1,112 @@ +import { AfterViewInit, ChangeDetectorRef, Component, OnInit } from '@angular/core'; +import { MatDialog, MatTableDataSource } from '@angular/material'; +import { ApiService } from '../../../../core/api/api.service'; +import { ModalFiltrosServiciosAsesorComponent } from './modal-filtros-servicios-asesor/modal-filtros-servicios-asesor.component'; +import { ServiciosAsesorModel } from './servicios-asesor.model'; + +@Component({ + selector: 'kt-servicios-asesor', + templateUrl: './servicios-asesor.component.html', + styleUrls: ['./servicios-asesor.component.scss'] +}) +export class ServiciosAsesorComponent implements OnInit, AfterViewInit { + + titulo = 'Reporte de servicios otorgados asesor'; + + displayedColumns: string[] = ['numero_solicitud', 'fecha_servicio', 'hora_servicio', 'servicio', 'costo', 'tipo_servicio', 'estatus_servicio', 'nombre_cliente', 'colonia_cliente', 'vehiculo', 'duracion_servicio', 'litraje']; + dataSource: MatTableDataSource; + + //Loadings + isLoading = false; + showMessageWait = false; + showMessageSetFilters = true; + + //Paginator, Searcher + page = '1'; + perPage = '10'; + total = 0; + sortBy = 'denominacion'; + order = 'asc'; + pages = [10, 25, 50, 100]; + deleted = '0'; + + data = null; + totalServicios = 0; + totalDuracion = '00hr 00m 00s' + + constructor(private api: ApiService, private ref: ChangeDetectorRef, private dialog: MatDialog) { + this.dataSource = new MatTableDataSource(); + } + + ngOnInit() { + } + + getInformation(excel = false){ + if(this.data){ + this.isLoading = true; + this.showMessageWait = true; + + let url = excel? 'servicios/asesores/excel' : 'servicios/asesores'; + + this.api.reportesService.getInformation(url, this.data, this.page, this.perPage, this.deleted).subscribe(res => { + + this.isLoading = false; + this.showMessageWait = false; + + if(excel){ + if (res.nombre_archivo) { + document.location.href = this.api.reportesService.baseUrlStorage + 'servicios_asesores/' + res.nombre_archivo; + } + }else{ + this.totalServicios = 0; + this.totalDuracion = '00h 00m 00s'; + this.dataSource.data = []; + + this.dataSource.data = res.data; + this.total = res.total; + this.totalServicios = res.total; + this.totalDuracion = res.total_duracion; + } + + this.ref.detectChanges(); + }, () => { + this.isLoading = false; + this.showMessageWait = false; + }); + } + } + + filters(){ + const dialogRef = this.dialog.open(ModalFiltrosServiciosAsesorComponent, { + data: this.data, + disableClose: true + }); + + dialogRef.afterClosed().subscribe(data => { + if(data){ + this.showMessageSetFilters = false; + this.data = data; + this.dataSource.data = []; + this.titulo = 'Reporte de servicios otorgados (' + data.user + ')'; + this.getInformation(); + } + }); + } + + sort(event) { + this.order = event.direction; + this.sortBy = event.active; + this.getInformation(); + } + + paginator(event) { + let nextPage = event.pageIndex + 1; + this.page = nextPage.toString(); + this.perPage = event.pageSize.toString(); + this.getInformation(); + } + + ngAfterViewInit() { + this.filters(); + } +} diff --git a/src/app/views/pages/reportes/servicios-asesor/servicios-asesor.model.ts b/src/app/views/pages/reportes/servicios-asesor/servicios-asesor.model.ts new file mode 100644 index 0000000..dde0d6e --- /dev/null +++ b/src/app/views/pages/reportes/servicios-asesor/servicios-asesor.model.ts @@ -0,0 +1,30 @@ +export class ServiciosAsesorModel { + apellido_materno_asesor: string; + apellido_materno_auxiliar: string; + apellido_paterno_asesor: string; + apellido_paterno_auxiliar: string; + calle_cliente: string; + ciudad_cliente: string; + colonia_cliente: string; + costo: string; + cp_cliente: string; + diferencia: string; + duracion_servicio: string; + entre_calles_cliente: string; + estatus_servicio: string; + fecha_inicio_servicio: string; + fecha_servicio: string; + hora_inicio_servicio: string; + hora_servicio: string; + litraje: string; + nombre_asesor: string; + nombre_auxiliar: string; + nombre_cliente: string; + num_ext_cliente: string; + num_int_cliente: string; + numero_solicitud: string; + origen: string; + servicio: string; + tipo_servicio: string; + vehiculo: string; +} diff --git a/src/app/views/pages/reportes/servicios-cliente/modal-filtros-servicios-cliente/modal-filtros-servicios-cliente.component.html b/src/app/views/pages/reportes/servicios-cliente/modal-filtros-servicios-cliente/modal-filtros-servicios-cliente.component.html new file mode 100644 index 0000000..36cea1d --- /dev/null +++ b/src/app/views/pages/reportes/servicios-cliente/modal-filtros-servicios-cliente/modal-filtros-servicios-cliente.component.html @@ -0,0 +1,75 @@ +
+
+ +
+
+ +
+
+
+ Filtros +
+ +
+
+
+ + + {{filtro.nombre}} + + + Sucursal + + +
+ +
+
+ + Fecha inicial + + + + + Fecha inicial + + +
+ +
+ + Fecha final + + + + + Fecha final + + +
+
+ +
+ + + ({{filtro.servicios_cantidad}} servicios) {{filtro.denominacion}} + + + Clientes + + +
+
+
+ +
+ +
+
+
diff --git a/src/app/views/pages/reportes/servicios-cliente/modal-filtros-servicios-cliente/modal-filtros-servicios-cliente.component.scss b/src/app/views/pages/reportes/servicios-cliente/modal-filtros-servicios-cliente/modal-filtros-servicios-cliente.component.scss new file mode 100644 index 0000000..f639d29 --- /dev/null +++ b/src/app/views/pages/reportes/servicios-cliente/modal-filtros-servicios-cliente/modal-filtros-servicios-cliente.component.scss @@ -0,0 +1,68 @@ +.span-titulo { + text-align: center; + font-size: 1.6em; + font-weight: 600; + color: #404040; +} + +.c-titulo{ + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; + align-items: center; + align-content: center; + background-color: #19385E; +} + +.c-titulo div:last-child { + margin-left: auto; +} + +.c-modal{ + text-align:center; + margin-bottom: 5px; +} + +.button-filled{ + background-color: #E63C2D; + color: white; +} + +.button-filled:focus, .button-filled.focus { + color: #fff; + background-color: #e71b08; + border-color: #e71b08; + box-shadow: none; +} + +.button-filled:disabled { + color: rgba(0,0,0,.26) !important; +} + +.button-filled:hover:enabled { + color: #fff; + background-color: #e71b08; + border-color: #e71b08; +} + +.input-lit { + outline: 0; + background-color: #eaeaea; + border-width: 0 0 0px; + width: 50%; + height: 50px; + margin-left: 2px; + margin-right: 2px; + text-align: center; + font-size: 1.2em; +} + +.input-lit:focus { + border-width: 0 0 2px; + border-color: #313131; +} + +.input-lit::placeholder, .input-lit::-webkit-input-placeholder{ + font-size: 1.1em !important; +} diff --git a/src/app/views/pages/reportes/servicios-cliente/modal-filtros-servicios-cliente/modal-filtros-servicios-cliente.component.ts b/src/app/views/pages/reportes/servicios-cliente/modal-filtros-servicios-cliente/modal-filtros-servicios-cliente.component.ts new file mode 100644 index 0000000..8b8078a --- /dev/null +++ b/src/app/views/pages/reportes/servicios-cliente/modal-filtros-servicios-cliente/modal-filtros-servicios-cliente.component.ts @@ -0,0 +1,140 @@ +import { ApiService } from './../../../../../core/api/api.service'; +import {ChangeDetectorRef, Component, Inject, OnInit} from '@angular/core'; +import {FormBuilder, FormControl, FormGroup, Validators} from "@angular/forms"; +import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from "@angular/material/dialog"; + +@Component({ + selector: 'kt-modal-filtros-servicios-cliente', + templateUrl: './modal-filtros-servicios-cliente.component.html', + styleUrls: ['./modal-filtros-servicios-cliente.component.scss'] +}) +export class ModalFiltrosServiciosClienteComponent implements OnInit { + + form: FormGroup; + loading: boolean = false; + sucursales = null; + usuarios = []; + origenes = null; + startDate = null; + + addDays = (date: Date, days: number): Date => { + let result = new Date(date); + result.setDate(result.getDate() + days); + return result; + }; + + constructor(private fb: FormBuilder, + public dialog: MatDialog, + public dialogRef: MatDialogRef, + private api: ApiService, + private cdr: ChangeDetectorRef, + @Inject(MAT_DIALOG_DATA) public data: any) { + + this.initLoginForm(); + this.filtros(); + } + + ngOnInit() {} + + initLoginForm() { + let fechaInicio = this.data? this.addDays(new Date(this.data.fecha_inicio+'T00:00:00.000Z'), 1) : null; + let fechaFinal = this.data? this.addDays(new Date(this.data.fecha_final+'T00:00:00.000Z'), 1) : null; + let sucursal = this.data? this.data.sucursal : null; + let cliente_id = this.data? this.data.cliente_id : null; + + this.form = this.fb.group({ + sucursal: new FormControl({value: sucursal, disabled: true}, [Validators.required]), + fecha_inicio: new FormControl({value: fechaInicio, disabled: false}, [Validators.required]), + fecha_final: new FormControl({value: fechaFinal, disabled: false}, [Validators.required]), + cliente_id: new FormControl({value: cliente_id, disabled: true}, [Validators.required]), + }); + } + + setFilters(){ + let data = this.form.value; + data.fecha_inicio = new Date(data.fecha_inicio).toLocaleDateString('en-CA'); + data.fecha_final = new Date(data.fecha_final).toLocaleDateString('en-CA'); + + let user = this.searchUserById(data.cliente_id); + data.user = user.denominacion; + + this.dialogRef.close(data); + } + + filtros(){ + this.loading = true; + this.api.reportesService.filtros('sucursales').subscribe(res => { + this.form.controls['sucursal'].enable(); + + this.sucursales = res.data; + + if(this.data) + this.getUsers(true); + + this.loading = false; + }, () => { + this.loading = false; + }); + } + + dateChanged(dateModal: any){ + if(dateModal){ + this.startDate = this.form.value.fecha_inicio; + this.form.get('fecha_final').reset(); + dateModal.open(); + } + + this.getUsers(); + } + + getUsers(reOpen = false){ + let sucursal = this.form.value.sucursal; + let fechaInicio = this.form.value.fecha_inicio; + let fechaFinal = this.form.value.fecha_final; + + if(sucursal && fechaInicio && fechaFinal){ + this.changeStatusInputs(false); + this.loading = true; + this.usuarios = []; + + if(!reOpen) + this.form.get('cliente_id').reset(); + + let data = this.form.value; + data.fecha_inicio = new Date(data.fecha_inicio).toLocaleDateString('en-CA'); + data.fecha_final = new Date(data.fecha_final).toLocaleDateString('en-CA'); + + this.api.reportesService.getInformation('servicios/clientes/usuarios', data).subscribe(res => { + this.usuarios = res.data; + this.changeStatusInputs(true); + this.loading = false; + this.cdr.detectChanges(); + }, () => { + this.changeStatusInputs(true); + this.loading = false; + }); + } + } + + changeStatusInputs(enable){ + if(enable){ + this.form.controls['sucursal'].enable(); + this.form.controls['fecha_inicio'].enable(); + this.form.controls['fecha_final'].enable(); + this.form.controls['cliente_id'].enable(); + }else{ + this.form.controls['sucursal'].disable(); + this.form.controls['fecha_inicio'].disable(); + this.form.controls['fecha_final'].disable(); + this.form.controls['cliente_id'].disable(); + } + } + + searchUserById(valor){ + let index = this.usuarios.findIndex((user => valor == user.id)); + if(index != -1){ + return this.usuarios[index]; + } + return false; + } +} diff --git a/src/app/views/pages/reportes/servicios-cliente/servicios-cliente.component.html b/src/app/views/pages/reportes/servicios-cliente/servicios-cliente.component.html new file mode 100644 index 0000000..4ebe790 --- /dev/null +++ b/src/app/views/pages/reportes/servicios-cliente/servicios-cliente.component.html @@ -0,0 +1,113 @@ + + +
+ +
+ +
+ +
+ +
+ +
+
+ + + +
+
+ +
+ + + + Núm. de solicitud + {{data.numero_solicitud}} + + + + Fecha del servicio + {{(data.fecha_servicio != null)? data.fecha_servicio : '-'}} + + + + Hora del servicio + {{(data.hora_servicio != null)? data.hora_servicio : '-'}} + + + + Servicio + {{(data.servicio != null)? data.servicio : '-'}} + + + + Costo de servicio + ${{ data.costo | number:'1.2-2'}} + + + + Tipo de servicio + {{(data.tipo_servicio != null)? data.tipo_servicio : '-'}} + + + + Estado de servicio + {{(data.estatus_servicio != null)? data.estatus_servicio : '-'}} + + + + Domicilio del servicio + {{(data.colonia_cliente != null)? data.calle_cliente + ' #' + data.num_ext_cliente + ', ' + data.colonia_cliente + ' C.P. ' + data.cp_cliente : '-'}} + + + + Asesor de operaciones + {{(data.nombre_asesor != null)? data.nombre_asesor + ' ' + data.apellido_paterno_asesor + ' ' + data.apellido_materno_asesor : '-'}} + + + + Auxiliar de operaciones + {{(data.nombre_auxiliar != null)? data.nombre_auxiliar + ' ' + data.apellido_paterno_auxiliar + ' ' + data.apellido_materno_auxiliar : '-'}} + + + + Vehículo asignado + {{(data.vehiculo != null)? data.vehiculo : '-'}} + + + + Duración del servicio + {{(data.duracion_servicio != null)? data.duracion_servicio : '-'}} + + + + Litraje + {{(data.litraje != null)? data.litraje : '-'}} + + + + + +
No es posible mostrar información sin seleccionar filtros.
+
No se encontraron registros.
+
Espera un momento....
+
+ +
+ + +
+ +
+ +
diff --git a/src/app/views/pages/reportes/servicios-cliente/servicios-cliente.component.scss b/src/app/views/pages/reportes/servicios-cliente/servicios-cliente.component.scss new file mode 100644 index 0000000..5e95c1b --- /dev/null +++ b/src/app/views/pages/reportes/servicios-cliente/servicios-cliente.component.scss @@ -0,0 +1,30 @@ +.table-responsive { + display: block; + width: 100%; + overflow-x: auto; + text-align: center; + z-index: 1; + mat-table { + width: 100%; + max-width: 100%; + margin-bottom: 1rem; + display: table; + border-collapse: collapse; + margin: 0px; + } + mat-row, + mat-header-row { + display: table-row; + } + mat-cell, + mat-header-cell { + word-wrap: initial; + display: table-cell; + padding: 0px 5px; + line-break: unset; + width: auto; + white-space: nowrap; + overflow: hidden; + vertical-align: middle; + } +} diff --git a/src/app/views/pages/reportes/servicios-cliente/servicios-cliente.component.spec.ts b/src/app/views/pages/reportes/servicios-cliente/servicios-cliente.component.spec.ts new file mode 100644 index 0000000..279b171 --- /dev/null +++ b/src/app/views/pages/reportes/servicios-cliente/servicios-cliente.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ServiciosClienteComponent } from './servicios-cliente.component'; + +describe('ServiciosClienteComponent', () => { + let component: ServiciosClienteComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ServiciosClienteComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ServiciosClienteComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/views/pages/reportes/servicios-cliente/servicios-cliente.component.ts b/src/app/views/pages/reportes/servicios-cliente/servicios-cliente.component.ts new file mode 100644 index 0000000..b1380d3 --- /dev/null +++ b/src/app/views/pages/reportes/servicios-cliente/servicios-cliente.component.ts @@ -0,0 +1,106 @@ +import { ChangeDetectorRef, Component, OnInit } from '@angular/core'; +import { MatDialog, MatTableDataSource } from '@angular/material'; +import { ApiService } from '../../../../core/api/api.service'; +import { ModalFiltrosServiciosClienteComponent } from './modal-filtros-servicios-cliente/modal-filtros-servicios-cliente.component'; +import { ServiciosClienteModel } from './servicios-cliente.model'; + +@Component({ + selector: 'kt-servicios-cliente', + templateUrl: './servicios-cliente.component.html', + styleUrls: ['./servicios-cliente.component.scss'] +}) +export class ServiciosClienteComponent implements OnInit { + + titulo = 'Reporte de servicios por cliente'; + + displayedColumns: string[] = ['numero_solicitud', 'fecha_servicio', 'hora_servicio', 'servicio', 'costo', 'tipo_servicio', 'estatus_servicio', 'colonia_cliente', 'nombre_asesor', 'nombre_auxiliar', 'vehiculo', 'duracion_servicio', 'litraje']; + dataSource: MatTableDataSource; + + //Loadings + isLoading = false; + showMessageWait = false; + showMessageSetFilters = true; + + //Paginator, Searcher + page = '1'; + perPage = '10'; + total = 0; + sortBy = 'denominacion'; + order = 'asc'; + pages = [10, 25, 50, 100]; + deleted = '0'; + + data = null; + + constructor(private api: ApiService, private ref: ChangeDetectorRef, private dialog: MatDialog) { + this.dataSource = new MatTableDataSource(); + } + + ngOnInit() { + } + + getInformation(excel = false){ + if(this.data){ + this.isLoading = true; + this.showMessageWait = true; + + let url = excel? 'servicios/clientes/excel' : 'servicios/clientes'; + + this.api.reportesService.getInformation(url, this.data, this.page, this.perPage, this.deleted).subscribe(res => { + + this.isLoading = false; + this.showMessageWait = false; + + if(excel){ + if (res.nombre_archivo) { + document.location.href = this.api.reportesService.baseUrlStorage + 'servicios_clientes/' + res.nombre_archivo; + } + }else{ + this.dataSource.data = []; + + this.dataSource.data = res.data; + this.total = res.total; + } + + this.ref.detectChanges(); + }, () => { + this.isLoading = false; + this.showMessageWait = false; + }); + } + } + + filters(){ + const dialogRef = this.dialog.open(ModalFiltrosServiciosClienteComponent, { + data: this.data, + disableClose: true + }); + + dialogRef.afterClosed().subscribe(data => { + if(data){ + this.showMessageSetFilters = false; + this.data = data; + this.dataSource.data = []; + this.titulo = 'Reporte de servicios por cliente (' + data.user + ')'; + this.getInformation(); + } + }); + } + + sort(event) { + this.order = event.direction; + this.sortBy = event.active; + this.getInformation(); + } + + paginator(event) { + let nextPage = event.pageIndex + 1; + this.page = nextPage.toString(); + this.perPage = event.pageSize.toString(); + this.getInformation(); + } + + ngAfterViewInit() { + this.filters(); + } +} diff --git a/src/app/views/pages/reportes/servicios-cliente/servicios-cliente.model.ts b/src/app/views/pages/reportes/servicios-cliente/servicios-cliente.model.ts new file mode 100644 index 0000000..ddae240 --- /dev/null +++ b/src/app/views/pages/reportes/servicios-cliente/servicios-cliente.model.ts @@ -0,0 +1,30 @@ +export class ServiciosClienteModel { + apellido_materno_asesor: string; + apellido_materno_auxiliar: string; + apellido_paterno_asesor: string; + apellido_paterno_auxiliar: string; + calle_cliente: string; + ciudad_cliente: string; + colonia_cliente: string; + costo: string; + cp_cliente: string; + diferencia: string; + duracion_servicio: string; + entre_calles_cliente: string; + estatus_servicio: string; + fecha_inicio_servicio: string; + fecha_servicio: string; + hora_inicio_servicio: string; + hora_servicio: string; + litraje: string; + nombre_asesor: string; + nombre_auxiliar: string; + nombre_cliente: string; + num_ext_cliente: string; + num_int_cliente: string; + numero_solicitud: string; + origen: string; + servicio: string; + tipo_servicio: string; + vehiculo: string; +} diff --git a/src/app/views/pages/reportes/servicios/modal-filtros-servicios/modal-filtros-servicios.component.html b/src/app/views/pages/reportes/servicios/modal-filtros-servicios/modal-filtros-servicios.component.html new file mode 100644 index 0000000..cb03e18 --- /dev/null +++ b/src/app/views/pages/reportes/servicios/modal-filtros-servicios/modal-filtros-servicios.component.html @@ -0,0 +1,112 @@ +
+
+ +
+
+ +
+
+
+ Filtros +
+ +
+
+
+ + + {{filtro.nombre}} + + + Sucursal + + +
+ +
+
+ + Fecha inicial + + + + + Fecha inicial + + +
+ +
+ + Fecha final + + + + + Fecha final + + +
+
+ +
+ + + Todos + {{filtro.nombre}} + + + Servicio + + +
+ +
+ + + Todos + {{filtro.nombre}} + + + Tipo de servicio + + +
+ +
+ + + Todos + {{filtro.nombre}} + + + Estado de servicio + + +
+ +
+ + + Todos + {{filtro.nombre}} + + + Origen + + +
+
+
+ +
+ +
+
+
diff --git a/src/app/views/pages/reportes/servicios/modal-filtros-servicios/modal-filtros-servicios.component.scss b/src/app/views/pages/reportes/servicios/modal-filtros-servicios/modal-filtros-servicios.component.scss new file mode 100644 index 0000000..7f8ca4c --- /dev/null +++ b/src/app/views/pages/reportes/servicios/modal-filtros-servicios/modal-filtros-servicios.component.scss @@ -0,0 +1,70 @@ +.span-titulo { + text-align: center; + font-size: 1.6em; + font-weight: 600; + color: #404040; +} + +.c-titulo{ + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; + align-items: center; + align-content: center; + background-color: #19385E; +} + +.c-titulo div:last-child { + margin-left: auto; +} + +.c-modal{ + text-align:center; + margin-bottom: 5px; +} + +.button-filled{ + background-color: #E63C2D; + color: white; +} + +.button-filled:focus, .button-filled.focus { + color: #fff; + background-color: #e71b08; + border-color: #e71b08; + box-shadow: none; +} + +.button-filled:disabled { + color: rgba(0,0,0,.26) !important; +} + +.button-filled:hover:enabled { + color: #fff; + background-color: #e71b08; + border-color: #e71b08; +} + +.input-lit { + outline: 0; + background-color: #eaeaea; + border-width: 0 0 0px; + width: 50%; + height: 50px; + margin-left: 2px; + margin-right: 2px; + text-align: center; + font-size: 1.2em; +} + +.input-lit:focus { + border-width: 0 0 2px; + border-color: #313131; +} + +.input-lit::placeholder, .input-lit::-webkit-input-placeholder{ + font-size: 1.1em !important; +} + + diff --git a/src/app/views/pages/reportes/servicios/modal-filtros-servicios/modal-filtros-servicios.component.ts b/src/app/views/pages/reportes/servicios/modal-filtros-servicios/modal-filtros-servicios.component.ts new file mode 100644 index 0000000..f5e7b4f --- /dev/null +++ b/src/app/views/pages/reportes/servicios/modal-filtros-servicios/modal-filtros-servicios.component.ts @@ -0,0 +1,130 @@ +import { ApiService } from './../../../../../core/api/api.service'; +import {ChangeDetectorRef, Component, Inject, OnInit, ViewChild} from '@angular/core'; +import {FormBuilder, FormControl, FormGroup, Validators} from "@angular/forms"; +import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from "@angular/material/dialog"; + +@Component({ + selector: 'kt-modal-filtros-servicios', + templateUrl: './modal-filtros-servicios.component.html', + styleUrls: ['./modal-filtros-servicios.component.scss'] +}) +export class ModalFiltrosServiciosComponent implements OnInit { + + form: FormGroup; + loading: boolean = false; + sucursales = null; + servicios = null; + tiposServicios = null; + estatusServicios = null; + origenes = null; + startDate = null; + + constructor(private fb: FormBuilder, + public dialog: MatDialog, + public dialogRef: MatDialogRef, + private api: ApiService, + private cdr: ChangeDetectorRef, + @Inject(MAT_DIALOG_DATA) public data: any) { + + this.initLoginForm(); + this.filtros(); + } + + ngOnInit() { + if(this.data){ + + const addDays = (date: Date, days: number): Date => { + let result = new Date(date); + result.setDate(result.getDate() + days); + return result; + }; + + this.form.get('fecha_inicio').setValue(addDays(new Date(this.data.fecha_inicio+'T00:00:00.000Z'), 1)); + this.form.get('fecha_final').setValue(addDays(new Date(this.data.fecha_final+'T00:00:00.000Z'), 1)); + } + } + + initLoginForm() { + this.form = this.fb.group({ + sucursal: new FormControl({value: null, disabled: true}, [Validators.required]), + fecha_inicio: new FormControl({value: null, disabled: false}, [Validators.required]), + fecha_final: new FormControl({value: null, disabled: false}, [Validators.required]), + servicio: new FormControl({value: 0, disabled: true}, [Validators.required]), + tipo_servicio: new FormControl({value: 0, disabled: true}, [Validators.required]), + estado_servicio: new FormControl({value: 0, disabled: true}, [Validators.required]), + origen: new FormControl({value: 0, disabled: true}, [Validators.required]) + }); + } + + setFilters(){ + let data = this.form.value; + data.fecha_inicio = new Date(data.fecha_inicio).toLocaleDateString('en-CA'); + data.fecha_final = new Date(data.fecha_final).toLocaleDateString('en-CA'); + this.dialogRef.close(data); + } + + filtros(){ + this.api.reportesService.filtros('sucursales').subscribe(res => { + this.sucursales = res.data; + + if(this.data) + this.form.get('sucursal').setValue(this.data.sucursal); + + this.form.controls['sucursal'].enable(); + }, () => { + + }); + + this.api.reportesService.filtros('servicios').subscribe(res => { + this.servicios = res.data; + + if(this.data) + this.form.get('servicio').setValue(this.data.servicio); + + this.form.controls['servicio'].enable(); + }, () => { + + }); + + this.api.reportesService.filtros('tipos_servicio').subscribe(res => { + this.tiposServicios = res.data; + + if(this.data) + this.form.get('tipo_servicio').setValue(this.data.tipo_servicio); + + this.form.controls['tipo_servicio'].enable(); + }, () => { + + }); + + this.api.reportesService.filtros('estatus_servicio').subscribe(res => { + this.estatusServicios = res.data; + + if(this.data) + this.form.get('estado_servicio').setValue(this.data.estado_servicio); + + this.form.controls['estado_servicio'].enable(); + }, () => { + + }); + + this.api.reportesService.filtros('origenes').subscribe(res => { + this.origenes = res.data; + + if(this.data) + this.form.get('origen').setValue(this.data.origen); + + this.form.controls['origen'].enable(); + }, () => { + + }); + } + + dateChanged(dateModal: any){ + if(dateModal){ + this.startDate = this.form.value.fecha_inicio; + this.form.get('fecha_final').reset(); + dateModal.open(); + } + } +} diff --git a/src/app/views/pages/reportes/servicios/servicios.component.html b/src/app/views/pages/reportes/servicios/servicios.component.html new file mode 100644 index 0000000..886038c --- /dev/null +++ b/src/app/views/pages/reportes/servicios/servicios.component.html @@ -0,0 +1,132 @@ + + +
+ +
+ +
+ +
+ +
+ +
+
+ + + +
+
+
Totales ({{totalServicios}})
+
${{ totalCosto | number:'1.2-2'}}
+
+
+ +
+ + + + Núm. de solicitud + {{data.numero_solicitud}} + + + + Fecha del servicio + {{(data.fecha_servicio != null)? data.fecha_servicio : '-'}} + + + + Hora del servicio + {{(data.hora_servicio != null)? data.hora_servicio : '-'}} + + + + Servicio + {{(data.servicio != null)? data.servicio : '-'}} + + + + Costo de servicio + ${{ data.costo | number:'1.2-2'}} + + + + Tipo de servicio + {{(data.tipo_servicio != null)? data.tipo_servicio : '-'}} + + + + Estado de servicio + {{(data.estatus_servicio != null)? data.estatus_servicio : '-'}} + + + + Nombre del cliente + {{(data.nombre_cliente != null)? data.nombre_cliente : '-'}} + + + + Domicilio del servicio + {{(data.colonia_cliente != null)? data.calle_cliente + ' #' + data.num_ext_cliente + ', ' + data.colonia_cliente + ' C.P. ' + data.cp_cliente : '-'}} + + + + Asesor de operaciones + {{(data.nombre_asesor != null)? data.nombre_asesor + ' ' + data.apellido_paterno_asesor + ' ' + data.apellido_materno_asesor : '-'}} + + + + Auxiliar de operaciones + {{(data.nombre_auxiliar != null)? data.nombre_auxiliar + ' ' + data.apellido_paterno_auxiliar + ' ' + data.apellido_materno_auxiliar : '-'}} + + + + Vehículo asignado + {{(data.vehiculo != null)? data.vehiculo : '-'}} + + + + Duración del servicio + {{(data.duracion_servicio != null)? data.duracion_servicio : '-'}} + + + + Hora de inicio + {{(data.hora_inicio_servicio != null)? data.hora_inicio_servicio : '-'}} + + + + Puntualidad + {{(data.diferencia != null)? data.diferencia : '-'}} + + + + Litraje + {{(data.litraje != null)? data.litraje : '-'}} + + + + + +
No es posible mostrar información sin seleccionar filtros.
+
No se encontraron registros.
+
Espera un momento....
+
+ +
+ + +
+ +
+ +
diff --git a/src/app/views/pages/reportes/servicios/servicios.component.scss b/src/app/views/pages/reportes/servicios/servicios.component.scss new file mode 100644 index 0000000..9ea7320 --- /dev/null +++ b/src/app/views/pages/reportes/servicios/servicios.component.scss @@ -0,0 +1,44 @@ +.container-detail { + display: flex; + flex-direction: row; + justify-content: flex-end; + flex-flow: row wrap; + text-align-last: right; +} + +.row-detail { + font-size: 1.2em; + font-weight: 500; + color: #00000094; +} + +.table-responsive { + display: block; + width: 100%; + overflow-x: auto; + text-align: center; + z-index: 1; + mat-table { + width: 100%; + max-width: 100%; + margin-bottom: 1rem; + display: table; + border-collapse: collapse; + margin: 0px; + } + mat-row, + mat-header-row { + display: table-row; + } + mat-cell, + mat-header-cell { + word-wrap: initial; + display: table-cell; + padding: 0px 5px; + line-break: unset; + width: auto; + white-space: nowrap; + overflow: hidden; + vertical-align: middle; + } +} diff --git a/src/app/views/pages/reportes/servicios/servicios.component.spec.ts b/src/app/views/pages/reportes/servicios/servicios.component.spec.ts new file mode 100644 index 0000000..6b8f8be --- /dev/null +++ b/src/app/views/pages/reportes/servicios/servicios.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ServiciosComponent } from './servicios.component'; + +describe('ServiciosComponent', () => { + let component: ServiciosComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ServiciosComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ServiciosComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/views/pages/reportes/servicios/servicios.component.ts b/src/app/views/pages/reportes/servicios/servicios.component.ts new file mode 100644 index 0000000..acefa52 --- /dev/null +++ b/src/app/views/pages/reportes/servicios/servicios.component.ts @@ -0,0 +1,111 @@ +import { AfterViewInit, ChangeDetectorRef, Component, OnInit } from '@angular/core'; +import { MatDialog, MatTableDataSource } from '@angular/material'; +import { ApiService } from '../../../../../app/core/api/api.service'; +import { ModalFiltrosServiciosComponent } from './modal-filtros-servicios/modal-filtros-servicios.component'; +import { ServiciosModel } from './servicios.model'; + +@Component({ + selector: 'kt-servicios', + templateUrl: './servicios.component.html', + styleUrls: ['./servicios.component.scss'] +}) +export class ServiciosComponent implements OnInit, AfterViewInit { + + titulo = 'Reporte de servicios'; + + displayedColumns: string[] = ['numero_solicitud', 'fecha_servicio', 'hora_servicio', 'servicio', 'costo', 'tipo_servicio', 'estatus_servicio', 'nombre_cliente', 'colonia_cliente', 'nombre_asesor', 'nombre_auxiliar', 'vehiculo', 'duracion_servicio', 'hora_inicio_servicio', 'diferencia', 'litraje']; + dataSource: MatTableDataSource; + + //Loadings + isLoading = false; + showMessageWait = false; + showMessageSetFilters = true; + + //Paginator, Searcher + page = '1'; + perPage = '10'; + total = 0; + sortBy = 'denominacion'; + order = 'asc'; + pages = [10, 25, 50, 100]; + deleted = '0'; + + data = null; + + totalServicios = 0; + totalCosto = 0.00; + + constructor(private api: ApiService, private ref: ChangeDetectorRef, private dialog: MatDialog) { + this.dataSource = new MatTableDataSource(); + } + + ngOnInit() {} + + getInformation(excel = false){ + if(this.data){ + this.isLoading = true; + this.showMessageWait = true; + + let url = excel? 'servicios/excel' : 'servicios'; + + this.api.reportesService.getInformation(url, this.data, this.page, this.perPage, this.deleted).subscribe(res => { + + this.isLoading = false; + this.showMessageWait = false; + + if(excel){ + if (res.nombre_archivo) { + document.location.href = this.api.reportesService.baseUrlStorage + 'servicios/' + res.nombre_archivo; + } + }else{ + this.totalServicios = 0; + this.totalCosto = 0.00; + this.dataSource.data = []; + + this.dataSource.data = res.data; + this.total = res.total; + this.totalServicios = res.total_servicios; + this.totalCosto = res.total_costo; + } + + this.ref.detectChanges(); + }, () => { + this.isLoading = false; + this.showMessageWait = false; + }); + } + } + + filters(){ + const dialogRef = this.dialog.open(ModalFiltrosServiciosComponent, { + data: this.data, + disableClose: true + }); + + dialogRef.afterClosed().subscribe(data => { + if(data){ + this.showMessageSetFilters = false; + this.data = data; + this.dataSource.data = []; + this.getInformation(); + } + }); + } + + ngAfterViewInit() { + this.filters(); + } + + sort(event) { + this.order = event.direction; + this.sortBy = event.active; + this.getInformation(); + } + + paginator(event) { + let nextPage = event.pageIndex + 1; + this.page = nextPage.toString(); + this.perPage = event.pageSize.toString(); + this.getInformation(); + } +} diff --git a/src/app/views/pages/reportes/servicios/servicios.model.ts b/src/app/views/pages/reportes/servicios/servicios.model.ts new file mode 100644 index 0000000..699bf35 --- /dev/null +++ b/src/app/views/pages/reportes/servicios/servicios.model.ts @@ -0,0 +1,30 @@ +export class ServiciosModel { + apellido_materno_asesor: string; + apellido_materno_auxiliar: string; + apellido_paterno_asesor: string; + apellido_paterno_auxiliar: string; + calle_cliente: string; + ciudad_cliente: string; + colonia_cliente: string; + costo: string; + cp_cliente: string; + diferencia: string; + duracion_servicio: string; + entre_calles_cliente: string; + estatus_servicio: string; + fecha_inicio_servicio: string; + fecha_servicio: string; + hora_inicio_servicio: string; + hora_servicio: string; + litraje: string; + nombre_asesor: string; + nombre_auxiliar: string; + nombre_cliente: string; + num_ext_cliente: string; + num_int_cliente: string; + numero_solicitud: string; + origen: string; + servicio: string; + tipo_servicio: string; + vehiculo: string; +} diff --git a/src/app/views/pages/servicios/models/filtros-servicios-response.model.ts b/src/app/views/pages/servicios/models/filtros-servicios-response.model.ts new file mode 100644 index 0000000..827899c --- /dev/null +++ b/src/app/views/pages/servicios/models/filtros-servicios-response.model.ts @@ -0,0 +1,10 @@ +export class FiltrosServiciosResponseModel { + origenes: any; + formas_pagos: any; + servicios: any; + tipo_servicio: any; + estatus_servicios: any; + vehiculos: any; + operadores: any; + auxiliares: any; +} diff --git a/src/app/views/pages/servicios/models/general-response.model.ts b/src/app/views/pages/servicios/models/general-response.model.ts new file mode 100644 index 0000000..03fa98c --- /dev/null +++ b/src/app/views/pages/servicios/models/general-response.model.ts @@ -0,0 +1,3 @@ +export class GeneralResponseModel { + data: any; +} diff --git a/src/app/views/pages/servicios/servicios.module.ts b/src/app/views/pages/servicios/servicios.module.ts new file mode 100644 index 0000000..5428b16 --- /dev/null +++ b/src/app/views/pages/servicios/servicios.module.ts @@ -0,0 +1,117 @@ +import {NgModule} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {PartialsModule} from '../../partials/partials.module'; +import {CoreModule} from '../../../core/core.module'; +import {RouterModule} from '@angular/router'; +import { + MAT_DIALOG_DEFAULT_OPTIONS, + MatAutocompleteModule, + MatButtonModule, + MatCardModule, + MatCheckboxModule, + MatDatepickerModule, + MatDialogModule, + MatExpansionModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatMenuModule, + MatNativeDateModule, + MatPaginatorModule, + MatProgressBarModule, + MatProgressSpinnerModule, + MatRadioModule, + MatSnackBarModule, + MatSortModule, + MatTableModule, + MatTabsModule, + MatTooltipModule, + MatSelectModule +} from '@angular/material'; +import {FormsModule, ReactiveFormsModule} from '@angular/forms'; +import {NgxPermissionsModule} from 'ngx-permissions'; +import {HttpUtilsService, InterceptService, LayoutUtilsService, TypesUtilsService} from '../../../core/_base/crud'; +import {HTTP_INTERCEPTORS} from '@angular/common/http'; +import {ActionNotificationComponent, DeleteEntityDialogComponent} from '../../partials/content/crud'; +import { SolicitudesServicioListComponent } from './solicitudes-servicio/solicitudes-servicio-list/solicitudes-servicio-list.component'; +import { SolicitudesServicioEditComponent } from './solicitudes-servicio/solicitudes-servicio-edit/solicitudes-servicio-edit.component'; +import { ModalSetLitrajeComponent } from './solicitudes-servicio/modal-set-litraje/modal-set-litraje.component'; +import { ModalEncuestaComponent } from './solicitudes-servicio/modal-encuesta/modal-encuesta.component'; +import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; + +@NgModule({ + declarations: [SolicitudesServicioListComponent, SolicitudesServicioEditComponent, ModalSetLitrajeComponent, ModalEncuestaComponent], + imports: [ + CommonModule, + PartialsModule, + CoreModule, + RouterModule.forChild([ + { + path: 'solicitudes-servicio', + component: SolicitudesServicioListComponent + }, + { + path: 'solicitudes-servicio/add', + component: SolicitudesServicioEditComponent + }, + { + path: 'solicitudes-servicio/edit/:id', + component: SolicitudesServicioEditComponent + }, + ]), + MatButtonModule, + MatTooltipModule, + MatFormFieldModule, + MatInputModule, + MatIconModule, + MatTableModule, + MatMenuModule, + MatCheckboxModule, + MatSortModule, + MatProgressSpinnerModule, + MatPaginatorModule, + FormsModule, + ReactiveFormsModule, + MatAutocompleteModule, + MatRadioModule, + MatNativeDateModule, + MatProgressBarModule, + MatDatepickerModule, + MatCardModule, + MatSnackBarModule, + MatExpansionModule, + MatTabsModule, + MatDialogModule, + NgxPermissionsModule, + MatSelectModule, + NgxMatSelectSearchModule + ], + providers: [ + InterceptService, + { + provide: HTTP_INTERCEPTORS, + useClass: InterceptService, + multi: true + }, + { + provide: MAT_DIALOG_DEFAULT_OPTIONS, + useValue: { + hasBackdrop: true, + panelClass: 'kt-mat-dialog-container__wrapper', + height: 'auto', + width: '900px' + } + }, + HttpUtilsService, + TypesUtilsService, + LayoutUtilsService, + ], + entryComponents: [ + DeleteEntityDialogComponent, + ActionNotificationComponent, + ModalSetLitrajeComponent, + ModalEncuestaComponent + ] +}) + +export class ServiciosModule { } diff --git a/src/app/views/pages/servicios/solicitudes-servicio/modal-encuesta/modal-encuesta.component.html b/src/app/views/pages/servicios/solicitudes-servicio/modal-encuesta/modal-encuesta.component.html new file mode 100644 index 0000000..ae87faa --- /dev/null +++ b/src/app/views/pages/servicios/solicitudes-servicio/modal-encuesta/modal-encuesta.component.html @@ -0,0 +1,81 @@ +
+
+
+ +
+ +
+ + +
+
+ Encuesta de Satisfacción del Cliente +
+ +
+ +
+
+
+
+
Datos Generales
+
+ {{isCompany? 'Empresa: ' : 'Nombre del Cliente: '}} + {{isCompany? data.empresa : data.nombre_cliente}} +
+
+ Contacto: + {{data.contacto}} +
+
+ Servicio Evaluado: + {{data.servicio_evaluado}} +
+
+ Porcentaje de satisfacción del cliente: + {{data.puntuacion}}% +
+
+
+
+ Fecha: + {{data.fecha | date: 'dd/MM/yyyy'}} +
+
+
+
+ +
+ +
+
+
Respuestas del Cliente
+ +
+
+
{{indexOfelement + 1}}.- {{pregunta.nombre}}
+
+
+
+ + {{respuesta.nombre}} + {{respuesta.respuesta? respuesta.respuesta : 'Sin dato'}} + {{(respuesta.respuesta != null)? (respuesta.respuesta | date: 'dd/MM/yyyy') : 'Sin dato'}} +
+
+
+
+
+
+
+
+ +
+ + Espere un momento... +
+ +
+
diff --git a/src/app/views/pages/servicios/solicitudes-servicio/modal-encuesta/modal-encuesta.component.scss b/src/app/views/pages/servicios/solicitudes-servicio/modal-encuesta/modal-encuesta.component.scss new file mode 100644 index 0000000..6f96e23 --- /dev/null +++ b/src/app/views/pages/servicios/solicitudes-servicio/modal-encuesta/modal-encuesta.component.scss @@ -0,0 +1,105 @@ +.span-titulo { + text-align: center; + font-size: 1.6em; + font-weight: 600; + color: #404040; +} + +.c-titulo{ + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; + align-items: center; + align-content: center; + background-color: #19385E; +} + +.c-titulo div:last-child { + margin-left: auto; +} + +.c-modal{ + text-align:center; + margin-bottom: 5px; +} + +.container-datos-generales { + display: flex; + width: 100%; + flex-direction: row; + flex-wrap: wrap; + align-content: stretch; + padding: 1% 3% 3% 3%; +} + +.container-datos-generales-1 { + width: 50%; + text-align: start; +} + +.container-datos-generales-2 { + width: 50%; + text-align: end; + align-self: center; +} + +.titulo { + color: #333; + font-size: 1.5em; + font-weight: 600; +} + +.subtitulo { + color: #333; + font-size: 1.1em; + font-weight: 500; +} + +.respuesta { + color: #333; + font-size: 1.1em; + font-weight: 300; +} + +.color-azul { + color: #19385E; + font-size: 1.25em; +} + +.font-weight-600 { + font-weight: 600; +} + +.container-respuestas-general { + width: 100%; + flex-direction: column; + flex-wrap: wrap; + align-content: flex-start; + align-items: flex-start; + padding: 1% 3% 3% 3%; +} + +.container-respuestas { + display: flex; + flex-direction: row; + flex-wrap: wrap; + flex-flow: row wrap; + gap: 10px 20px; +} + +.div-respuestas { + margin-top: 1%; + margin-left: 3%; +} + +.container-loading { + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + gap: 20px; + padding: 20%; +} diff --git a/src/app/views/pages/servicios/solicitudes-servicio/modal-encuesta/modal-encuesta.component.ts b/src/app/views/pages/servicios/solicitudes-servicio/modal-encuesta/modal-encuesta.component.ts new file mode 100644 index 0000000..e9fd15d --- /dev/null +++ b/src/app/views/pages/servicios/solicitudes-servicio/modal-encuesta/modal-encuesta.component.ts @@ -0,0 +1,42 @@ +import { ApiService } from './../../../../../core/api/api.service'; +import {ChangeDetectorRef, Component, Inject, OnInit} from '@angular/core'; +import {FormBuilder, FormGroup, Validators} from "@angular/forms"; +import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from "@angular/material/dialog"; + + +@Component({ + selector: 'kt-modal-encuesta', + templateUrl: './modal-encuesta.component.html', + styleUrls: ['./modal-encuesta.component.scss'] +}) +export class ModalEncuestaComponent implements OnInit { + + isLoading: boolean = true; + data: any = []; + isCompany = true; + + constructor(private fb: FormBuilder, + public dialog: MatDialog, + public dialogRef: MatDialogRef, + private api: ApiService, + private cdr: ChangeDetectorRef, + @Inject(MAT_DIALOG_DATA) public id: any) { + this.getQuiz(id); + } + + ngOnInit() { + } + + getQuiz(id){ + + this.isLoading = true; + + this.api.solicitudesServicioService.getQuiz(id).subscribe(res => { + this.data = res; + this.isCompany = res.hasOwnProperty('contacto') && res.hasOwnProperty('empresa'); + this.isLoading = false; + }, () => { + this.dialogRef.close(); + }); + } +} diff --git a/src/app/views/pages/servicios/solicitudes-servicio/modal-set-litraje/modal-set-litraje.component.html b/src/app/views/pages/servicios/solicitudes-servicio/modal-set-litraje/modal-set-litraje.component.html new file mode 100644 index 0000000..364b476 --- /dev/null +++ b/src/app/views/pages/servicios/solicitudes-servicio/modal-set-litraje/modal-set-litraje.component.html @@ -0,0 +1,27 @@ +
+
+ +
+ +
+ +
+
+
+ {{data.litraje? 'Editar litraje' : 'Agregar litraje'}} +
+
+ +
+ +
+ +
+
+
diff --git a/src/app/views/pages/servicios/solicitudes-servicio/modal-set-litraje/modal-set-litraje.component.scss b/src/app/views/pages/servicios/solicitudes-servicio/modal-set-litraje/modal-set-litraje.component.scss new file mode 100644 index 0000000..7f8ca4c --- /dev/null +++ b/src/app/views/pages/servicios/solicitudes-servicio/modal-set-litraje/modal-set-litraje.component.scss @@ -0,0 +1,70 @@ +.span-titulo { + text-align: center; + font-size: 1.6em; + font-weight: 600; + color: #404040; +} + +.c-titulo{ + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; + align-items: center; + align-content: center; + background-color: #19385E; +} + +.c-titulo div:last-child { + margin-left: auto; +} + +.c-modal{ + text-align:center; + margin-bottom: 5px; +} + +.button-filled{ + background-color: #E63C2D; + color: white; +} + +.button-filled:focus, .button-filled.focus { + color: #fff; + background-color: #e71b08; + border-color: #e71b08; + box-shadow: none; +} + +.button-filled:disabled { + color: rgba(0,0,0,.26) !important; +} + +.button-filled:hover:enabled { + color: #fff; + background-color: #e71b08; + border-color: #e71b08; +} + +.input-lit { + outline: 0; + background-color: #eaeaea; + border-width: 0 0 0px; + width: 50%; + height: 50px; + margin-left: 2px; + margin-right: 2px; + text-align: center; + font-size: 1.2em; +} + +.input-lit:focus { + border-width: 0 0 2px; + border-color: #313131; +} + +.input-lit::placeholder, .input-lit::-webkit-input-placeholder{ + font-size: 1.1em !important; +} + + diff --git a/src/app/views/pages/servicios/solicitudes-servicio/modal-set-litraje/modal-set-litraje.component.ts b/src/app/views/pages/servicios/solicitudes-servicio/modal-set-litraje/modal-set-litraje.component.ts new file mode 100644 index 0000000..f10ed7b --- /dev/null +++ b/src/app/views/pages/servicios/solicitudes-servicio/modal-set-litraje/modal-set-litraje.component.ts @@ -0,0 +1,52 @@ +import { ApiService } from './../../../../../core/api/api.service'; +import {ChangeDetectorRef, Component, Inject, OnInit} from '@angular/core'; +import {FormBuilder, FormGroup, Validators} from "@angular/forms"; +import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from "@angular/material/dialog"; + + +@Component({ + selector: 'kt-modal-set-litraje', + templateUrl: './modal-set-litraje.component.html', + styleUrls: ['./modal-set-litraje.component.scss'] +}) +export class ModalSetLitrajeComponent implements OnInit { + + form: FormGroup; + loading: boolean = false; + inputLength = [].constructor(6); + arrCodigo = []; + keyAux; + id = 0; + + constructor(private fb: FormBuilder, + public dialog: MatDialog, + public dialogRef: MatDialogRef, + private api: ApiService, + private cdr: ChangeDetectorRef, + @Inject(MAT_DIALOG_DATA) public data: any) { + } + + ngOnInit() { + this.initLoginForm() + } + + initLoginForm() { + this.form = this.fb.group({ + litraje: [this.data.litraje, [Validators.required, Validators.minLength(1), Validators.maxLength(6), Validators.pattern('^-?[0-9]\\d*(\\.\\d{1,2})?$')]] + }); + } + + saveLitraje(){ + this.loading = true; + this.api.solicitudesServicioService.updateLitraje({litraje: this.form.value.litraje}, this.data.progreso_solicitud_id).subscribe(res => { + this.loading = false; + this.dialogRef.close(true); + }, ()=>{ + this.loading = false; + }); + } + + onKeyUp(){ + this.form.get('litraje').setValue(this.form.value.litraje.replace(/[^0-9]/g, '')); + } +} diff --git a/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio-edit/solicitudes-servicio-edit.component.html b/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio-edit/solicitudes-servicio-edit.component.html new file mode 100644 index 0000000..e72a582 --- /dev/null +++ b/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio-edit/solicitudes-servicio-edit.component.html @@ -0,0 +1,353 @@ + + +
+ + + +
+ +
+ +
+
Agendó: {{usuarioAgendo}}
+
+ + + + + + Información básica + + +
+
+
+
+ +
+ + + + + + + {{filtro.denominacion}} {{(filtro.requiere_factura) ? '(Requiere factura)' : '(No requiere factura)'}} + + + + El campo es requerido + + +
+ +
+ + + + {{domicilio_cliente.calle}}{{" #"}}{{domicilio_cliente.num_ext}}{{" "}}{{domicilio_cliente.colonia}} {{" C.P. "}}{{domicilio_cliente.cp}} {{"(" + domicilio_cliente.telefono + ")"}} + + + + El campo es requerido + + +
+ +
+ + + + + + + {{filtro.nombre}} + + + + El campo es requerido + + +
+ +
+ + + + + + + {{filtro.nombre}} + + + + El campo es requerido + + +
+
+ + +
+ +
+
+ +
+
+
+ +
+ +
+ +
+ + + + + + + {{filtro.nombre}} + + + + El campo es requerido + + +
+ +
+ + + + {{tipo_servicio.nombre}} + + + + El campo es requerido + + +
+ +
+ + + + {{estatus_servicio.nombre}} + + + + El campo es requerido + + +
+ +
+ + $   + + + El campo es requerido + + + Sólo se aceptan números + + +
+ +
+ + Fecha de solicitud + + + + + El campo es requerido + + +
+ +
+ + + + {{hora}} + + + + El campo es requerido + + +
+ +
+ + + h   + + El campo es requerido + + + Sólo se aceptan números + + +
+ +
+ + + m   + + El campo es requerido + + + Sólo se aceptan números + + +
+ +
+
+ + +
+ +
+ +
+ + + + + + + {{filtro.num_economico}} + + + + El campo es requerido + + +
+ +
+ + + + + + + {{filtro.nombre}} {{filtro.apellido_paterno}} {{filtro.apellido_materno}} + + + + El campo es requerido + + +
+ +
+ Auxiliar de operaciones + + +
+
+ + + + + + + {{filtro.nombre}} {{filtro.apellido_paterno}} {{filtro.apellido_materno}} + + + + El campo es requerido + + + + +
+
+
+ +
+ + + +
+ +
+ + + + {{respuesta.name}} + + + + El campo es requerido + + +
+ +
+ + + + {{respuesta.name}} + + + + El campo es requerido + + +
+ +
+ + + + {{respuesta.name}} + + + + El campo es requerido + + +
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio-edit/solicitudes-servicio-edit.component.scss b/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio-edit/solicitudes-servicio-edit.component.scss new file mode 100644 index 0000000..a2f2b42 --- /dev/null +++ b/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio-edit/solicitudes-servicio-edit.component.scss @@ -0,0 +1,51 @@ +.btn-delete-service { + padding: 5px !important; + min-width: 0px !important; + line-height: 0px !important; +} + +.btn-delete-service:hover { + background: #E63C2D !important; + + .ic-trash { + color: white !important; + } +} + +.btn-search { + padding: 5px !important; + min-width: 0px !important; + line-height: 0px !important; +} + +.btn-search:hover:enabled { + background: #646c9a !important; + + .ic-search { + color: white !important; + } +} + +.btn-delete-auxiliar { + height: 0% !important; + padding: 4px 6px 5px 4px !important; + min-width: 0px !important; + line-height: 0px !important; + //height: 0px !important; +} + +.btn-delete-auxiliar:hover { + background: #E63C2D !important; + + .ic-trash { + color: white !important; + } +} + +.div-principal-agendo { + padding: 25px 0px 0px 25px; +} + +.div-agendo { + font-size: 1.3em; +} diff --git a/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio-edit/solicitudes-servicio-edit.component.spec.ts b/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio-edit/solicitudes-servicio-edit.component.spec.ts new file mode 100644 index 0000000..65cd856 --- /dev/null +++ b/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio-edit/solicitudes-servicio-edit.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SolicitudesServicioEditComponent } from './solicitudes-servicio-edit.component'; + +describe('SolicitudesServicioEditComponent', () => { + let component: SolicitudesServicioEditComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SolicitudesServicioEditComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SolicitudesServicioEditComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio-edit/solicitudes-servicio-edit.component.ts b/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio-edit/solicitudes-servicio-edit.component.ts new file mode 100644 index 0000000..308ca12 --- /dev/null +++ b/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio-edit/solicitudes-servicio-edit.component.ts @@ -0,0 +1,985 @@ +import { ChangeDetectorRef, Component, OnInit } from '@angular/core'; +import {FormBuilder, FormGroup, Validators, FormControl, FormArray} from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; +import {ReplaySubject, Subject, Subscription} from 'rxjs'; +import { ApiService } from '../../../../../core/api/api.service'; +import {LayoutUtilsService, MessageType} from '../../../../../core/_base/crud'; +import {GeneralResponseModel} from '../../models/general-response.model'; +import {FiltrosServiciosResponseModel} from '../../models/filtros-servicios-response.model'; +import moment from "moment"; +import Utils from "../../../../../utils"; +import {AuthService} from '../../../../../core/auth'; + +@Component({ + selector: 'kt-solicitudes-servicio-edit', + templateUrl: './solicitudes-servicio-edit.component.html', + styleUrls: ['./solicitudes-servicio-edit.component.scss'] +}) +export class SolicitudesServicioEditComponent implements OnInit { + + isLoading = false; + + //Search + lastLength = 0; + typingTimer; + typingInterval = 700; + + generalForm: FormGroup; + selectedTab = 0; + subscriptions: Subscription[] = []; + isNew = true; + id = 0; + + filteredClients: ReplaySubject = new ReplaySubject(1); + filteredServices: ReplaySubject = new ReplaySubject(1); + filteredFormasPagos: ReplaySubject = new ReplaySubject(1); + filteredOrigenes: ReplaySubject = new ReplaySubject(1); + domiciliosCliente; + origenes; + servicios; + tipoServicios; + estatusServicios; + fecha; + horas; + puede_editar = false; + vehiculos = []; + filteredVehiculos: Array> = new Array>(0); + newVehiculos = []; + asesores = []; + filteredAsesores: Array> = new Array>(0); + newAsesores = []; + + auxiliares1 = []; + auxiliares2 = []; + + auxiliares = []; + filteredAuxiliares1: Array> = new Array>(0); + filteredAuxiliares2: Array> = new Array>(0); + + newAuxiliares = []; + auxiliaresIds = ['auxiliar_1', 'auxiliar_2'] + + respuestasSiNo = [ + { + "value": "1", + "name": "Si" + }, + { + "value": "0", + "name": "No" + } + ]; + + recently = true; + + //input search filter + isLoadingInputSearch = false; + + camposServicios; + + //CAMPO VALIDAR DISPONIBILIDAD + solicitudServicioId = ''; + servicioDetId = ''; + isLoadingDisponibilidad = []; + + servicioID = null; + + disableAll = false; + + disableCheckBtn = false; + + usuarioAgendo = ""; + + user_info; + permiso_especial; + + constructor(private fb: FormBuilder, + private router: Router, + private layoutUtilsService: LayoutUtilsService, + private activatedRoute: ActivatedRoute, + private ref: ChangeDetectorRef, + private api: ApiService, + public auth: AuthService) { + + let routeSubscription = this.activatedRoute.params.subscribe(params => { + this.servicioID = params.id; + this.isNew = !(this.servicioID && this.servicioID > 0); + }); + this.subscriptions.push(routeSubscription); + + } + + ngOnInit() { + this.crearFormulario(); + this.crearFormularioServicio(this.generalForm); + this.getFiltros(); + this.horas = this.generateHours(); + this.user_info = this.auth.getUser(); + this.permiso_especial = this.user_info.permiso_especial; + } + + getServicio() { + + this.isLoading = true; + + if (!this.isNew) { + this.disableEnableAll(true); + + this.api.solicitudesServicioService.show(this.servicioID).subscribe(servicio => { + this.getOriginsFilter(servicio.origen_nombre); + this.getClientFilter(servicio.cliente_id); + this.getPaymentMethodsFilter(servicio.forma_pago_nombre); + this.usuarioAgendo = servicio.usuario_agenda_nombre + ' ' + servicio.usuario_agenda_apellido_paterno + ' ' + servicio.usuario_agenda_apellido_materno + + let ser = []; + + servicio.servicios.forEach((servicio, index) => { + + if (index != 0) + this.addServicio(); + + let fechaSolicitud = servicio.fecha_solicitud.split(' ', 2); + let horaSolicitud = fechaSolicitud[1].split(':',3); + let duracion = servicio.duracion.split(':',3); + this.getServiceFilter(servicio.servicio_nombre); + + servicio.servicio_id = Utils.toNumber(servicio.servicio_id); + servicio.tipo_servicio_id = Utils.toNumber(servicio.tipo_servicio_id); + servicio.estatus_servicio_id = Utils.toNumber(servicio.estatus_servicio_id); + servicio.vehiculo_id = Utils.toNumber(servicio.vehiculo_id); + servicio.operador_id = Utils.toNumber(servicio.operador_id); + servicio.auxiliar_1_id = Utils.toNumber(servicio.auxiliar_1_id); + servicio.auxiliar_2_id = Utils.toNumber(servicio.auxiliar_2_id); + + servicio.fecha_solicitud = this.dateFormat(fechaSolicitud[0]); + servicio.hora_solicitud = horaSolicitud[0] + ':' + horaSolicitud[1]; + servicio.horas_duracion = Number(duracion[0]).toString(); + servicio.minutos_duracion = duracion[1]; + ser.push(servicio); + }); + + servicio.servicios = ser; + + //servicio.origen_id = this.origenes.find((item) => item.id == servicio.origen_id); + //servicio.forma_pago_id = this.formasPago.find((item) => item.id == servicio.forma_pago_id); + + servicio.cliente_id = Utils.toNumber(servicio.cliente_id); + servicio.origen_id = Utils.toNumber(servicio.origen_id); + servicio.forma_pago_id = Utils.toNumber(servicio.forma_pago_id); + + this.generalForm.reset(servicio); + this.generalForm.updateValueAndValidity(); + + this.getDomiciliosCliente(servicio.cliente_id, servicio.cliente_domicilio_id); + + servicio.servicios.forEach((servicio, index) => { + this.formatCurrency(servicio.costo_servicio, index); + this.validarDisponibilidad(index, true,true, true,[],null,{ + vehiculo_id: servicio.vehiculo_id, + operador_id: servicio.operador_id, + auxiliar_1: servicio.auxiliar_1_id, + auxiliar_2: servicio.auxiliar_2_id + },servicio.puede_editar == 1); + }) + + this.disableEnableAll(false); + + servicio.servicios.forEach((servicio, index) => { + if(servicio.puede_editar == 0){ + this.generalForm.get('cliente_id').disable(); + this.generalForm.get('cliente_domicilio_id').disable(); + this.generalForm.get('forma_pago_id').disable(); + this.generalForm.get('origen_id').disable(); + this.getArrayItemFormControlName('servicio_id', index).disable(); + this.getArrayItemFormControlName('tipo_servicio_id', index).disable(); + this.getArrayItemFormControlName('estatus_servicio_id', index).disable(); + this.getArrayItemFormControlName('fecha_solicitud', index).disable(); + this.getArrayItemFormControlName('minutos_duracion', index).disable(); + this.getArrayItemFormControlName('horas_duracion', index).disable(); + this.getArrayItemFormControlName('hora_solicitud', index).disable(); + this.getArrayItemFormControlName('costo_servicio', index).disable(); + this.getArrayItemFormControlName('observacion_atencion_cliente', index).disable(); + this.getArrayItemFormControlName('facturado', index).disable(); + this.getArrayItemFormControlName('requiere_encuesta', index).disable(); + this.getArrayItemFormControlName('definido_cliente', index).disable(); + this.getArrayItemFormControlName('operador_id', index).disable(); + this.getArrayItemFormControlName('vehiculo_id', index).disable(); + this.generalForm.updateValueAndValidity(); + this.disableCheckBtn = true; + }else if(servicio.puede_editar == 2){ + this.generalForm.get('cliente_id').disable(); + this.generalForm.get('cliente_domicilio_id').disable(); + this.getArrayItemFormControlName('fecha_solicitud', index).disable(); + this.generalForm.updateValueAndValidity(); + this.disableCheckBtn = true; + } + }) + + this.isLoading = false; + }); + } else { + this.isLoading = false; + this.disableEnableAll(false); + } + } + + dateFormat(date){ + let d = new Date(date); + d.setDate(d.getDate() + 1); + return d; + } + + crearFormulario() { + this.generalForm = this.fb.group({ + cliente_id: new FormControl({value: null, disabled: false}, [Validators.required]), + cliente_domicilio_id: new FormControl({value: null, disabled: true}, [Validators.required]), + forma_pago_id: new FormControl({value: null, disabled: false}, [Validators.required]), + origen_id: new FormControl({value: null, disabled: false}, [Validators.required]), + servicios: new FormArray([]) + }); + } + + crearFormularioServicio(form: FormGroup): any { + let control = form.controls.servicios as FormArray; + this.camposServicios = control.controls; + this.addServicio(); + } + + addServicio(){ + if(this.camposServicios.length != 3){ + let controls = this.generalForm.get('servicios') as FormArray; + controls.push(this.initCampo()); + this.isLoadingDisponibilidad.push(false); + } + } + + deleteService(index){ + if(this.camposServicios.length > 1) { + let controls = this.generalForm.get('servicios') as FormArray; + controls.removeAt(index); + this.isLoadingDisponibilidad.splice(index, 1); + } + } + + initCampo = (): FormGroup => { + return this.fb.group({ + id: new FormControl({value: null, disabled: false}, []), + servicio_id: new FormControl({value: null, disabled: false}, [Validators.required]), + tipo_servicio_id: new FormControl({value: null, disabled: false}, [Validators.required]), + estatus_servicio_id: new FormControl({value: null, disabled: false}, [Validators.required]), + vehiculo_id: new FormControl({value: null, disabled: true}, [Validators.required]), + operador_id: new FormControl({value: null, disabled: true}, [Validators.required]), + costo_servicio: new FormControl({value: null, disabled: false}, [Validators.required, Validators.pattern(/^[$\-\s]*[\d\,]*?([\.]\d{0,2})?\s*$/)]), + observacion_atencion_cliente: new FormControl({value: null, disabled: false}, [Validators.max(700)]), + definido_cliente: new FormControl({value: 1, disabled: false}, [Validators.required]), + requiere_encuesta: new FormControl({value: 1, disabled: false}, [Validators.required]), + facturado: new FormControl({value: 1, disabled: false}, [Validators.required]), + fecha_solicitud: new FormControl({value: '', disabled: false}, [Validators.required]), + hora_solicitud: new FormControl({value: '', disabled: false}, [Validators.required]), + horas_duracion: new FormControl({value: '', disabled: false}, [Validators.required, Validators.pattern(/^[0-9]\d*$/)]), + minutos_duracion: new FormControl({value: '', disabled: false}, [Validators.required, Validators.pattern(/^[0-9]\d*$/)]), + auxiliar_1: new FormControl({value: null, disabled: true}, []), + auxiliar_2: new FormControl({value: null, disabled: true}, []), + }); + }; + + changeNoFoundLabel(){ + return this.isLoadingInputSearch ? 'Espere un momento...' : 'No se encontraron resultados'; + } + + isControlHasError(controlName: string, validationType: string): boolean { + let control = this.generalForm.controls[controlName]; + if (!control) { + return false; + } + return control.hasError(validationType) && (control.dirty || control.touched); + } + + onKeyUp(ev, tipo) { + let text = ev.target.value; + if(text != ''){ + this.isLoadingInputSearch = true; + clearTimeout(this.typingTimer); + this.typingTimer = setTimeout(() => { + switch (tipo){ + case 'client': { this.getClientFilter(text); break; } + case 'paymentMethod': { this.getPaymentMethodsFilter(text); break; } + case 'origins': { this.getOriginsFilter(text); break; } + } + }, this.typingInterval); + }else{ + this.isLoadingInputSearch = false; + } + } + + onKeyUpManual(ev, tipo, index, formControl = null) { + let text = ev.target.value; + + if(text != ''){ + this.recently = false; + } + + if(!this.recently){ + this.isLoadingInputSearch = true; + clearTimeout(this.typingTimer); + this.typingTimer = setTimeout(() => { + + switch (tipo){ + case 'vehicle': { this.getVehicleFilter(text, index); break; } + case 'consultant': { this.getConsultantFilter(text, index); break; } + case 'auxiliar': { this.getAuxiliarFilter(text, index, formControl); break; } + case 'service': { this.getServiceFilter(text); break; } + } + + if(text == ''){ + this.recently = true; + } + + }, this.typingInterval); + }else{ + this.isLoadingInputSearch = false; + } + + } + + getClientFilter(query = null){ + this.api.solicitudesServicioService.filtros('clientes?query='+query).subscribe(res => { + this.filteredClients.next(res.data.slice()); + this.isLoadingInputSearch = false; + this.ref.detectChanges(); + }); + } + + getPaymentMethodsFilter(query = null){ + this.api.solicitudesServicioService.filtros('formas_pago?query='+query).subscribe(res => { + this.filteredFormasPagos.next(res.data.slice()); + this.isLoadingInputSearch = false; + this.ref.detectChanges(); + }); + } + + getOriginsFilter(query = null){ + this.api.solicitudesServicioService.filtros('origenes?query='+query).subscribe(res => { + this.filteredOrigenes.next(res.data.slice()); + this.isLoadingInputSearch = false; + this.ref.detectChanges(); + }); + } + + getDomiciliosCliente(clienteId = null, clienteDomicilioId = null){ + this.changeStatusInputs(false, 'cliente_domicilio_id') + let id = clienteId? clienteId : this.generalForm.value.cliente_id; + this.api.solicitudesServicioService.clientesDomicilios(id).subscribe((res: GeneralResponseModel) =>{ + this.domiciliosCliente = res.data; + + if(this.generalForm.get('cliente_id').enabled) + this.changeStatusInputs(true, 'cliente_domicilio_id') + + if(clienteDomicilioId){ + const toSelect = this.domiciliosCliente.find((item) => item.id == clienteDomicilioId); + this.generalForm.get('cliente_domicilio_id').setValue(toSelect) + } + this.isLoading = false; + this.ref.detectChanges(); + }); + }; + + getFiltros(){ + this.api.solicitudesServicioService.filtrosServicios('filtros_servicios').subscribe((res: FiltrosServiciosResponseModel) => { + this.filteredOrigenes.next(res.origenes.slice()); + this.filteredFormasPagos.next(res.formas_pagos.slice()); + this.filteredServices.next(res.servicios.slice()); + this.tipoServicios = res.tipo_servicio; + this.estatusServicios = res.estatus_servicios; + this.initArraySelects(res.vehiculos, res.operadores, res.auxiliares); + this.ref.detectChanges(); + this.getServicio(); + }) + }; + + initArraySelects(vehiculos, operadores, auxiliares){ + + this.vehiculos = vehiculos; + this.asesores = operadores; + this.auxiliares = auxiliares; + + for (let i = 0; i < 3; i++){ + this.filteredVehiculos.push(new ReplaySubject(1)); + this.filteredVehiculos[i].next(vehiculos.slice()); + + this.filteredAsesores.push(new ReplaySubject(1)); + this.filteredAsesores[i].next(operadores.slice()); + + this.filteredAuxiliares1.push(new ReplaySubject(1)); + this.filteredAuxiliares1[i].next(auxiliares.slice()); + + this.filteredAuxiliares2.push(new ReplaySubject(1)); + this.filteredAuxiliares2[i].next(auxiliares.slice()); + } + } + + /*setDefaultValues(){ + const toSelect = this.origenes.find((item) => item.id == 1); + this.generalForm.get('origen_id').setValue(toSelect) + }*/ + + getVehicleFilter(query = null, index){ + this.api.solicitudesServicioService.filtros('vehiculos?query='+query).subscribe(res => { + this.isLoadingInputSearch = false; + this.validarDisponibilidad(index, true, false, false, res.data); + this.ref.detectChanges(); + }); + } + + getServiceFilter(query = null){ + this.api.solicitudesServicioService.filtros('cat_servicios?query='+query).subscribe(res => { + this.filteredServices.next(res.data.slice()); + this.isLoadingInputSearch = false; + this.ref.detectChanges(); + }); + } + + getConsultantFilter(query = null, index){ + this.api.solicitudesServicioService.filtros('operadores?query='+query).subscribe(res => { + this.validarDisponibilidad(index, false, true, false, res.data); + this.isLoadingInputSearch = false; + this.ref.detectChanges(); + }); + } + + getAuxiliarFilter(query = null, index, formControl){ + this.api.solicitudesServicioService.filtros('auxiliares?query='+query).subscribe(res => { + this.validarDisponibilidad(index, false, false, true, res.data, formControl); + this.isLoadingInputSearch = false; + this.ref.detectChanges(); + }); + } + + validarDisponibilidad(index, vehiculo = true, asesor = true, auxiliar = true, dataFiltered = [], formControl = null, vehiculoAsesorAuxdetail: any = false, puedeEditar = true){ + + let fechaSolicitud = this.getArrayItemFormControlName('fecha_solicitud', index); + let horaSolicitud = this.getArrayItemFormControlName('hora_solicitud', index); + let horasDuracion = this.getArrayItemFormControlName('horas_duracion', index); + let minutosDuracion = this.getArrayItemFormControlName('minutos_duracion', index); + + if(vehiculo && asesor && auxiliar) + this.clearSelectVAA(index); + + if(fechaSolicitud.value != '' && horaSolicitud.value != '' && (horasDuracion.value != '' || minutosDuracion.value != '')){ + this.isLoadingDisponibilidad[index] = true; + + if(vehiculo) + this.newVehiculos = []; + + if(asesor) + this.newAsesores = []; + + if(auxiliar) + this.newAuxiliares = []; + + let data = { + 'solicitud_servicio_id': (this.servicioID) ? this.servicioID : '', + 'servicio_det_id': (this.servicioID) ? this.servicioID : '', + 'fecha_solicitud': this.formatDate(fechaSolicitud.value) + ' ' + horaSolicitud.value, + 'horas_duracion': horasDuracion.value != ''? horasDuracion.value.padStart(2, 0) : '00', + 'minutos_duracion': minutosDuracion.value != ''? minutosDuracion.value.padStart(2, 0) : '00' + }; + + fechaSolicitud.disable(); + horaSolicitud.disable(); + horasDuracion.disable(); + minutosDuracion.disable(); + let isDataFiltered = dataFiltered.length != 0; + + this.api.solicitudesServicioService.validarDisponibilidad(data).subscribe(disponibilidad => { + + if(vehiculo){ + let vehicle = (isDataFiltered)? dataFiltered : this.vehiculos; + vehicle.forEach(vehiculo => { + this.newVehiculos.push({ + 'id': vehiculo.id, + 'descripcion': vehiculo.descripcion, + 'num_economico': vehiculo.num_economico, + 'tipo_vehiculo_id': vehiculo.tipo_vehiculo_id, + 'isDisable': (disponibilidad.find(disponibilidad => disponibilidad.vehiculo_id == vehiculo.id) != null) + }); + }); + + this.filteredVehiculos[index].next(this.newVehiculos.slice()); + if(puedeEditar) + this.getArrayItemFormControlName('vehiculo_id',index).enable(); + } + + if(asesor){ + let asesor = (isDataFiltered)? dataFiltered : this.asesores; + asesor.forEach(asesor => { + this.newAsesores.push({ + 'id': asesor.id, + 'nombre': asesor.nombre, + 'apellido_paterno': asesor.apellido_paterno, + 'apellido_materno': asesor.apellido_materno, + 'isDisable': (disponibilidad.find(disponibilidad => disponibilidad.operador_id == asesor.id) != null) + }); + }); + + this.filteredAsesores[index].next(this.newAsesores.slice()); + if(puedeEditar) + this.getArrayItemFormControlName('operador_id',index).enable(); + } + + if(auxiliar){ + + let auxiliares = []; + + if(formControl == 'auxiliar_1'){ + auxiliares = (isDataFiltered)? dataFiltered : this.auxiliares1; + }else if(formControl == 'auxiliar_2'){ + auxiliares = (isDataFiltered)? dataFiltered : this.auxiliares2; + } + + auxiliares.forEach(auxiliar => { + this.newAuxiliares.push({ + 'id': auxiliar.id, + 'nombre': auxiliar.nombre, + 'apellido_paterno': auxiliar.apellido_paterno, + 'apellido_materno': auxiliar.apellido_materno, + 'isDisable': (disponibilidad.find(disponibilidad => disponibilidad.auxiliar_1 == auxiliar.id || disponibilidad.auxiliar_2 == auxiliar.id) != null) + }); + }); + + if(formControl == 'auxiliar_1'){ + this.filteredAuxiliares1[index].next(this.newAuxiliares.slice()); + }else if(formControl == 'auxiliar_2'){ + this.filteredAuxiliares2[index].next(this.newAuxiliares.slice()); + } + } + + if(vehiculoAsesorAuxdetail){ + this.getArrayItemFormControlName('vehiculo_id', index).setValue(vehiculoAsesorAuxdetail.vehiculo_id); + this.getArrayItemFormControlName('operador_id', index).setValue(vehiculoAsesorAuxdetail.operador_id); + + if(vehiculoAsesorAuxdetail.auxiliar_1){ + let auxiliar1 = this.getArrayItemFormControlName('auxiliar_1', index); + auxiliar1.setValue(vehiculoAsesorAuxdetail.auxiliar_1); + if(puedeEditar) + auxiliar1.enable(); + } + + if(vehiculoAsesorAuxdetail.auxiliar_2){ + let auxiliar2 = this.getArrayItemFormControlName('auxiliar_2', index); + auxiliar2.setValue(vehiculoAsesorAuxdetail.auxiliar_2); + if(puedeEditar) + auxiliar2.enable(); + } + + this.generalForm.updateValueAndValidity(); + } + + this.isLoadingDisponibilidad[index] = false; + if(puedeEditar){ + fechaSolicitud.enable(); + horaSolicitud.enable(); + horasDuracion.enable(); + minutosDuracion.enable(); + } + }); + } + } + + getAuxiliares(formControl, index) { + return (formControl == 'auxiliar_1')? this.filteredAuxiliares1[index] : this.filteredAuxiliares2[index]; + } + + addAuxiliar(index){ + let auxiliar1 = this.getArrayItemFormControlName('auxiliar_1', index); + let auxiliar2 = this.getArrayItemFormControlName('auxiliar_2', index); + + if(!auxiliar1.enabled){ + auxiliar1.enable(); + this.setFormControlValidators('auxiliar_1', index, [Validators.required]); + return; + } + if(!auxiliar2.enabled){ + auxiliar2.enable(); + this.setFormControlValidators('auxiliar_2', index, [Validators.required]); + return; + } + } + + deleteAuxiliar(formControl, index){ + let auxiliar = this.getArrayItemFormControlName(formControl, index); + + if(!this.isNew && auxiliar.value){ + let title = 'Eliminar auxiliar de operaciones'; + let description = "¿Está seguro de eliminar el auxiliar de operaciones? La información sera eliminada del servicio."; + let waitDesciption = 'Eliminando auxiliar de operaciones...'; + let deleteMessage = `El auxiliar de operaciones ha sido eliminado con éxito`; + let errorMessage = `El auxiliar de operaciones no se ha podido eliminar`; + let btnText = 'Eliminar'; + + let dialogRef = this.layoutUtilsService.deleteElement( + title, description, waitDesciption, btnText + ); + dialogRef.afterClosed().subscribe(res => { + if (!res) { + return; + } + + let id = this.getArrayItemFormControlName('id', index).value; + + this.api.solicitudesServicioService.deleteAuxiliar(id, auxiliar.value).subscribe(() => { + this.layoutUtilsService.showActionNotification(deleteMessage, MessageType.Delete); + this.deleteAuxiliarLocal(auxiliar, formControl, index); + }, () => { + this.layoutUtilsService.showActionNotification(errorMessage, MessageType.Delete); + }); + }); + }else{ + this.deleteAuxiliarLocal(auxiliar, formControl, index); + } + } + + deleteAuxiliarLocal(auxiliar, formControl, index){ + auxiliar.disable(); + auxiliar.setValue(null); + this.setFormControlValidators(formControl, index, []); + } + + isDisableAuxiliarButton(index){ + let auxiliar1 = this.getArrayItemFormControlName('auxiliar_1', index).enabled; + let auxiliar2 = this.getArrayItemFormControlName('auxiliar_2', index).enabled; + let vehiculo = this.getArrayItemFormControlName('vehiculo_id',index).disabled; + let operador = this.getArrayItemFormControlName('operador_id',index).disabled; + + return vehiculo && operador || auxiliar1 && auxiliar2; + } + + isDisableAuxiliar(formControlName, index){ + return this.getArrayItemFormControlName(formControlName, index).enabled; + } + + clearSelectVAA(index){ + let vehiculo = this.getArrayItemFormControlName('vehiculo_id',index); + let operador = this.getArrayItemFormControlName('operador_id',index); + let auxiliar1 = this.getArrayItemFormControlName('auxiliar_1',index); + let auxiliar2 = this.getArrayItemFormControlName('auxiliar_2',index); + + vehiculo.setValue(null) + operador.setValue(null); + auxiliar1.setValue(null); + auxiliar2.setValue(null); + vehiculo.disable(); + operador.disable(); + auxiliar1.disable(); + auxiliar2.disable(); + } + + validateDuracion(index){ + let horasDuracion = this.getArrayItemFormControlName('horas_duracion', index).value; + let minutosDuracion = this.getArrayItemFormControlName('minutos_duracion', index).value; + + if(horasDuracion == '' && minutosDuracion == ''){ + this.setFormControlValidators('horas_duracion', index, [Validators.required, Validators.pattern(/^[0-9]\d*$/)]); + this.setFormControlValidators('minutos_duracion', index, [Validators.required, Validators.pattern(/^[0-9]\d*$/)]); + } + + if(horasDuracion != ''){ + this.setFormControlValidators('horas_duracion', index, [Validators.required, Validators.pattern(/^[0-9]\d*$/)]); + this.setFormControlValidators('minutos_duracion', index, [Validators.pattern(/^[0-9]\d*$/)]); + } + + if(minutosDuracion != ''){ + this.setFormControlValidators('horas_duracion', index, [Validators.pattern(/^[0-9]\d*$/)]); + this.setFormControlValidators('minutos_duracion', index, [Validators.required, Validators.pattern(/^[0-9]\d*$/)]); + } + + this.clearSelectVAA(index); + } + + setFormControlValidators(controlNameUpdate, index, validators){ + let formControl = this.getArrayItemFormControlName(controlNameUpdate, index); + formControl.clearValidators(); + formControl.setValidators(validators); + formControl.updateValueAndValidity(); + } + + enableSearchBtn(index){ + let fechaSolicitud = this.getArrayItemFormControlName('fecha_solicitud', index).value; + let horaSolicitud = this.getArrayItemFormControlName('hora_solicitud', index).value; + let horasDuracion = this.getArrayItemFormControlName('horas_duracion', index).value; + let minutosDuracion = this.getArrayItemFormControlName('minutos_duracion', index).value; + + if(!(fechaSolicitud != '' && horaSolicitud != '' && (horasDuracion != '' || minutosDuracion != ''))){ + this.getArrayItemFormControlName('vehiculo_id', index).disable(); + this.getArrayItemFormControlName('operador_id', index).disable(); + this.getArrayItemFormControlName('auxiliar_1', index).disable(); + this.getArrayItemFormControlName('auxiliar_2', index).disable(); + return true; + } + + return false; + } + + changeStatusInputs(enable, formControl){ + if(enable){ + this.generalForm.controls[formControl].enable(); + }else{ + this.generalForm.controls[formControl].disable(); + } + } + + onKeyDown(tipo, index = null) { + this.isLoadingInputSearch = false; + + switch (tipo){ + case 'client': { this.filteredClients.next([]); break; } + case 'service': { this.filteredServices.next([]); break; } + case 'paymentMethod': { this.filteredFormasPagos.next([]); break; } + case 'origins': { this.filteredOrigenes.next([]); break; } + case 'vehicle': { + if(!this.recently) + this.filteredVehiculos[index].next([]); + break; + } + case 'consultant': { + if(!this.recently) + this.filteredAsesores[index].next([]); + break; + } + case 'auxiliar_1': { + if(!this.recently) + this.filteredAuxiliares1[index].next([]); + break; + } + case 'auxiliar_2': { + if(!this.recently) + this.filteredAuxiliares2[index].next([]); + break; + } + } + + clearTimeout(this.typingTimer); + } + + isControlValid(controlName: string): boolean { + let control = this.generalForm.controls[controlName]; + if (!control) { + return false; + } else if (control.valid) { + return false; + } + return true; + } + + isControlHasErrorArray(controlName: string, validationType: string, i): boolean { + let cont = this.getArrayItemFormControlName(controlName, i) + return cont.hasError(validationType) && (cont.dirty || cont.touched); + } + + clearSelect(text){ + if(text == ''){ + this.filteredClients.next([]); + this.isLoadingInputSearch = false; + } + } + + generateHours() { + let date, array = []; + date = new Date(2023,1,1,0,0); + + while (date.getMinutes() % 15 !== 0) { + date.setMinutes ( date.getMinutes() + 1 ); + } + for (var i = 0; i < 24 * 4; i++) { + array.push(date.getHours().toString().padStart(2, '0') + ':' + date.getMinutes().toString().padStart(2,'0')); + date.setMinutes ( date.getMinutes() + 15); + } + + return array; + } + + numberOnly(event): boolean { + const charCode = (event.which) ? event.which : event.keyCode; + if (charCode > 31 && (charCode < 48 || charCode > 57)) { + return false; + } + return true; + } + + formatCurrency(input, index, blur = null) { + + let inputVal = (typeof input === 'string')? input : input.target.value; + + if (inputVal === "") { return; } + + if (inputVal.indexOf(".") >= 0) { + var decimalPos = inputVal.indexOf("."); + + var leftSide = inputVal.substring(0, decimalPos); + var rightSide = inputVal.substring(decimalPos); + + leftSide = this.formatNumber(leftSide); + rightSide = this.formatNumber(rightSide); + + if (blur === "blur") { + rightSide += "00"; + } + + rightSide = rightSide.substring(0, 2); + inputVal = leftSide + "." + rightSide; + + } else { + inputVal = this.formatNumber(inputVal); + if (blur === "blur") { + inputVal += ".00"; + } + } + + this.getArrayItemFormControlName('costo_servicio', index).setValue(inputVal); + } + + limitCurrency(index){ + let value = this.getArrayItemFormControlName('costo_servicio', index).value; + return value? value.replaceAll(',', '') < 999999 : true; + } + + formatNumber(n) { + return n.replace(/\D/g, "").replace(/\B(?=(\d{3})+(?!\d))/g, ",") + } + + getArrayItemFormControlName(formControlName, index){ + let controls = this.generalForm.get('servicios') as FormArray; + let control = controls.controls[index] as FormArray; + return control.controls[formControlName]; + } + + formatDate(date){ + return moment(date).format('YYYY-MM-DD'); + } + + onSubmit(){ + + let generalControls = this.generalForm.controls; + let generalControlsRequest = this.generalForm.getRawValue(); + + if (this.generalForm.invalid) { + Object.keys(generalControls).forEach(generalControlName => { + generalControls[generalControlName].markAsTouched(); + if(generalControlName == 'servicios'){ + // @ts-ignore + generalControls.servicios.controls.forEach(sC => { + Object.keys(sC.controls).forEach(servicioControlName => { + sC.controls[servicioControlName].markAsTouched(); + }) + }) + } + }) + return; + } + + let servicios = []; + + generalControlsRequest.servicios.forEach(servicio => { + let horaDuracion = servicio.horas_duracion != ''? servicio.horas_duracion.padStart(2, 0) : '00'; + let minutoDuracion = servicio.minutos_duracion != ''? servicio.minutos_duracion.padStart(2, 0) : '00'; + + let ser: any = { + id: servicio.id, + servicio_id: servicio.servicio_id, + tipo_servicio_id: servicio.tipo_servicio_id, + estatus_servicio_id: servicio.estatus_servicio_id, + definido_cliente: servicio.definido_cliente, + requiere_encuesta: servicio.requiere_encuesta, + vehiculo_id: servicio.vehiculo_id, + operador_id: servicio.operador_id, + costo_servicio: servicio.costo_servicio.replaceAll(',', ''), + observacion_atencion_cliente: servicio.observacion_atencion_cliente, + facturado: servicio.facturado, + duracion: horaDuracion + ':' + minutoDuracion + ':00', + fecha_solicitud: this.formatDate(servicio.fecha_solicitud) + ' ' + servicio.hora_solicitud + ':00', + } + + if(!servicio.auxiliar_1 && servicio.auxiliar_2){ + servicio.auxiliar_1 = servicio.auxiliar_2; + servicio.auxiliar_2 = null; + } + + if(servicio.auxiliar_1) + ser.auxiliar_1 = servicio.auxiliar_1; + + if(servicio.auxiliar_2) + ser.auxiliar_2 = servicio.auxiliar_2; + + servicios.push(ser); + }) + + let data = { + cliente_id: generalControlsRequest.cliente_id, + cliente_domicilio_id: generalControlsRequest.cliente_domicilio_id.id, + forma_pago_id: generalControlsRequest.forma_pago_id, + origen_id: generalControlsRequest.origen_id, + servicios: servicios + }; + + this.isLoading = true; + this.disableEnableAll(true); + + if(!this.isNew){ + this.api.solicitudesServicioService.update(this.servicioID, data).subscribe(res => { + this.isLoading = false; + this.router.navigate(['../../'], {relativeTo: this.activatedRoute}) + }, _ => { + this.isLoading = false; + this.disableEnableAll(false); + this.ref.detectChanges(); + }); + }else{ + this.api.solicitudesServicioService.create(data).subscribe(_ => { + this.isLoading = false; + this.router.navigate(['../'], {relativeTo: this.activatedRoute}) + }, _ => { + this.isLoading = false; + this.ref.detectChanges(); + }); + } + } + + disableEnableAll(disable = false){ + if(!this.isNew){ + let generalControls2 = this.generalForm.controls; + this.disableAll = disable; + + Object.keys(generalControls2).forEach(generalControlName => { + if(disable){ + generalControls2[generalControlName].disable(); + }else{ + generalControls2[generalControlName].enable(); + } + + if(generalControlName == 'servicios'){ + // @ts-ignore + generalControls2.servicios.controls.forEach(sC => { + Object.keys(sC.controls).forEach(servicioControlName => { + let control = sC.controls[servicioControlName]; + if(servicioControlName == 'auxiliar_1' || servicioControlName == 'auxiliar_2'){ + if(!control.value) { + control.disable(); + }else{ + control.enable(); + } + }else{ + if(disable) { + control.disable(); + }else{ + control.enable(); + } + } + }) + }) + } + }) + + this.generalForm.updateValueAndValidity(); + } + } +} diff --git a/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio-list/solicitudes-servicio-list.component.html b/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio-list/solicitudes-servicio-list.component.html new file mode 100644 index 0000000..cb561e0 --- /dev/null +++ b/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio-list/solicitudes-servicio-list.component.html @@ -0,0 +1,168 @@ + + +
+ +
+
+ + + +
+
+
+
+ + + > + Buscar en todos los campos + + +
+ +
+ + Selecciona el día + + + + +
+ +
+ + + Todos + {{filtro.nombre}} + + + Estado de servicio + + +
+ +
+ +
+ + + +
+
+
+ +
+ + + + Solicitud + {{data.solicitud_servicio_id}} + + + + Estado de servicio + {{(data.estatus_servicio_nombre != null)? data.estatus_servicio_nombre : '-'}} + + + + Fecha y hora de registro + {{(data.fecha_agenda != null | date:'dd/MM/yyyy hh:mm a')? (data.fecha_agenda | date:'dd/MM/yyyy hh:mm a') : '-'}} + + + + Fecha y hora programada + {{(data.fecha_solicitud != null | date:'dd/MM/yyyy hh:mm a')? (data.fecha_solicitud | date:'dd/MM/yyyy hh:mm a') : '-'}} + + + + Tiempo de respuesta + {{(data.tiempo_atencion != null)? data.tiempo_atencion : '-'}} + + + + Cliente / Denominación + {{(data.denominacion != null)? data.denominacion : '-'}} + + + + Colonia + {{(data.clientes_colonia != null)? data.clientes_colonia : '-'}} + + + + Forma de pago + {{(data.forma_pago_nombre != null)? data.forma_pago_nombre : '-'}} + + + + Servicio + +
+ + {{(data.litraje && data.litraje != '0')? 'info' : 'add_circle' }} + + {{(data.servicio_nombre != null)? data.servicio_nombre : '-'}} +
+ +
+
+ + + Tipo de servicio + {{(data.tipo_servicio_nombre != null)? data.tipo_servicio_nombre : '-'}} + + + + Facturado + + + + + Vehículo + {{(data.vehiculo_num_economico != null)? data.vehiculo_num_economico : '-'}} + + + + Asesor / Auxiliar de operaciones + +
+
{{(data.operador_apellido_paterno != null)? data.operador_apellido_paterno + ' ' + data.operador_apellido_materno + ' ' + data.operador_nombre : '-'}}
+
+
{{(data.auxiliar_1 != null)? data.auxiliar_1 : '-'}}
+
+
+
+ + + + + + + + + + + + +
+
No se encontraron registros.
+
Espera un momento....
+
+ +
+ + +
+
+ +
diff --git a/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio-list/solicitudes-servicio-list.component.scss b/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio-list/solicitudes-servicio-list.component.scss new file mode 100644 index 0000000..871e14f --- /dev/null +++ b/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio-list/solicitudes-servicio-list.component.scss @@ -0,0 +1,85 @@ +::ng-deep .multiline-tooltip { + white-space: pre-line !important; + font-size: 1.3em !important; + color: white !important; + text-align: center !important; +} + +.mat-icon-info { + cursor: pointer; + color: #E63C2D !important; +} + +.mat-icon-info:hover { + color: #df685d !important; +} + +.span-servicio-nombre { + padding-left: 24px !important; +} + +@media screen and (max-width: 1499px) { + .table-responsive { + display: block; + width: 100%; + overflow-x: auto; + z-index: 1; + mat-table { + width: 100%; + max-width: 100%; + margin-bottom: 1rem; + display: table; + border-collapse: collapse; + margin: 0px; + } + mat-row, + mat-header-row { + display: table-row; + } + mat-cell, + mat-header-cell { + word-wrap: initial; + display: table-cell; + padding: 0px 5px; + line-break: unset; + width: auto; + white-space: nowrap; + overflow: hidden; + vertical-align: middle; + } + } +} + +@media screen and (min-width: 1500px) { + mat-header-cell { + text-wrap: normal!important; + font-size: 1.2em!important; + text-align: left!important; + padding-left: 5px!important; + padding-right: 5px!important; + } + + mat-cell { + text-wrap: normal!important; + font-size: 1.2em!important; + padding-left: 5px!important; + padding-right: 5px!important; + align-self: center!important; + } + + .maxwidth200 { + max-width: 200px!important; + } + + .maxwidth150 { + max-width: 150px!important; + } + + .maxwidth100 { + max-width: 100px!important; + } + + .maxwidth80 { + max-width: 80px!important; + } +} diff --git a/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio-list/solicitudes-servicio-list.component.spec.ts b/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio-list/solicitudes-servicio-list.component.spec.ts new file mode 100644 index 0000000..68de40b --- /dev/null +++ b/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio-list/solicitudes-servicio-list.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SolicitudesServicioListComponent } from './solicitudes-servicio-list.component'; + +describe('SolicitudesServicioListComponent', () => { + let component: SolicitudesServicioListComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SolicitudesServicioListComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SolicitudesServicioListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio-list/solicitudes-servicio-list.component.ts b/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio-list/solicitudes-servicio-list.component.ts new file mode 100644 index 0000000..af13f6b --- /dev/null +++ b/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio-list/solicitudes-servicio-list.component.ts @@ -0,0 +1,179 @@ +import {ChangeDetectorRef, Component, OnInit, ViewChild} from '@angular/core'; +import {FormBuilder, FormGroup, Validators} from '@angular/forms'; +import {MatDialog, MatInput, MatTableDataSource} from '@angular/material'; +import { ApiService } from '../../../../../core/api/api.service'; +import { ModalEncuestaComponent } from '../modal-encuesta/modal-encuesta.component'; +import { ModalSetLitrajeComponent } from '../modal-set-litraje/modal-set-litraje.component'; +import { SolicitudesServicio } from '../solicitudes-servicio.model'; +import moment from "moment"; +import {ActivatedRoute, Router} from "@angular/router"; +import {environment} from '../../../../../../environments/environment'; +import {FiltrosServiciosResponseModel} from '../../models/filtros-servicios-response.model'; + +@Component({ + selector: 'kt-solicitudes-servicio-list', + templateUrl: './solicitudes-servicio-list.component.html', + styleUrls: ['./solicitudes-servicio-list.component.scss'] +}) +export class SolicitudesServicioListComponent implements OnInit { + + @ViewChild('inputElement', {static: false, read: MatInput}) inputElement: MatInput; + //Search + lastLength = 0; + typingTimer; + typingInterval = 1500; + serviciosForm: FormGroup; + + displayedColumns: string[] = ['solicitud_servicio_id', 'estatus_servicio_nombre', 'fecha_agenda', 'fecha_solicitud', 'tiempo_atencion', 'denominacion', 'clientes_colonia', 'forma_pago_nombre', 'servicio_nombre', 'tipo_servicio_nombre', 'facturado', 'vehiculo_num_economico', 'operador_apellido_paterno', 'actions']; + dataSource: MatTableDataSource; + estatusServicios = null; + estatusSelected = null; + + //Loadings + isLoading = true; + showMessageWait = true; + + //Paginator, Searcher + searchText: string; + sortBy = 'servicios_det.fecha_solicitud'; + order = 'asc'; + page = '1'; + perPage = 10; + total = 0; + pages = [10, 25, 50, 100]; + titulo = 'Solicitudes de Servicios'; + + constructor(private api: ApiService, + private ref: ChangeDetectorRef, + private router: Router, + private activatedRoute: ActivatedRoute, + private dialog: MatDialog, + private fb: FormBuilder) { + this.dataSource = new MatTableDataSource(); + } + + ngOnInit() { + this.crearFormulario(); + this.getFiltros(); + } + + getData(fecha){ + + if(fecha) this.inputElement.value = ''; + this.isLoading = true; + this.ref.detectChanges(); + + this.api.solicitudesServicioService.index2(this.page, this.searchText, this.sortBy, this.order, this.perPage + "", null, null, !fecha ? this.formatDate(this.serviciosForm.controls['date'].value) : null, (this.estatusSelected) ? this.estatusSelected : null).subscribe(res =>{ + this.isLoading = false; + this.showMessageWait = false; + this.dataSource.data = res.data; + this.total = res.total; + this.ref.detectChanges(); + }, ()=>{ + this.isLoading = false; + this.showMessageWait = false; + }) + } + + getFiltros(){ + this.api.solicitudesServicioService.filtrosServicios('filtros_servicios').subscribe((res: FiltrosServiciosResponseModel) => { + this.estatusServicios = res.estatus_servicios; + }) + }; + + getInfoByEstatus(id){ + this.estatusSelected = id; + this.getData(false); + } + + formatDate(fecha){ + return moment(fecha).format('YYYY-MM-DD'); + } + + crearFormulario() { + this.serviciosForm = this.fb.group({ + date: [new Date(), [Validators.required]] + }); + } + + ngAfterViewInit(): void { + this.getData(false); + } + + editLitraje(servicio){ + + const dialogRef = this.dialog.open(ModalSetLitrajeComponent, { + data: servicio, + disableClose: true + }); + + dialogRef.afterClosed().subscribe(result => { + if(result){ + this.dataSource.data = []; + this.isLoading = true; + this.ref.detectChanges(); + this.getData(false); + } + }); + } + + openQuiz(id) { + const dialogRef = this.dialog.open(ModalEncuestaComponent, { + data: id, + disableClose: true, + maxHeight: '100vh' + }); + + dialogRef.afterClosed().subscribe(result => { + if(result){ + } + }); + } + + openPDF(servicioEncId, servicioDetId) { + window.open(environment.API + `atencionclientes/solicitud_servicios/solicitud/${servicioEncId}/servicio/${servicioDetId}?token=`+this.api.getAccessToken(), '_blank') + } + + editSurvey(id) { + this.router.navigate(['../solicitudes-servicio/edit/', id], {relativeTo: this.activatedRoute}) + } + + sort(event) { + this.order = event.direction; + this.sortBy = event.active; + this.getData(false); + } + + paginator(event) { + let nextPage = event.pageIndex + 1; + this.page = nextPage.toString(); + this.perPage = event.pageSize.toString(); + this.getData(false); + } + + //Search + filtrarBusqueda(filterValue: string) { + if (filterValue.length != 0) { + this.searchText = filterValue.trim().toLowerCase(); + this.getData(false); + } else if (this.lastLength != 0) { + this.searchText = ''; + this.getData(false); + } + + this.lastLength = filterValue.length; + } + + onKeyUp(ev) { + clearTimeout(this.typingTimer); + this.typingTimer = setTimeout(() => { + this.filtrarBusqueda(ev.target.value) + }, this.typingInterval); + } + + onKeyDown() { + this.showMessageWait = true; + this.dataSource.data = []; + clearTimeout(this.typingTimer); + }//Fin search +} diff --git a/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio.model.ts b/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio.model.ts new file mode 100644 index 0000000..7146667 --- /dev/null +++ b/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio.model.ts @@ -0,0 +1,65 @@ +export class SolicitudesServicio { + id: number; + aceptado: string; + auxiliar_1: string; + auxiliar_1_id: string; + auxiliar_2: string; + auxiliar_2_id: string; + cantidad_servicios: string; + cliente_domicilio_id: string; + cliente_id: string; + clientes_calle: string; + clientes_celular_responsable: string; + clientes_colonia: string; + clientes_cp: string; + clientes_lat: string; + clientes_lng: string; + clientes_nombre_responsable_sucursal: string; + clientes_num_ext: string; + clientes_num_int: string; + clientes_telefono: string; + costo_servicio: string; + definido_cliente: string; + deleted_at: string; + denominacion: string; + duracion: string; + encuesta_contestada: string; + estatus_servicio_color_1: string; + estatus_servicio_color_2: string; + estatus_servicio_id: string; + estatus_servicio_nombre: string; + facturado: string; + fecha_agenda: string; + fecha_solicitud: string; + forma_pago_id: string; + forma_pago_nombre: string; + forma_pago_zeros: string; + iniciado: string; + litraje: string; + motivo_estatus: string; + observacion_atencion_cliente: string; + operador_apellido_materno: string; + operador_apellido_paterno: string; + operador_id: string; + operador_nombre: string; + operador_sucursal: string; + operador_sucursal_id: string; + progreso_solicitud_id: string; + requiere_encuesta: string; + servicio_id: string; + servicio_nombre: string; + solicitud_servicio_id: string; + sucursal_auxiliar_1: string; + sucursal_auxiliar_2: string; + tiempo_atencion: string; + tipo_servicio_id: string; + tipo_servicio_nombre: string; + usuario_agenda_apellido_materno: string; + usuario_agenda_apellido_paterno: string; + usuario_agenda_id: string; + usuario_agenda_nombre: string; + vehiculo_id: string; + vehiculo_num_economico: string; + vehiculo_sucursal: string; + vehiculo_sucursal_id: string; +} diff --git a/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio.service.ts b/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio.service.ts new file mode 100644 index 0000000..6c3acc0 --- /dev/null +++ b/src/app/views/pages/servicios/solicitudes-servicio/solicitudes-servicio.service.ts @@ -0,0 +1,92 @@ +import {Injectable} from '@angular/core'; +import {ResourceBase} from '../../../../core/api/resource'; +import {HttpClient, HttpParams} from '@angular/common/http'; +import { isNullOrUndefined } from 'util'; +import {environment} from '../../../../../environments/environment'; +import { catchError } from 'rxjs/operators'; +import { Observable } from 'rxjs'; +import {GeneralResponseModel} from '../models/general-response.model'; + +@Injectable({ + providedIn: 'root' +}) +export class SolicitudesServicioService extends ResourceBase { + + baseUrl = environment.API; + + constructor(public http: HttpClient) { + super(http, 'atencionclientes/solicitud_servicios'); + } + + public index2(page?: string, searchText?: string, sortBy?: string, order?: string, perPage?: string, visible?: string, deleted_at?: string, fecha?: string, estatus_servicio?: string): Observable { + + const params = new HttpParams() + .set('sortBy', isNullOrUndefined(sortBy) ? '' : sortBy) + .set('order', isNullOrUndefined(order) ? '' : order) + .set('page', isNullOrUndefined(page) ? '1' : page) + .set('perPage', isNullOrUndefined(perPage) ? '10' : perPage) + .set('visible', isNullOrUndefined(visible) ? '1' : visible) + .set('deleted', isNullOrUndefined(deleted_at) ? '0' : deleted_at) + .set('query', searchText ? searchText : '') + .set('fecha', fecha ? fecha : '') + .set('estatus_servicio', estatus_servicio ? estatus_servicio : ''); + + const options = {params: params}; + + return this.http.get(this.baseUrl + 'atencionclientes/solicitud_servicios', options).pipe( + catchError(this.handleError('index')) + ); + } + + public updateLitraje(body: any, servicioProgresoId): Observable { + return this.http.post(this.baseUrl + 'atencionclientes/solicitud_servicios/' + servicioProgresoId + '/litraje', body).pipe( + catchError(this.handleError('create')) + ); + } + + public getQuiz(id){ + return this.http.get(this.baseUrl + 'atencionclientes/solicitud_servicios/'+ id +'/encuesta').pipe( + catchError(this.handleError('index')) + ); + } + + public filtros(url: string, deleted_at: string = '0'): Observable { + + const params = new HttpParams() + .set('deleted', isNullOrUndefined(deleted_at) ? '0' : deleted_at); + + const options = {params: params}; + + return this.http.get(this.baseUrl + 'atencionclientes/solicitud_servicios/' + url, options).pipe( + catchError(this.handleError('index')) + ); + } + + public formasPagos(url: string){ + return this.http.get(this.baseUrl + 'atencionclientes/solicitud_servicios/' + url).pipe(catchError(this.handleError('index'))); + } + + public clientesDomicilios(clienteID: string){ + return this.http.get(this.baseUrl + 'atencionclientes/solicitud_servicios/clientes/' + clienteID + '/domicilios').pipe(catchError(this.handleError('index'))); + } + + public origenes(url: string){ + return this.http.get(this.baseUrl + 'atencionclientes/solicitud_servicios/' + url).pipe(catchError(this.handleError('index'))); + } + + public filtrosServicios(url: string){ + return this.http.get(this.baseUrl + 'atencionclientes/solicitud_servicios/' + url).pipe(catchError(this.handleError('index'))); + } + + public validarDisponibilidad(body: any): Observable { + return this.http.post(this.baseUrl + 'atencionclientes/solicitud_servicios/validar_disponibilidad', body).pipe( + catchError(this.handleError('create')) + ); + } + + public deleteAuxiliar(id: number, auxiliarId): Observable { + return this.http.get(this.baseUrl + 'atencionclientes/solicitud_servicios/' + id + '/auxiliares/' + auxiliarId + '/remove?todos=0').pipe( + catchError(this.handleError('index')) + ); + } +} diff --git a/src/app/views/partials/content/crud/action-natification/action-notification.component.html b/src/app/views/partials/content/crud/action-natification/action-notification.component.html new file mode 100644 index 0000000..71663ee --- /dev/null +++ b/src/app/views/partials/content/crud/action-natification/action-notification.component.html @@ -0,0 +1,16 @@ +
+
{{data.message}}
+
+ +
+
+ +
+
diff --git a/src/app/views/partials/content/crud/action-natification/action-notification.component.ts b/src/app/views/partials/content/crud/action-natification/action-notification.component.ts new file mode 100644 index 0000000..3f713d9 --- /dev/null +++ b/src/app/views/partials/content/crud/action-natification/action-notification.component.ts @@ -0,0 +1,61 @@ +// Angular +import { Component, Inject, OnInit, ChangeDetectionStrategy } from '@angular/core'; +import { MAT_SNACK_BAR_DATA } from '@angular/material'; +// RxJS +import { delay } from 'rxjs/operators'; +import { of } from 'rxjs'; + +@Component({ + selector: 'kt-action-natification', + templateUrl: './action-notification.component.html', + changeDetection: ChangeDetectionStrategy.Default + +}) +export class ActionNotificationComponent implements OnInit { + /** + * Component constructor + * + * @param data: any + */ + constructor(@Inject(MAT_SNACK_BAR_DATA) public data: any) { } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + if (!this.data.showUndoButton || (this.data.undoButtonDuration >= this.data.duration)) { + return; + } + + this.delayForUndoButton(this.data.undoButtonDuration).subscribe(() => { + this.data.showUndoButton = false; + }); + } + + /* + * Returns delay + * + * @param timeToDelay: any + */ + delayForUndoButton(timeToDelay) { + return of('').pipe(delay(timeToDelay)); + } + + /** + * Dismiss with Action + */ + onDismissWithAction() { + this.data.snackBar.dismiss(); + } + + /** + * Dismiss + */ + public onDismiss() { + this.data.snackBar.dismiss(); + } +} diff --git a/src/app/views/partials/content/crud/alert/alert.component.html b/src/app/views/partials/content/crud/alert/alert.component.html new file mode 100644 index 0000000..6b9c95f --- /dev/null +++ b/src/app/views/partials/content/crud/alert/alert.component.html @@ -0,0 +1,16 @@ + diff --git a/src/app/views/partials/content/crud/alert/alert.component.ts b/src/app/views/partials/content/crud/alert/alert.component.ts new file mode 100644 index 0000000..dd0e19b --- /dev/null +++ b/src/app/views/partials/content/crud/alert/alert.component.ts @@ -0,0 +1,39 @@ +// Angular +import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; + +@Component({ + selector: 'kt-alert', + templateUrl: './alert.component.html' +}) +export class AlertComponent implements OnInit { + // Public properties + @Input() type: 'primary | accent | warn'; + @Input() duration = 0; + @Input() showCloseButton = true; + @Output() close = new EventEmitter(); + alertShowing = true; + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + if (this.duration === 0) { + return; + } + + setTimeout(() => { + this.closeAlert(); + }, this.duration); + } + + /** + * close alert + */ + closeAlert() { + this.close.emit(); + } +} diff --git a/src/app/views/partials/content/crud/delete-entity-dialog/delete-entity-dialog.component.html b/src/app/views/partials/content/crud/delete-entity-dialog/delete-entity-dialog.component.html new file mode 100644 index 0000000..992cb60 --- /dev/null +++ b/src/app/views/partials/content/crud/delete-entity-dialog/delete-entity-dialog.component.html @@ -0,0 +1,29 @@ +
+
+
+ + +
+
+

{{data.title}}

+ + + +
+
+
+
+
+
+ {{viewLoading ? data.waitDesciption : data.description}} +
+
+
+
+
+   + +
+
+
+
diff --git a/src/app/views/partials/content/crud/delete-entity-dialog/delete-entity-dialog.component.ts b/src/app/views/partials/content/crud/delete-entity-dialog/delete-entity-dialog.component.ts new file mode 100644 index 0000000..cdb7963 --- /dev/null +++ b/src/app/views/partials/content/crud/delete-entity-dialog/delete-entity-dialog.component.ts @@ -0,0 +1,51 @@ +// Angular +import { Component, Inject, OnInit } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material'; + +@Component({ + selector: 'kt-delete-entity-dialog', + templateUrl: './delete-entity-dialog.component.html' +}) +export class DeleteEntityDialogComponent implements OnInit { + // Public properties + viewLoading = false; + + /** + * Component constructor + * + * @param dialogRef: MatDialogRef + * @param data: any + */ + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any + ) { } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + } + + /** + * Close dialog with false result + */ + onNoClick(): void { + this.dialogRef.close(); + } + + /** + * Close dialog with true result + */ + onYesClick(): void { + /* Server loading imitation. Remove this */ + this.viewLoading = true; + setTimeout(() => { + this.dialogRef.close(true); // Keep only this row + }, 2500); + } +} diff --git a/src/app/views/partials/content/crud/fetch-entity-dialog/fetch-entity-dialog.component.html b/src/app/views/partials/content/crud/fetch-entity-dialog/fetch-entity-dialog.component.html new file mode 100644 index 0000000..263ee69 --- /dev/null +++ b/src/app/views/partials/content/crud/fetch-entity-dialog/fetch-entity-dialog.component.html @@ -0,0 +1,30 @@ +
+
+
+

Fetch selected elements

+ + + +
+
+
+
+
+
+
+ + {{message.text}} + ID: {{message.id}} + +
+
+
+
+
+
+   +   +
+
+
+
diff --git a/src/app/views/partials/content/crud/fetch-entity-dialog/fetch-entity-dialog.component.ts b/src/app/views/partials/content/crud/fetch-entity-dialog/fetch-entity-dialog.component.ts new file mode 100644 index 0000000..eb29d54 --- /dev/null +++ b/src/app/views/partials/content/crud/fetch-entity-dialog/fetch-entity-dialog.component.ts @@ -0,0 +1,41 @@ +// Angular +import { Component, Inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material'; + +@Component({ + selector: 'kt-fetch-entity-dialog', + templateUrl: './fetch-entity-dialog.component.html' +}) +export class FetchEntityDialogComponent { + /** + * Component constructor + * + * @param dialogRef: MatDialogRef, + * @param data: any + */ + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any + ) {} + + /** + * Close dialog with false result + */ + onNoClick(): void { + this.dialogRef.close(); + } + + /** UI */ + /** + * Returns CSS Class Name by status type + * @param status: number + */ + getItemCssClassByStatus(status: number = 0) { + switch (status) { + case 0: return 'success'; + case 1: return 'metal'; + case 2: return 'danger'; + default: return 'success'; + } + } +} diff --git a/src/app/views/partials/content/crud/index.ts b/src/app/views/partials/content/crud/index.ts new file mode 100644 index 0000000..004842c --- /dev/null +++ b/src/app/views/partials/content/crud/index.ts @@ -0,0 +1,6 @@ +// Components +export { UpdateStatusDialogComponent } from './update-status-dialog/update-status-dialog.component'; +export { FetchEntityDialogComponent } from './fetch-entity-dialog/fetch-entity-dialog.component'; +export { DeleteEntityDialogComponent } from './delete-entity-dialog/delete-entity-dialog.component'; +export { AlertComponent } from './alert/alert.component'; +export { ActionNotificationComponent } from './action-natification/action-notification.component'; diff --git a/src/app/views/partials/content/crud/update-status-dialog/update-status-dialog.component.html b/src/app/views/partials/content/crud/update-status-dialog/update-status-dialog.component.html new file mode 100644 index 0000000..aed05b4 --- /dev/null +++ b/src/app/views/partials/content/crud/update-status-dialog/update-status-dialog.component.html @@ -0,0 +1,46 @@ +
+
+
+

{{data.title}}

+ + + +
+
+
+
+
+ +
+
+
+
+ + {{message.text}} + {{message.statusTitle}} + +
+
+
+
+
+
+
+
+ + + {{status.text}} + + Select + Status for rows updating + +   +   + +
+ +
+
+
+
+
diff --git a/src/app/views/partials/content/crud/update-status-dialog/update-status-dialog.component.ts b/src/app/views/partials/content/crud/update-status-dialog/update-status-dialog.component.ts new file mode 100644 index 0000000..ce88397 --- /dev/null +++ b/src/app/views/partials/content/crud/update-status-dialog/update-status-dialog.component.ts @@ -0,0 +1,42 @@ +// Angular +import { Component, Inject, OnInit } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material'; +import { FormControl } from '@angular/forms'; + +@Component({ + selector: 'kt-update-status-dialog', + templateUrl: './update-status-dialog.component.html' +}) +export class UpdateStatusDialogComponent implements OnInit { + selectedStatusForUpdate = new FormControl(''); + viewLoading = false; + loadingAfterSubmit = false; + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any) {} + + ngOnInit() { + /* Server loading imitation. Remove this */ + this.viewLoading = true; + setTimeout(() => { + this.viewLoading = false; + }, 2500); + } + + onNoClick(): void { + this.dialogRef.close(); + } + + updateStatus() { + if (this.selectedStatusForUpdate.value.length === 0) { + return; + } + + /* Server loading imitation. Remove this */ + this.viewLoading = true; + this.loadingAfterSubmit = true; + setTimeout(() => { + this.dialogRef.close(this.selectedStatusForUpdate.value); // Keep only this row + }, 2500); + } +} diff --git a/src/app/views/partials/content/general/accordion-control/accordion-control.component.html b/src/app/views/partials/content/general/accordion-control/accordion-control.component.html new file mode 100644 index 0000000..61e0083 --- /dev/null +++ b/src/app/views/partials/content/general/accordion-control/accordion-control.component.html @@ -0,0 +1,49 @@ + +
+ + + + + +
+
+ +
+
+ + + +
+
+ +
+
+ +
+
diff --git a/src/app/views/partials/content/general/accordion-control/accordion-control.component.ts b/src/app/views/partials/content/general/accordion-control/accordion-control.component.ts new file mode 100644 index 0000000..dab3065 --- /dev/null +++ b/src/app/views/partials/content/general/accordion-control/accordion-control.component.ts @@ -0,0 +1,242 @@ +import { AfterContentChecked, Component, ContentChildren, Directive, EventEmitter, Input, Output, QueryList, + TemplateRef, ChangeDetectionStrategy } from '@angular/core'; + +let nextId = 0; +/** + * This directive should be used to wrap accordion panel titles that need to contain HTML markup or other directives. + */ +@Directive({ + // tslint:disable-next-line:directive-selector + selector: 'ng-template[AccordionControlPanelTitle]' +}) +export class AccordionControlPanelTitleDirective { + constructor(public templateRef: TemplateRef) { } +} + +/** + * This directive must be used to wrap accordion panel content. + */ +@Directive({ + // tslint:disable-next-line:directive-selector + selector: 'ng-template[AccordionControlPanelContent]' +}) +export class AccordionControlPanelContentDirective { + constructor(public templateRef: TemplateRef) { } +} + +/** + * The NgbPanel directive represents an individual panel with the title and collapsible + * content + */ +@Directive({ + // tslint:disable-next-line:directive-selector + selector: 'kt-accordion-control-panel' +}) +export class AccordionControlPanelDirective implements AfterContentChecked { + /** + * A flag determining whether the panel is disabled or not. + * When disabled, the panel cannot be toggled. + */ + @Input() disabled = false; + height = 0; + contentHeight = 0; + + /** + * An optional id for the panel. The id should be unique. + * If not provided, it will be auto-generated. + */ + @Input() id = `kt-accordion-control-panel-${nextId++}`; + + /** + * A flag telling if the panel is currently open + */ + isOpen = false; + + /** + * The title for the panel. + */ + @Input() title: string; + /** + * The icon for the panel + */ + @Input() iconClass: string; + + @Input() hasBodyWrapper: string; + + + /** + * Accordion's types of panels to be applied per panel basis. + * Bootstrap recognizes the following types: "primary", "secondary", "success", "danger", "warning", "info", "light" + * and "dark" + */ + @Input() type: string; + + titleTpl: AccordionControlPanelTitleDirective | null; + contentTpl: AccordionControlPanelContentDirective | null; + + @ContentChildren(AccordionControlPanelTitleDirective, { descendants: false }) titleTpls: QueryList; + @ContentChildren(AccordionControlPanelContentDirective, { descendants: false }) contentTpls: + QueryList; + + ngAfterContentChecked() { + // We are using @ContentChildren instead of @ContantChild as in the Angular version being used + // only @ContentChildren allows us to specify the {descendants: false} option. + this.titleTpl = this.titleTpls.first; + this.contentTpl = this.contentTpls.first; + } +} + +/** + * The payload of the change event fired right before toggling an accordion panel + */ +export interface AccordionControlPanelChangeEvent { + /** + * Id of the accordion panel that is toggled + */ + panelId: string; + + /** + * Whether the panel will be opened (true) or closed (false) + */ + nextState: boolean; + + /** + * Function that will prevent panel toggling if called + */ + preventDefault: () => void; +} + + +/** + * The NgbAccordion directive is a collection of panels. + * It can assure that only one panel can be opened at a time. + */ +@Component({ + selector: 'kt-accordion-control', + exportAs: 'AccordionControl', + host: { + role: 'tablist', + '[attr.aria-multiselectable]': '!closeOtherPanels', + class: 'accordion' + }, + templateUrl: './accordion-control.component.html', + styles: [` + .accordion--animation { + overflow: hidden; + -webkit-transition: height .5s; + transition: height .5s; + } + `], + changeDetection: ChangeDetectionStrategy.OnPush + +}) +export class AccordionControlComponent implements AfterContentChecked { + @ContentChildren(AccordionControlPanelDirective) panels: QueryList; + + /** + * An array or comma separated strings of panel identifiers that should be opened + */ + @Input() activeIds: string | string[] = []; + @Input() hasAnimation = false; + + /** + * Whether the other panels should be closed when a panel is opened + */ + @Input() closeOthers: boolean; + + /** + * Whether the closed panels should be hidden without destroying them + */ + @Input() destroyOnHide = true; + + /** + * Accordion's types of panels to be applied globally. + * Bootstrap recognizes the following types: "primary", "secondary", "success", "danger", "warning", "info", "light" + * and "dark + */ + @Input() type: string; + + /** + * A panel change event fired right before the panel toggle happens. See PanelChangeEvent for payload details + */ + @Output() panelChange = new EventEmitter(); + + constructor() { + + } + + /** + * Programmatically toggle a panel with a given id. + */ + toggle(panelId: string, accordionBodyScrollHeight) { + const panel = this.panels.find(p => p.id === panelId); + + if (panel && !panel.disabled) { + let defaultPrevented = false; + if (this.hasAnimation) { + panel.height = panel.height ? 0 : panel.contentHeight; + } + + this.panelChange.emit( + { panelId, nextState: !panel.isOpen, preventDefault: () => { defaultPrevented = true; } }); + + if (!defaultPrevented) { + panel.isOpen = !panel.isOpen; + + if (this.closeOthers) { + this._closeOthers(panelId); + } + this._updateActiveIds(); + } + } + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * after content checked + */ + ngAfterContentChecked() { + // active id updates + if (typeof this.activeIds === 'string') { + this.activeIds = this.activeIds.split(/\s*,\s*/); + } + + // update panels open states + this.panels.forEach(panel => { + panel.isOpen = !panel.disabled && this.activeIds.indexOf(panel.id) > -1; + if (this.hasAnimation) { + const domPanel = document.getElementById(panel.id); + panel.contentHeight = domPanel && domPanel.scrollHeight ? domPanel.scrollHeight : 200; + } + }); + + // closeOthers updates + if (this.activeIds.length > 1 && this.closeOthers) { + this._closeOthers(this.activeIds[0]); + this._updateActiveIds(); + } + } + + /** + * Close all panel except selected + * @param panelId: string + */ + private _closeOthers(panelId: string) { + this.panels.forEach(panel => { + if (panel.id !== panelId) { + panel.isOpen = false; + } + }); + } + + /** + * Update active ids + */ + private _updateActiveIds() { + this.activeIds = this.panels.filter(panel => panel.isOpen && !panel.disabled).map(panel => panel.id); + } +} + diff --git a/src/app/views/partials/content/general/accordion-control/accordion-control.config.ts b/src/app/views/partials/content/general/accordion-control/accordion-control.config.ts new file mode 100644 index 0000000..486916e --- /dev/null +++ b/src/app/views/partials/content/general/accordion-control/accordion-control.config.ts @@ -0,0 +1,13 @@ +// Angular +import {Injectable} from '@angular/core'; + +/** + * Configuration service for the MAccordionControl component. + * You can inject this service, typically in your root component, and customize the values of its properties in + * order to provide default values for all the accordions used in the application. + */ +@Injectable() +export class AccordionControlConfig { + closeOthers = false; + type: string; +} diff --git a/src/app/views/partials/content/general/accordion-control/accordion-control.module.ts b/src/app/views/partials/content/general/accordion-control/accordion-control.module.ts new file mode 100644 index 0000000..fc7be95 --- /dev/null +++ b/src/app/views/partials/content/general/accordion-control/accordion-control.module.ts @@ -0,0 +1,37 @@ +// Angular +import { NgModule, ModuleWithProviders } from '@angular/core'; +import { CommonModule } from '@angular/common'; +// Config +import { AccordionControlConfig } from './accordion-control.config'; + +import { + AccordionControlComponent, + AccordionControlPanelDirective, + AccordionControlPanelTitleDirective, + AccordionControlPanelContentDirective} from './accordion-control.component'; + +export { AccordionControlConfig} from './accordion-control.config'; +export { + AccordionControlComponent, AccordionControlPanelDirective, AccordionControlPanelTitleDirective, + AccordionControlPanelContentDirective, AccordionControlPanelChangeEvent +} from './accordion-control.component'; + +const ACCORDION_CONTROL_DIRECTIVES = [ + AccordionControlComponent, + AccordionControlPanelDirective, + AccordionControlPanelTitleDirective, + AccordionControlPanelContentDirective +]; + +@NgModule({ + imports: [ + CommonModule + ], + exports: ACCORDION_CONTROL_DIRECTIVES, + declarations: ACCORDION_CONTROL_DIRECTIVES +}) +export class AccordionControlModule { + static forRoot(): ModuleWithProviders { + return { ngModule: AccordionControlModule, providers: [AccordionControlConfig] }; + } +} diff --git a/src/app/views/partials/content/general/error/error.component.html b/src/app/views/partials/content/general/error/error.component.html new file mode 100644 index 0000000..a2f8347 --- /dev/null +++ b/src/app/views/partials/content/general/error/error.component.html @@ -0,0 +1,71 @@ +
+ + +
+

{{code}}

+

+
+
+ + +
+
+

{{title}}

+
+ +
+
+ + +
+
+

{{code}}

+
+

+ {{title}} +

+

+ {{subtitle}} +

+

+
+
+ + +
+

+ {{code}} +

+

+ {{title}} +

+

+ {{subtitle}} +

+

+
+
+ + +
+
+

{{title}}

+
+

+ {{subtitle}} +

+

+
+
+ + +
+
+

{{title}}

+
+

+
+
+ +
diff --git a/src/app/views/partials/content/general/error/error.component.scss b/src/app/views/partials/content/general/error/error.component.scss new file mode 100644 index 0000000..d76919b --- /dev/null +++ b/src/app/views/partials/content/general/error/error.component.scss @@ -0,0 +1,10 @@ +:host { + height: 100%; +} + +.kt-error-v403 { + background-position: center; + background-repeat: no-repeat; + background-attachment: fixed; + background-size: cover; +} \ No newline at end of file diff --git a/src/app/views/partials/content/general/error/error.component.ts b/src/app/views/partials/content/general/error/error.component.ts new file mode 100644 index 0000000..1c12f72 --- /dev/null +++ b/src/app/views/partials/content/general/error/error.component.ts @@ -0,0 +1,27 @@ +// Angular +import { Component, HostBinding, Input } from '@angular/core'; + +@Component({ + selector: 'kt-error', + templateUrl: './error.component.html', + styleUrls: ['./error.component.scss'] +}) +export class ErrorComponent { + // Public properties + // type of error template to be used, accepted values; error-v1 | error-v2 | error-v3 | error-v4 | error-v5 | error-v6 + @Input() type = 'error-v1'; + // full background image + @Input() image: string; + // error code, some error types template has it + @Input() code = '404'; + // error title + @Input() title: string; + // error subtitle, some error types template has it + @Input() subtitle: string; + // error descriptions + @Input() desc = 'Oops! Something went wrong!'; + // return back button title + @Input() return = 'Return back'; + + @HostBinding('class') classes = 'kt-grid kt-grid--ver kt-grid--root'; +} diff --git a/src/app/views/partials/content/general/material-preview/material-preview.component.html b/src/app/views/partials/content/general/material-preview/material-preview.component.html new file mode 100644 index 0000000..7d2698c --- /dev/null +++ b/src/app/views/partials/content/general/material-preview/material-preview.component.html @@ -0,0 +1,94 @@ + + + + +
+ +
+
+
+ + +
+ +
+
+ + + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+
+
+ + +
+ +
+ + + +
+
+ + + +
+
+ +
+ + +
diff --git a/src/app/views/partials/content/general/material-preview/material-preview.component.scss b/src/app/views/partials/content/general/material-preview/material-preview.component.scss new file mode 100644 index 0000000..cc06138 --- /dev/null +++ b/src/app/views/partials/content/general/material-preview/material-preview.component.scss @@ -0,0 +1,9 @@ +:host { + .kt-portlet.kt-portlet--ngviewer .kt-portlet__body { + padding: 1.75rem 1.75rem; + } + + .kt-portlet.kt-portlet--ngviewer .kt-portlet__body .kt-portlet__code.kt-portlet__code--show { + margin-bottom: 20px; + } +} diff --git a/src/app/views/partials/content/general/material-preview/material-preview.component.ts b/src/app/views/partials/content/general/material-preview/material-preview.component.ts new file mode 100644 index 0000000..81ef413 --- /dev/null +++ b/src/app/views/partials/content/general/material-preview/material-preview.component.ts @@ -0,0 +1,50 @@ +// Angular +import { Component, Input, OnInit } from '@angular/core'; + +@Component({ + selector: 'kt-material-preview', + templateUrl: './material-preview.component.html', + styleUrls: ['./material-preview.component.scss'], +}) +export class MaterialPreviewComponent implements OnInit { + // Public properties + @Input() viewItem: any; + + /** + * Component constructor + */ + constructor() { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + } + + /** + * Toggle visibility + */ + changeCodeVisibility(): void { + this.viewItem.isCodeVisible = !this.viewItem.isCodeVisible; + } + + /** + * Check examples existing + */ + hasExampleSource(): boolean { + if (!this.viewItem) { + return false; + } + + if (!this.viewItem.cssCode && !this.viewItem.htmlCode && !this.viewItem.scssCode && !this.viewItem.tsCode) { + return false; + } + + return true; + } +} diff --git a/src/app/views/partials/content/general/material-preview/material-preview.module.ts b/src/app/views/partials/content/general/material-preview/material-preview.module.ts new file mode 100644 index 0000000..301e590 --- /dev/null +++ b/src/app/views/partials/content/general/material-preview/material-preview.module.ts @@ -0,0 +1,37 @@ +// Angular +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { MatTabsModule } from '@angular/material/tabs'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { MatCardModule } from '@angular/material/card'; +import { MatIconModule } from '@angular/material/icon'; +import { ClipboardModule } from 'ngx-clipboard'; +// Perfect ScrollBar +import { PerfectScrollbarModule } from 'ngx-perfect-scrollbar'; +import { MaterialPreviewComponent } from './material-preview.component'; +// Core Module +import { CoreModule } from '../../../../../core/core.module'; +import { PortletModule } from '../portlet/portlet.module'; +// Highlight JS +import { HighlightModule } from 'ngx-highlightjs'; + +@NgModule({ + imports: [ + CommonModule, + CoreModule, + HighlightModule, + PerfectScrollbarModule, + PortletModule, + ClipboardModule, + + // angular material modules + MatTabsModule, + MatExpansionModule, + MatCardModule, + MatIconModule, + ], + exports: [MaterialPreviewComponent], + declarations: [MaterialPreviewComponent] +}) +export class MaterialPreviewModule { +} diff --git a/src/app/views/partials/content/general/notice/notice.component.html b/src/app/views/partials/content/general/notice/notice.component.html new file mode 100644 index 0000000..5ce1485 --- /dev/null +++ b/src/app/views/partials/content/general/notice/notice.component.html @@ -0,0 +1,8 @@ + diff --git a/src/app/views/partials/content/general/notice/notice.component.ts b/src/app/views/partials/content/general/notice/notice.component.ts new file mode 100644 index 0000000..a03a142 --- /dev/null +++ b/src/app/views/partials/content/general/notice/notice.component.ts @@ -0,0 +1,31 @@ +// Angular +import { Component, OnInit, Input, ChangeDetectionStrategy } from '@angular/core'; + +@Component({ + selector: 'kt-notice', + templateUrl: './notice.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class NoticeComponent implements OnInit { + // Public properties + @Input() classes: any = ''; + @Input() icon: any; + + /** + * Component constructor + */ + constructor() {} + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + if (this.icon) { + this.classes += ' kt-alert--icon'; + } + } +} diff --git a/src/app/views/partials/content/general/portlet/portlet-body.component.ts b/src/app/views/partials/content/general/portlet/portlet-body.component.ts new file mode 100644 index 0000000..14a935e --- /dev/null +++ b/src/app/views/partials/content/general/portlet/portlet-body.component.ts @@ -0,0 +1,26 @@ +// Angular +import { Component, HostBinding, Input, OnInit } from '@angular/core'; + +@Component({ + selector: 'kt-portlet-body', + template: ` + ` +}) +export class PortletBodyComponent implements OnInit { + // Public properties + @HostBinding('class') classList = 'kt-portlet__body'; + @Input() class: string; + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + if (this.class) { + this.classList += ' ' + this.class; + } + } +} diff --git a/src/app/views/partials/content/general/portlet/portlet-footer.component.ts b/src/app/views/partials/content/general/portlet/portlet-footer.component.ts new file mode 100644 index 0000000..a30f1e9 --- /dev/null +++ b/src/app/views/partials/content/general/portlet/portlet-footer.component.ts @@ -0,0 +1,26 @@ +// Angular +import { Component, HostBinding, Input, OnInit } from '@angular/core'; + +@Component({ + selector: 'kt-portlet-footer', + template: ` + ` +}) +export class PortletFooterComponent implements OnInit { + // Public properties + @HostBinding('class') classList = 'kt-portlet__foot'; + @Input() class: string; + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + if (this.class) { + this.classList += ' ' + this.class; + } + } +} diff --git a/src/app/views/partials/content/general/portlet/portlet-header.component.scss b/src/app/views/partials/content/general/portlet/portlet-header.component.scss new file mode 100644 index 0000000..dada254 --- /dev/null +++ b/src/app/views/partials/content/general/portlet/portlet-header.component.scss @@ -0,0 +1,3 @@ +:host { + z-index: 1; +} diff --git a/src/app/views/partials/content/general/portlet/portlet-header.component.ts b/src/app/views/partials/content/general/portlet/portlet-header.component.ts new file mode 100644 index 0000000..e257a98 --- /dev/null +++ b/src/app/views/partials/content/general/portlet/portlet-header.component.ts @@ -0,0 +1,169 @@ +import { KtDialogService, StickyDirective } from '../../../../../core/_base/layout'; +// Angular +import { + AfterViewInit, + Component, + ElementRef, + HostBinding, + HostListener, + Inject, + Input, + OnDestroy, + OnInit, + PLATFORM_ID, + ViewChild +} from '@angular/core'; +// RXJS +import { Observable, Subscription } from 'rxjs'; + +@Component({ + selector: 'kt-portlet-header', + styleUrls: ['portlet-header.component.scss'], + template: ` +
+ + + + + +

+
+
+ +
` +}) +export class PortletHeaderComponent implements OnInit, AfterViewInit, OnDestroy { + // Public properties + // append html class to the portlet header + @Input() class: string; + // a simple title text + @Input() title: string; + // icon name to be added to the i tag + @Input() icon: string; + // remove title container + @Input() noTitle: boolean; + // enable sticky portlet header + @Input() sticky: boolean; + // enable loading to display + @Input() viewLoading$: Observable; + viewLoading = false; + + @HostBinding('class') classes = 'kt-portlet__head'; + @HostBinding('attr.ktSticky') stickyDirective: StickyDirective; + + @ViewChild('refIcon', {static: true}) refIcon: ElementRef; + hideIcon: boolean; + + @ViewChild('refTools', {static: true}) refTools: ElementRef; + hideTools: boolean; + + private lastScrollTop = 0; + private subscriptions: Subscription[] = []; + private isScrollDown = false; + + constructor(private el: ElementRef, @Inject(PLATFORM_ID) private platformId: string, private ktDialogService: KtDialogService) { + this.stickyDirective = new StickyDirective(this.el, this.platformId); + } + + @HostListener('window:resize', ['$event']) + onResize() { + this.updateStickyPosition(); + } + + @HostListener('window:scroll', ['$event']) + onScroll() { + this.updateStickyPosition(); + const st = window.pageYOffset || document.documentElement.scrollTop; + this.isScrollDown = st > this.lastScrollTop; + this.lastScrollTop = st <= 0 ? 0 : st; + } + + updateStickyPosition() { + if (this.sticky) { + Promise.resolve(null).then(() => { + // get boundary top margin for sticky header + const headerElement = document.querySelector('.kt-header') as HTMLElement; + const subheaderElement = document.querySelector('.kt-subheader') as HTMLElement; + const headerMobileElement = document.querySelector('.kt-header-mobile') as HTMLElement; + + let height = 0; + + if (headerElement != null) { + // mobile header + if (window.getComputedStyle(headerElement).height === '0px') { + height += headerMobileElement.offsetHeight; + } else { + // desktop header + if (document.body.classList.contains('kt-header--minimize-topbar')) { + // hardcoded minimized header height + height = 60; + } else { + // normal fixed header + if (document.body.classList.contains('kt-header--fixed')) { + height += headerElement.offsetHeight; + } + if (document.body.classList.contains('kt-subheader--fixed')) { + height += subheaderElement.offsetHeight; + } + } + } + } + + this.stickyDirective.marginTop = height; + }); + } + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + if (this.sticky) { + this.stickyDirective.ngOnInit(); + } + } + + ngAfterViewInit(): void { + // append custom class + this.classes += this.class ? ' ' + this.class : ''; + + // hide icon's parent node if no icon provided + this.hideIcon = this.refIcon.nativeElement.children.length === 0; + + // hide tools' parent node if no tools template is provided + this.hideTools = this.refTools.nativeElement.children.length === 0; + + if (this.sticky) { + this.updateStickyPosition(); + this.stickyDirective.ngAfterViewInit(); + } + + // initialize loading dialog + if (this.viewLoading$) { + const loadingSubscription = this.viewLoading$.subscribe(res => this.toggleLoading(res)); + this.subscriptions.push(loadingSubscription); + } + } + + toggleLoading(_incomingValue: boolean) { + this.viewLoading = _incomingValue; + if (_incomingValue && !this.ktDialogService.checkIsShown()) { + this.ktDialogService.show(); + } + + if (!this.viewLoading && this.ktDialogService.checkIsShown()) { + this.ktDialogService.hide(); + } + } + + ngOnDestroy(): void { + this.subscriptions.forEach(sb => sb.unsubscribe()); + if (this.sticky) { + this.stickyDirective.ngOnDestroy(); + } + } +} diff --git a/src/app/views/partials/content/general/portlet/portlet.component.html b/src/app/views/partials/content/general/portlet/portlet.component.html new file mode 100644 index 0000000..b24202d --- /dev/null +++ b/src/app/views/partials/content/general/portlet/portlet.component.html @@ -0,0 +1,3 @@ +
+ +
diff --git a/src/app/views/partials/content/general/portlet/portlet.component.ts b/src/app/views/partials/content/general/portlet/portlet.component.ts new file mode 100644 index 0000000..d1a7a85 --- /dev/null +++ b/src/app/views/partials/content/general/portlet/portlet.component.ts @@ -0,0 +1,68 @@ +// Angular +import { AfterViewInit, Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core'; +// Loading bar +import { LoadingBarService } from '@ngx-loading-bar/core'; +// RxJS +import { Observable } from 'rxjs'; +// Portlet +import { PortletBodyComponent } from './portlet-body.component'; +import { PortletHeaderComponent } from './portlet-header.component'; +import { PortletFooterComponent } from './portlet-footer.component'; +// Layout +import { LayoutConfigService } from '../../../../../core/_base/layout'; + +export interface PortletOptions { + test?: any; +} + +@Component({ + selector: 'kt-portlet', + templateUrl: './portlet.component.html', + exportAs: 'ktPortlet' +}) +export class PortletComponent implements OnInit, AfterViewInit { + // Public properties + @Input() loading$: Observable; + // portlet extra options + @Input() options: PortletOptions; + // portlet root classes + @Input() class: string; + + @ViewChild('portlet', {static: true}) portlet: ElementRef; + + // portlet header component template + @ViewChild(PortletHeaderComponent, {static: true}) header: PortletHeaderComponent; + // portlet body component template + @ViewChild(PortletBodyComponent, {static: true}) body: PortletBodyComponent; + // portlet footer component template + @ViewChild(PortletFooterComponent, {static: true}) footer: PortletFooterComponent; + + /** + * Component constructor + * + * @param el: ElementRef + * @param loader: LoadingBarService + * @param layoutConfigService: LayoutConfigService + */ + constructor(private el: ElementRef, public loader: LoadingBarService, + private layoutConfigService: LayoutConfigService) { + this.loader.complete(); + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + } + + /** + * After view init + */ + ngAfterViewInit() { + } + +} diff --git a/src/app/views/partials/content/general/portlet/portlet.module.ts b/src/app/views/partials/content/general/portlet/portlet.module.ts new file mode 100644 index 0000000..2692146 --- /dev/null +++ b/src/app/views/partials/content/general/portlet/portlet.module.ts @@ -0,0 +1,35 @@ +// Angular +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { MatProgressBarModule, MatProgressSpinnerModule } from '@angular/material'; + +// Module +import { CoreModule } from '../../../../../core/core.module'; +// Portlet +import { PortletComponent } from './portlet.component'; +import { PortletHeaderComponent } from './portlet-header.component'; +import { PortletBodyComponent } from './portlet-body.component'; +import { PortletFooterComponent } from './portlet-footer.component'; + +@NgModule({ + imports: [ + CommonModule, + CoreModule, + MatProgressSpinnerModule, + MatProgressBarModule + ], + declarations: [ + PortletComponent, + PortletHeaderComponent, + PortletBodyComponent, + PortletFooterComponent, + ], + exports: [ + PortletComponent, + PortletHeaderComponent, + PortletBodyComponent, + PortletFooterComponent, + ] +}) +export class PortletModule { +} diff --git a/src/app/views/partials/content/widgets/general/data-table/data-table.component.html b/src/app/views/partials/content/widgets/general/data-table/data-table.component.html new file mode 100644 index 0000000..90eda40 --- /dev/null +++ b/src/app/views/partials/content/widgets/general/data-table/data-table.component.html @@ -0,0 +1,82 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Id{{product.id}}Manufacture{{product.cManufacture}}Model{{product.cModel}}Model Year{{product.cModelYear}}Mileage{{product.cMileage}}Color{{product.cColor}}Price${{product.cPrice}}Status + {{ getItemStatusString(product.cStatus) }} + Condition +   + {{ getItemConditionString(product.cCondition) }} + + Actions + + + +
+ +
No records found
+
+ +
+ + +
+ diff --git a/src/app/views/partials/content/widgets/general/data-table/data-table.component.scss b/src/app/views/partials/content/widgets/general/data-table/data-table.component.scss new file mode 100644 index 0000000..5a4c485 --- /dev/null +++ b/src/app/views/partials/content/widgets/general/data-table/data-table.component.scss @@ -0,0 +1,10 @@ +:host { + ::ng-deep { + .mat-table-sticky { + z-index: 0 !important; + } + + .mat-header-cell { z-index: 2 !important;} + + } +} diff --git a/src/app/views/partials/content/widgets/general/data-table/data-table.component.ts b/src/app/views/partials/content/widgets/general/data-table/data-table.component.ts new file mode 100644 index 0000000..31dcaff --- /dev/null +++ b/src/app/views/partials/content/widgets/general/data-table/data-table.component.ts @@ -0,0 +1,141 @@ +// Angular +import { Component, OnInit, ViewChild } from '@angular/core'; +import { SelectionModel } from '@angular/cdk/collections'; +import { MatPaginator, MatSort } from '@angular/material'; +// RXJS +import { tap } from 'rxjs/operators'; +import { merge } from 'rxjs'; +// Crud +import { QueryParamsModel } from '../../../../../../core/_base/crud'; +// Layout +import { DataTableItemModel, DataTableService } from '../../../../../../core/_base/layout'; +import { DataTableDataSource } from './data-table.data-source'; + +@Component({ + selector: 'kt-data-table', + templateUrl: './data-table.component.html', + styleUrls: ['./data-table.component.scss'] +}) +export class DataTableComponent implements OnInit { + // Public properties + dataSource: DataTableDataSource; + displayedColumns = ['id', 'cManufacture', 'cModel', 'cMileage', 'cColor', 'cPrice', 'cCondition', 'cStatus', 'actions' ]; + @ViewChild(MatPaginator, {static: true}) paginator: MatPaginator; + @ViewChild(MatSort, {static: true}) sort: MatSort; + selection = new SelectionModel(true, []); + + /** + * Component constructor + * + * @param dataTableService: DataTableService + */ + constructor(private dataTableService: DataTableService) {} + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + // If the user changes the sort order, reset back to the first page. + this.sort.sortChange.subscribe(() => (this.paginator.pageIndex = 0)); + + /* Data load will be triggered in two cases: + - when a pagination event occurs => this.paginator.page + - when a sort event occurs => this.sort.sortChange + **/ + merge(this.sort.sortChange, this.paginator.page) + .pipe( + tap(() => { + this.loadItems(); + }) + ) + .subscribe(); + + // Init DataSource + this.dataSource = new DataTableDataSource(this.dataTableService); + // First load + this.loadItems(true); + } + + /** + * Load items + * + * @param firstLoad: boolean + */ + loadItems(firstLoad: boolean = false) { + const queryParams = new QueryParamsModel( + {}, + this.sort.direction, + this.sort.active, + this.paginator.pageIndex, + firstLoad ? 6 : this.paginator.pageSize + ); + this.dataSource.loadItems(queryParams); + this.selection.clear(); + } + + /* UI */ + + /** + * Returns item status + * + * @param status: number + */ + getItemStatusString(status: number = 0): string { + switch (status) { + case 0: + return 'Selling'; + case 1: + return 'Sold'; + } + return ''; + } + + /** + * Returens item CSS Class Name by status + * + * @param status: number + */ + getItemCssClassByStatus(status: number = 0): string { + switch (status) { + case 0: + return 'success'; + case 1: + return 'info'; + } + return ''; + } + + /** + * Returns item condition + * + * @param condition: number + */ + getItemConditionString(condition: number = 0): string { + switch (condition) { + case 0: + return 'New'; + case 1: + return 'Used'; + } + return ''; + } + + /** + * Returns CSS Class name by condition + * + * @param condition: number + */ + getItemCssClassByCondition(condition: number = 0): string { + switch (condition) { + case 0: + return 'success'; + case 1: + return 'info'; + } + return ''; + } +} diff --git a/src/app/views/partials/content/widgets/general/data-table/data-table.data-source.ts b/src/app/views/partials/content/widgets/general/data-table/data-table.data-source.ts new file mode 100644 index 0000000..7b56ebf --- /dev/null +++ b/src/app/views/partials/content/widgets/general/data-table/data-table.data-source.ts @@ -0,0 +1,102 @@ +// Angular +import { CollectionViewer, DataSource } from '@angular/cdk/collections'; +// RxJS +import { Observable, BehaviorSubject, of} from 'rxjs'; +import { catchError, finalize, tap } from 'rxjs/operators'; +// CRUD +import { QueryParamsModel, QueryResultsModel, HttpExtenstionsModel } from '../../../../../../core/_base/crud'; +import { DataTableService, DataTableItemModel } from '../../../../../../core/_base/layout'; + +// Why not use MatTableDataSource? +/* In this example, we will not be using the built-in MatTableDataSource because its designed for filtering, + sorting and pagination of a client - side data array. + Read the article: 'https://blog.angular-university.io/angular-material-data-table/' +**/ +export class DataTableDataSource implements DataSource { + // Public properties + entitySubject = new BehaviorSubject([]); + hasItems = false; // Need to show message: 'No records found + + // Loading | Progress bar + loadingSubject = new BehaviorSubject(false); + loading$: Observable; + + // Paginator | Paginators count + paginatorTotalSubject = new BehaviorSubject(0); + paginatorTotal$: Observable; + + /** + * Data-Source Constructor + * + * @param dataTableService: DataTableService + */ + constructor(private dataTableService: DataTableService) { + this.loading$ = this.loadingSubject.asObservable(); + this.paginatorTotal$ = this.paginatorTotalSubject.asObservable(); + this.paginatorTotal$.subscribe(res => this.hasItems = res > 0); + } + + /** + * Connect data-source + * + * @param collectionViewer: CollectionViewer + */ + connect(collectionViewer: CollectionViewer): Observable { + // Connecting data source + return this.entitySubject.asObservable(); + } + + /** + * Disconnect data-source + * + * @param collectionViewer: CollectionViewer + */ + disconnect(collectionViewer: CollectionViewer): void { + // Disonnecting data source + this.entitySubject.complete(); + this.loadingSubject.complete(); + this.paginatorTotalSubject.complete(); + } + + baseFilter(_entities: any[], _queryParams: QueryParamsModel): QueryResultsModel { + let entitiesResult = _entities; + + // Sorting + // start + if (_queryParams.sortField) { + entitiesResult = this.sortArray(_entities, _queryParams.sortField, _queryParams.sortOrder); + } + // end + + // Paginator + // start + const totalCount = entitiesResult.length; + const initialPos = _queryParams.pageNumber * _queryParams.pageSize; + entitiesResult = entitiesResult.slice(initialPos, initialPos + _queryParams.pageSize); + // end + + const queryResults = new QueryResultsModel(); + queryResults.items = entitiesResult; + queryResults.totalCount = totalCount; + return queryResults; + } + + loadItems(queryParams: QueryParamsModel) { + this.loadingSubject.next(true); + this.dataTableService.getAllItems().pipe( + tap(res => { + const result = this.baseFilter(res, queryParams); + this.entitySubject.next(result.items); + this.paginatorTotalSubject.next(result.totalCount); + + }), + catchError(err => of(new QueryResultsModel([], err))), + finalize(() => this.loadingSubject.next(false)) + ).subscribe(); + } + + sortArray(_incomingArray: any[], _sortField: string = '', _sortOrder: string = 'asc'): any[] { + const httpExtenstion = new HttpExtenstionsModel(); + return httpExtenstion.sortArray(_incomingArray, _sortField, _sortOrder); + } +} diff --git a/src/app/views/partials/content/widgets/timeline2/timeline2.component.html b/src/app/views/partials/content/widgets/timeline2/timeline2.component.html new file mode 100644 index 0000000..660f7ea --- /dev/null +++ b/src/app/views/partials/content/widgets/timeline2/timeline2.component.html @@ -0,0 +1,19 @@ +
+
+ + + +
+
+ + +
+ {{item.time}} +
+ +
+
+ +
+
+
diff --git a/src/app/views/partials/content/widgets/timeline2/timeline2.component.scss b/src/app/views/partials/content/widgets/timeline2/timeline2.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/partials/content/widgets/timeline2/timeline2.component.ts b/src/app/views/partials/content/widgets/timeline2/timeline2.component.ts new file mode 100644 index 0000000..83590f7 --- /dev/null +++ b/src/app/views/partials/content/widgets/timeline2/timeline2.component.ts @@ -0,0 +1,71 @@ +// Angular +import { Component, Input, OnInit } from '@angular/core'; + +export interface Timeline2Data { + time: string; + text: string; + icon?: string; + attachment?: string; +} + +@Component({ + selector: 'kt-timeline2', + templateUrl: './timeline2.component.html', + styleUrls: ['./timeline2.component.scss'] +}) +export class Timeline2Component implements OnInit { + // Public properties + @Input() data: Timeline2Data[]; + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + if (!this.data) { + this.data = [ + { + time: '10:00', + icon: 'fa fa-genderless kt-font-danger', + text: 'Lorem ipsum dolor sit amit,consectetur eiusmdd tempor\n' + + 'incididunt ut labore et dolore magna', + }, + { + time: '12:45', + icon: 'fa fa-genderless kt-font-success', + text: 'AEOL Meeting With', + attachment: '\n' + + '' + + '' + + '' + + '' + }, + { + time: '14:00', + icon: 'fa fa-genderless kt-font-brand', + text: 'Make Deposit USD 700 To ESL.', + }, + { + time: '17:00', + icon: 'fa fa-genderless kt-font-info', + text: 'Placed a new order in SIGNATURE MOBILE marketplace.', + }, + { + time: '16:00', + icon: 'fa fa-genderless kt-font-brand', + text: 'Lorem ipsum dolor sit amit,consectetur eiusmdd tempor
' + + 'incididunt ut labore et dolore magna elit enim at minim
' + + 'veniam quis nostrud', + }, + { + time: '17:00', + icon: 'fa fa-genderless kt-font-danger', + text: 'Received a new feedback on FinancePro App product.', + }, + ]; + } + } +} diff --git a/src/app/views/partials/content/widgets/widget.module.ts b/src/app/views/partials/content/widgets/widget.module.ts new file mode 100644 index 0000000..5e7a793 --- /dev/null +++ b/src/app/views/partials/content/widgets/widget.module.ts @@ -0,0 +1,53 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { MatButtonModule, MatIconModule, MatPaginatorModule, MatProgressSpinnerModule, MatSortModule, MatTableModule, } from '@angular/material'; +import { CoreModule } from '../../../../core/core.module'; +import { PerfectScrollbarModule } from 'ngx-perfect-scrollbar'; +// Datatable +import { DataTableComponent } from './general/data-table/data-table.component'; +// General widgets +import { Widget1Component } from './widget1/widget1.component'; +import { Widget4Component } from './widget4/widget4.component'; +import { Widget5Component } from './widget5/widget5.component'; +import { Widget12Component } from './widget12/widget12.component'; +import { Widget14Component } from './widget14/widget14.component'; +import { Widget26Component } from './widget26/widget26.component'; +import { Timeline2Component } from './timeline2/timeline2.component'; + +@NgModule({ + declarations: [ + DataTableComponent, + // Widgets + Widget1Component, + Widget4Component, + Widget5Component, + Widget12Component, + Widget14Component, + Widget26Component, + Timeline2Component, + ], + exports: [ + DataTableComponent, + // Widgets + Widget1Component, + Widget4Component, + Widget5Component, + Widget12Component, + Widget14Component, + Widget26Component, + Timeline2Component, + ], + imports: [ + CommonModule, + PerfectScrollbarModule, + MatTableModule, + CoreModule, + MatIconModule, + MatButtonModule, + MatProgressSpinnerModule, + MatPaginatorModule, + MatSortModule, + ] +}) +export class WidgetModule { +} diff --git a/src/app/views/partials/content/widgets/widget1/widget1.component.html b/src/app/views/partials/content/widgets/widget1/widget1.component.html new file mode 100644 index 0000000..e4e18ea --- /dev/null +++ b/src/app/views/partials/content/widgets/widget1/widget1.component.html @@ -0,0 +1,15 @@ +
+ + + +
+ + +
+
+

{{item.title}}

+ {{item.desc}} +
+ {{item.value}} +
+
diff --git a/src/app/views/partials/content/widgets/widget1/widget1.component.scss b/src/app/views/partials/content/widgets/widget1/widget1.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/partials/content/widgets/widget1/widget1.component.ts b/src/app/views/partials/content/widgets/widget1/widget1.component.ts new file mode 100644 index 0000000..e4a4f54 --- /dev/null +++ b/src/app/views/partials/content/widgets/widget1/widget1.component.ts @@ -0,0 +1,52 @@ +// Angular +import { Component, Input, OnInit } from '@angular/core'; +// Lodash +import { shuffle } from 'lodash'; + +export interface Widget1Data { + title: string; + desc: string; + value: string; + valueClass?: string; +} + +@Component({ + selector: 'kt-widget1', + templateUrl: './widget1.component.html', + styleUrls: ['./widget1.component.scss'] +}) +export class Widget1Component implements OnInit { + // Public properties + @Input() data: Widget1Data[]; + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + if (!this.data) { + this.data = shuffle([ + { + title: 'Member Profit', + desc: 'Awerage Weekly Profit', + value: '+$17,800', + valueClass: 'kt-font-brand' + }, { + title: 'Orders', + desc: 'Weekly Customer Orders', + value: '+$1,800', + valueClass: 'kt-font-danger' + }, { + title: 'Issue Reports', + desc: 'System bugs and issues', + value: '-27,49%', + valueClass: 'kt-font-success' + } + ]); + } + } + +} diff --git a/src/app/views/partials/content/widgets/widget12/widget12.component.html b/src/app/views/partials/content/widgets/widget12/widget12.component.html new file mode 100644 index 0000000..3ba8728 --- /dev/null +++ b/src/app/views/partials/content/widgets/widget12/widget12.component.html @@ -0,0 +1,32 @@ +
+
+
+
+ Annual Taxes EMS + $400,000 +
+
+ Finance Review Date + July 24,2019 +
+
+
+
+ Avarage Revenue + $60M +
+
+ Revenue Margin +
+
+
+
+ 40% +
+
+
+
+
+ +
+
diff --git a/src/app/views/partials/content/widgets/widget12/widget12.component.scss b/src/app/views/partials/content/widgets/widget12/widget12.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/partials/content/widgets/widget12/widget12.component.ts b/src/app/views/partials/content/widgets/widget12/widget12.component.ts new file mode 100644 index 0000000..b326906 --- /dev/null +++ b/src/app/views/partials/content/widgets/widget12/widget12.component.ts @@ -0,0 +1,167 @@ +// Angular +import { Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core'; +// Layout config +import { LayoutConfigService } from '../../../../../core/_base/layout'; + +/** + * Sample components with sample data + */ +@Component({ + selector: 'kt-widget12', + templateUrl: './widget12.component.html', + styleUrls: ['./widget12.component.scss'] +}) +export class Widget12Component implements OnInit { + + // Public properties + @Input() data: { labels: string[], datasets: any[] }; + @Input() type = 'line'; + @ViewChild('chart', {static: true}) chart: ElementRef; + + /** + * Component constructor + * @param layoutConfigService + */ + constructor(private layoutConfigService: LayoutConfigService) { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit(): void { + if (!this.data) { + const color = Chart.helpers.color; + this.data = { + labels: ['1 Jan', '2 Jan', '3 Jan', '4 Jan', '5 Jan', '6 Jan', '7 Jan'], + datasets: [ + { + fill: true, + // borderWidth: 0, + backgroundColor: color(this.layoutConfigService.getConfig('colors.state.brand')).alpha(0.6).rgbString(), + borderColor: color(this.layoutConfigService.getConfig('colors.state.brand')).alpha(0).rgbString(), + + pointHoverRadius: 4, + pointHoverBorderWidth: 12, + pointBackgroundColor: Chart.helpers.color('#000000').alpha(0).rgbString(), + pointBorderColor: Chart.helpers.color('#000000').alpha(0).rgbString(), + pointHoverBackgroundColor: this.layoutConfigService.getConfig('colors.state.brand'), + pointHoverBorderColor: Chart.helpers.color('#000000').alpha(0.1).rgbString(), + + data: [20, 40, 50, 25, 35, 60, 30] + }, + { + fill: true, + // borderWidth: 0, + backgroundColor: color(this.layoutConfigService.getConfig('colors.state.brand')).alpha(0.2).rgbString(), + borderColor: color(this.layoutConfigService.getConfig('colors.state.brand')).alpha(0).rgbString(), + + pointHoverRadius: 4, + pointHoverBorderWidth: 12, + pointBackgroundColor: Chart.helpers.color('#000000').alpha(0).rgbString(), + pointBorderColor: Chart.helpers.color('#000000').alpha(0).rgbString(), + pointHoverBackgroundColor: this.layoutConfigService.getConfig('colors.state.brand'), + pointHoverBorderColor: Chart.helpers.color('#000000').alpha(0.1).rgbString(), + + data: [25, 45, 55, 30, 40, 65, 35] + } + ] + }; + } + this.initChart(); + } + + private initChart() { + // For more information about the chartjs, visit this link + // https://www.chartjs.org/docs/latest/getting-started/usage.html + + const chart = new Chart(this.chart.nativeElement, { + type: this.type, + data: this.data, + options: { + responsive: true, + maintainAspectRatio: false, + legend: false, + scales: { + xAxes: [{ + categoryPercentage: 0.35, + barPercentage: 0.70, + display: true, + scaleLabel: { + display: false, + labelString: 'Month' + }, + gridLines: false, + ticks: { + display: true, + beginAtZero: true, + fontColor: this.layoutConfigService.getConfig('colors.base.shape.3'), + fontSize: 13, + padding: 10 + } + }], + yAxes: [{ + categoryPercentage: 0.35, + barPercentage: 0.70, + display: true, + scaleLabel: { + display: false, + labelString: 'Value' + }, + gridLines: { + color: this.layoutConfigService.getConfig('colors.base.shape.2'), + drawBorder: false, + offsetGridLines: false, + drawTicks: false, + borderDash: [3, 4], + zeroLineWidth: 1, + zeroLineColor: this.layoutConfigService.getConfig('colors.base.shape.2'), + zeroLineBorderDash: [3, 4] + }, + ticks: { + max: 70, + stepSize: 10, + display: true, + beginAtZero: true, + fontColor: this.layoutConfigService.getConfig('colors.base.shape.3'), + fontSize: 13, + padding: 10 + } + }] + }, + title: { + display: false + }, + hover: { + mode: 'index' + }, + tooltips: { + enabled: true, + intersect: false, + mode: 'nearest', + bodySpacing: 5, + yPadding: 10, + xPadding: 10, + caretPadding: 0, + displayColors: false, + backgroundColor: this.layoutConfigService.getConfig('colors.state.brand'), + titleFontColor: '#ffffff', + cornerRadius: 4, + footerSpacing: 0, + titleSpacing: 0 + }, + layout: { + padding: { + left: 0, + right: 0, + top: 5, + bottom: 5 + } + } + } + }); + } +} diff --git a/src/app/views/partials/content/widgets/widget14/widget14.component.html b/src/app/views/partials/content/widgets/widget14/widget14.component.html new file mode 100644 index 0000000..29f6fc5 --- /dev/null +++ b/src/app/views/partials/content/widgets/widget14/widget14.component.html @@ -0,0 +1,9 @@ +
+
+

{{title}}

+ {{desc}} +
+
+ +
+
diff --git a/src/app/views/partials/content/widgets/widget14/widget14.component.scss b/src/app/views/partials/content/widgets/widget14/widget14.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/partials/content/widgets/widget14/widget14.component.ts b/src/app/views/partials/content/widgets/widget14/widget14.component.ts new file mode 100644 index 0000000..cd2b186 --- /dev/null +++ b/src/app/views/partials/content/widgets/widget14/widget14.component.ts @@ -0,0 +1,108 @@ +// Angular +import { Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core'; +// Layout +import { LayoutConfigService } from '../../../../../core/_base/layout'; +// Charts +import { Chart } from 'chart.js/dist/Chart.min.js'; + +@Component({ + selector: 'kt-widget14', + templateUrl: './widget14.component.html', + styleUrls: ['./widget14.component.scss'], +}) +export class Widget14Component implements OnInit { + // Public properties + @Input() title: string; + @Input() desc: string; + @Input() data: { labels: string[]; datasets: any[] }; + @ViewChild('chart', {static: true}) chart: ElementRef; + + /** + * Component constructor + * + * @param layoutConfigService: LayoutConfigService + */ + constructor(private layoutConfigService: LayoutConfigService) { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + if (!this.data) { + this.data = { + labels: ['Label 1', 'Label 2', 'Label 3', 'Label 4', 'Label 5', 'Label 6', 'Label 7', 'Label 8', 'Label 9', 'Label 10', 'Label 11', 'Label 12', 'Label 13', 'Label 14', 'Label 15', 'Label 16'], + datasets: [ + { + // label: 'dataset 1', + backgroundColor: this.layoutConfigService.getConfig('colors.state.success'), + data: [ + 15, 20, 25, 30, 25, 20, 15, 20, 25, 30, 25, 20, 15, 10, 15, 20 + ] + }, { + // label: 'dataset 2', + backgroundColor: '#f3f3fb', + data: [ + 15, 20, 25, 30, 25, 20, 15, 20, 25, 30, 25, 20, 15, 10, 15, 20 + ] + } + ] + }; + } + + this.initChartJS(); + } + + /** Init chart */ + initChartJS() { + // For more information about the chartjs, visit this link + // https://www.chartjs.org/docs/latest/getting-started/usage.html + + const chart = new Chart(this.chart.nativeElement, { + type: 'bar', + data: this.data, + options: { + title: { + display: false, + }, + tooltips: { + intersect: false, + mode: 'nearest', + xPadding: 10, + yPadding: 10, + caretPadding: 10 + }, + legend: { + display: false + }, + responsive: true, + maintainAspectRatio: false, + barRadius: 4, + scales: { + xAxes: [{ + display: false, + gridLines: false, + stacked: true + }], + yAxes: [{ + display: false, + stacked: true, + gridLines: false + }] + }, + layout: { + padding: { + left: 0, + right: 0, + top: 0, + bottom: 0 + } + } + } + }); + } +} diff --git a/src/app/views/partials/content/widgets/widget26/widget26.component.html b/src/app/views/partials/content/widgets/widget26/widget26.component.html new file mode 100644 index 0000000..2de36cb --- /dev/null +++ b/src/app/views/partials/content/widgets/widget26/widget26.component.html @@ -0,0 +1,9 @@ +
+
+ {{value}} + {{desc}} +
+
+ +
+
diff --git a/src/app/views/partials/content/widgets/widget26/widget26.component.scss b/src/app/views/partials/content/widgets/widget26/widget26.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/partials/content/widgets/widget26/widget26.component.ts b/src/app/views/partials/content/widgets/widget26/widget26.component.ts new file mode 100644 index 0000000..aa98bcd --- /dev/null +++ b/src/app/views/partials/content/widgets/widget26/widget26.component.ts @@ -0,0 +1,21 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { SparklineChartOptions } from '../../../../../core/_base/layout'; + +@Component({ + selector: 'kt-widget26', + templateUrl: './widget26.component.html', + styleUrls: ['./widget26.component.scss'] +}) +export class Widget26Component implements OnInit { + + @Input() value: string | number; + @Input() desc: string; + @Input() options: SparklineChartOptions; + + constructor() { + } + + ngOnInit() { + } + +} diff --git a/src/app/views/partials/content/widgets/widget4/widget4.component.html b/src/app/views/partials/content/widgets/widget4/widget4.component.html new file mode 100644 index 0000000..6698551 --- /dev/null +++ b/src/app/views/partials/content/widgets/widget4/widget4.component.html @@ -0,0 +1,26 @@ +
+ + + +
+ + +
+
+ +
+ + + + + {{item.title}} + +
+ {{item.username}} + {{item.title}} +

{{item.desc}}

+
+ + +
+
diff --git a/src/app/views/partials/content/widgets/widget4/widget4.component.scss b/src/app/views/partials/content/widgets/widget4/widget4.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/partials/content/widgets/widget4/widget4.component.ts b/src/app/views/partials/content/widgets/widget4/widget4.component.ts new file mode 100644 index 0000000..fc0ffec --- /dev/null +++ b/src/app/views/partials/content/widgets/widget4/widget4.component.ts @@ -0,0 +1,75 @@ +// Angular +import { Component, ContentChild, Input, OnInit, TemplateRef } from '@angular/core'; +// Lodash +import { shuffle } from 'lodash'; +// Layout +import { LayoutConfigService } from '../../../../../core/_base/layout'; + +export interface Widget4Data { + icon?: string; + pic?: string; + title?: string; + username?: string; + desc?: string; + url?: string; +} + +@Component({ + selector: 'kt-widget4', + templateUrl: './widget4.component.html', + styleUrls: ['./widget4.component.scss'] +}) +export class Widget4Component implements OnInit { + // Public properties + @Input() data: Widget4Data[]; + + @ContentChild('actionTemplate', {static: true}) actionTemplate: TemplateRef; + + /** + * Component constructor + * + * @param layoutConfigService: LayoutConfigService + */ + constructor(private layoutConfigService: LayoutConfigService) { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + // dummy data + if (!this.data) { + this.data = shuffle([ + { + pic: './assets/media/files/doc.svg', + title: 'Metronic Documentation', + url: 'https://keenthemes.com.my/metronic', + }, { + pic: './assets/media/files/jpg.svg', + title: 'Project Launch Evgent', + url: 'https://keenthemes.com.my/metronic', + }, { + pic: './assets/media/files/pdf.svg', + title: 'Full Developer Manual For 4.7', + url: 'https://keenthemes.com.my/metronic', + }, { + pic: './assets/media/files/javascript.svg', + title: 'Make JS Development', + url: 'https://keenthemes.com.my/metronic', + }, { + pic: './assets/media/files/zip.svg', + title: 'Download Ziped version OF 5.0', + url: 'https://keenthemes.com.my/metronic', + }, { + pic: './assets/media/files/pdf.svg', + title: 'Finance Report 2016/2017', + url: 'https://keenthemes.com.my/metronic', + }, + ]); + } + } +} diff --git a/src/app/views/partials/content/widgets/widget5/widget5.component.html b/src/app/views/partials/content/widgets/widget5/widget5.component.html new file mode 100644 index 0000000..c0648d1 --- /dev/null +++ b/src/app/views/partials/content/widgets/widget5/widget5.component.html @@ -0,0 +1,22 @@ +
+ + + +
+ + +
+
+
+ +
+
+ {{item.title}} +

{{item.desc}}

+
+
+
+ +
+
+
diff --git a/src/app/views/partials/content/widgets/widget5/widget5.component.scss b/src/app/views/partials/content/widgets/widget5/widget5.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/partials/content/widgets/widget5/widget5.component.ts b/src/app/views/partials/content/widgets/widget5/widget5.component.ts new file mode 100644 index 0000000..b3a5f20 --- /dev/null +++ b/src/app/views/partials/content/widgets/widget5/widget5.component.ts @@ -0,0 +1,82 @@ +// Angular +import { Component, Input, OnInit } from '@angular/core'; +// Lodash +import { shuffle } from 'lodash'; + +export interface Widget5Data { + pic?: string; + title: string; + desc: string; + url?: string; + info?: string; + largeInfo?: string; +} + +@Component({ + selector: 'kt-widget5', + templateUrl: './widget5.component.html', + styleUrls: ['./widget5.component.scss'] +}) +export class Widget5Component implements OnInit { + // Public properties + @Input() data: Widget5Data[]; + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + if (!this.data) { + this.data = shuffle([ + { + pic: './assets/media/products/product6.jpg', + title: 'Great Logo Designn', + desc: 'Metronic admin themes.', + info: 'Author:Keenthemes' + + 'Released:23.08.17', + largeInfo: '
\n' + + ' 19,200\n' + + ' sales\n' + + '
\n' + + '
\n' + + ' 1046\n' + + ' votes\n' + + '
' + }, + { + pic: './assets/media/products/product10.jpg', + title: 'Branding Mockup', + desc: 'Metronic bootstrap themes.', + info: 'Author:Fly themes' + + 'Released:23.08.17', + largeInfo: '
\n' + + ' 24,583\n' + + ' sales\n' + + '
\n' + + '
\n' + + ' 3809\n' + + ' votes\n' + + '
' + }, + { + pic: './assets/media/products/product11.jpg', + title: 'Awesome Mobile App', + desc: 'Metronic admin themes. Lorem Ipsum Amet.', + info: 'Author:Fly themes' + + 'Released:23.08.17', + largeInfo: '
\n' + + ' 210,054\n' + + ' sales\n' + + '
\n' + + '
\n' + + ' 1103\n' + + ' votes\n' + + '
' + }, + ]); + } + } +} diff --git a/src/app/views/partials/layout/context-menu/context-menu.component.html b/src/app/views/partials/layout/context-menu/context-menu.component.html new file mode 100644 index 0000000..9decbc5 --- /dev/null +++ b/src/app/views/partials/layout/context-menu/context-menu.component.html @@ -0,0 +1,39 @@ + diff --git a/src/app/views/partials/layout/context-menu/context-menu.component.scss b/src/app/views/partials/layout/context-menu/context-menu.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/partials/layout/context-menu/context-menu.component.ts b/src/app/views/partials/layout/context-menu/context-menu.component.ts new file mode 100644 index 0000000..aea0c00 --- /dev/null +++ b/src/app/views/partials/layout/context-menu/context-menu.component.ts @@ -0,0 +1,13 @@ +// Angular +import { Component } from '@angular/core'; + +/** + * Sample context menu dropdown + */ +@Component({ + selector: 'kt-context-menu', + templateUrl: './context-menu.component.html', + styleUrls: ['./context-menu.component.scss'] +}) +export class ContextMenuComponent { +} diff --git a/src/app/views/partials/layout/context-menu2/context-menu2.component.html b/src/app/views/partials/layout/context-menu2/context-menu2.component.html new file mode 100644 index 0000000..0da8046 --- /dev/null +++ b/src/app/views/partials/layout/context-menu2/context-menu2.component.html @@ -0,0 +1,42 @@ + diff --git a/src/app/views/partials/layout/context-menu2/context-menu2.component.scss b/src/app/views/partials/layout/context-menu2/context-menu2.component.scss new file mode 100644 index 0000000..996b196 --- /dev/null +++ b/src/app/views/partials/layout/context-menu2/context-menu2.component.scss @@ -0,0 +1,6 @@ +:host { + // enable ng-boostrap dropdowm arrow + [ngbdropdowntoggle]::after { + display: inline-block !important; + } +} diff --git a/src/app/views/partials/layout/context-menu2/context-menu2.component.ts b/src/app/views/partials/layout/context-menu2/context-menu2.component.ts new file mode 100644 index 0000000..a37d480 --- /dev/null +++ b/src/app/views/partials/layout/context-menu2/context-menu2.component.ts @@ -0,0 +1,13 @@ +// Angular +import { Component } from '@angular/core'; + +/** + * Sample context menu dropdown + */ +@Component({ + selector: 'kt-context-menu2', + templateUrl: './context-menu2.component.html', + styleUrls: ['./context-menu2.component.scss'] +}) +export class ContextMenu2Component { +} diff --git a/src/app/views/partials/layout/file-uploader/file-uploader-component.ts b/src/app/views/partials/layout/file-uploader/file-uploader-component.ts new file mode 100644 index 0000000..5af2dd4 --- /dev/null +++ b/src/app/views/partials/layout/file-uploader/file-uploader-component.ts @@ -0,0 +1,149 @@ +import {Component, Output, EventEmitter, Input, OnInit} from '@angular/core'; +import {Subscription} from 'rxjs'; +import {FileService} from "./file.service"; +import {Observable} from "rxjs"; + +@Component({ + selector: 'file-uploader', + templateUrl: './file-uploader.component.html', + styleUrls: ['./file-uploader.component.css'], + inputs: ['activeColor', 'baseColor', 'overlayColor'] +}) +export class FileUploaderComponent implements OnInit { + + @Output('imagenes') img_emitter: EventEmitter = new EventEmitter(true); + activeColor: string = 'green'; + baseColor: string = '#ccc'; + grayColor: string = '#a2a2a2'; + overlayColor: string = 'rgba(255,255,255,0.5)'; + dato = []; + dragging: boolean = false; + loaded: boolean = false; + imageLoaded: boolean = false; + imageSrc: string = ''; + iconColor: any = ''; + borderColor: any = ''; + subscription: Subscription; + @Input('srcImage') srcImage: string = null; + @Input('msg') msg: string = null; + listadoImagenes: Observable>; + + constructor(private _fileService: FileService) { + this.subscription = _fileService.imageSourceAnnounced$.subscribe( + img => { + //this.imageSrc = img + '?' + moment(new Date).format('HH:mm'); + this.imageSrc = ''; + }); + } + + ngOnInit(): void { + //console.log('imgsrc', this.srcImage); + if (this.srcImage) { + this.imageSrc = this.srcImage; + } + } + + handleDragEnter() { + this.dragging = true; + } + + handleDragLeave() { + this.dragging = false; + } + + handleDrop(e) { + e.preventDefault(); + this.dragging = false; + this.handleInputChange(e); + } + + handleImageLoad() { + this.imageLoaded = true; + this.iconColor = this.overlayColor; + } + + handleInputChange(e) { + this.dato = []; + var files = e.dataTransfer ? e.dataTransfer.files : e.target.files; + var pattern = /image-*/; + var reader = new FileReader(); + + + this.listadoImagenes = new Observable(observer => { + for (let file of files) { + observer.next(file); + } + observer.complete(); + }); + + this.listadoImagenes.subscribe((file: any) => { + //console.log('Imagen =>>>>>>', file); + if (!file.type.match(pattern)) { + alert('El archivo que trata de subir no es una imagen') + return; + } + + this.loaded = false; + //reader.onload = this._handleReaderLoaded.bind(this); + //reader.readAsDataURL(file); + var reader = new FileReader(); + this.readFile(file, reader, (result) => { + //this.imageSrc = result; + this.loaded = true; + this.dato.push({ + image: result, + deUrlFoto: file.name, + size: file.size, + type: file.type, + bandera: 0, + message: '' + }); + }); + }, + error=>{ + //console.log('ERROR =>>>>', error); + }, + () => { + setTimeout(() => { + this.img_emitter.emit(this.dato); + }, 1000); + }); + + + + + } + + readFile(file, reader, callback) { + // Set a callback funtion to fire after the file is fully loaded + reader.onload = () => { + // callback with the results + callback(reader.result); + } + + // Read the file + reader.readAsDataURL(file); + } + + _handleReaderLoaded(e) { + console.log("I => ", e); + var reader = e.target; + this.imageSrc = reader.result; + this.loaded = true; + } + + _setActive() { + this.borderColor = this.activeColor; + if (this.imageSrc.length === 0) { + this.iconColor = this.activeColor; + } + } + + _setInactive() { + this.borderColor = this.baseColor; + if (this.imageSrc.length === 0) { + this.iconColor = this.baseColor; + } + } + +} diff --git a/src/app/views/partials/layout/file-uploader/file-uploader.component.css b/src/app/views/partials/layout/file-uploader/file-uploader.component.css new file mode 100644 index 0000000..c529cfd --- /dev/null +++ b/src/app/views/partials/layout/file-uploader/file-uploader.component.css @@ -0,0 +1,68 @@ +/* File Uploader Styles */ + +.uploader input { + display: none; +} + +.uploader { + -webkit-align-items: center; + align-items: center; + background-color: #efefef; + background-color: rgba(0, 0, 0, 0.02); + cursor: pointer; + display: -webkit-flex; + display: flex; + height: 300px; + -webkit-justify-content: center; + justify-content: center; + outline: 3px dashed #ccc; + outline-offset: 5px; + position: relative; + width: 250px; + height: 250px; + margin: 0 auto; +} + +.uploader img, +.uploader .icon { + pointer-events: none; +} + +.uploader, +.uploader .icon { + -webkit-transition: all 100ms ease-in; + -moz-transition: all 100ms ease-in; + -ms-transition: all 100ms ease-in; + -o-transition: all 100ms ease-in; + transition: all 100ms ease-in; +} + +.uploader .icon { + color: #eee; + color: rgba(0, 0, 0, 0.2); + font-size: 5em; +} + +.uploader img { + left: 50%; + opacity: 0; + max-height: 100%; + max-width: 100%; + position: absolute; + top: 50%; + -webkit-transition: all 300ms ease-in; + -moz-transition: all 300ms ease-in; + -ms-transition: all 300ms ease-in; + -o-transition: all 300ms ease-in; + transition: all 300ms ease-in; + -webkit-transform: translate(-50%, -50%); + -moz-transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + -o-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + z-index: -1; +} + +.uploader img.loaded { + opacity: 1; +} \ No newline at end of file diff --git a/src/app/views/partials/layout/file-uploader/file-uploader.component.html b/src/app/views/partials/layout/file-uploader/file-uploader.component.html new file mode 100644 index 0000000..ee072cf --- /dev/null +++ b/src/app/views/partials/layout/file-uploader/file-uploader.component.html @@ -0,0 +1,23 @@ + + diff --git a/src/app/views/partials/layout/file-uploader/file.service.ts b/src/app/views/partials/layout/file-uploader/file.service.ts new file mode 100644 index 0000000..68547da --- /dev/null +++ b/src/app/views/partials/layout/file-uploader/file.service.ts @@ -0,0 +1,33 @@ +import {Injectable} from'@angular/core'; +import {Subject} from 'rxjs'; + +@Injectable() +export class FileService { + private imageSource = new Subject(); + imageSourceAnnounced$ = this.imageSource.asObservable(); + + private imageUrlMapa = new Subject(); + imageUrlMapaAnnounced$ = this.imageUrlMapa.asObservable(); + + private imageUrlBanner = new Subject(); + imageUrlBannerAnnounced$ = this.imageUrlBanner.asObservable(); + + private imageUrlFoto = new Subject(); + imageUrlFotoAnnounced$ = this.imageUrlFoto.asObservable(); + + announceImageSource(img: string) { + this.imageSource.next(img); + } + + announceImageMapa(img: string) { + this.imageUrlMapa.next(img); + } + + announceImageBanner(img: string) { + this.imageUrlBanner.next(img); + } + + announceImageFoto(img: string) { + this.imageUrlFoto.next(img); + } +} diff --git a/src/app/views/partials/layout/image-original-uploader/uplader-original.service.ts b/src/app/views/partials/layout/image-original-uploader/uplader-original.service.ts new file mode 100644 index 0000000..0d8066e --- /dev/null +++ b/src/app/views/partials/layout/image-original-uploader/uplader-original.service.ts @@ -0,0 +1,14 @@ +import {Injectable} from'@angular/core'; +import {Subject} from 'rxjs'; + +@Injectable() +export class UploaderOriginalService { + private imageSource = new Subject(); + imageSourceAnnounced$ = this.imageSource.asObservable(); + + public imagenCargada: boolean = false; + + announceImageSource(img: string) { + this.imageSource.next(img); + } +} diff --git a/src/app/views/partials/layout/image-original-uploader/uploader-original.component.ts b/src/app/views/partials/layout/image-original-uploader/uploader-original.component.ts new file mode 100644 index 0000000..fefa808 --- /dev/null +++ b/src/app/views/partials/layout/image-original-uploader/uploader-original.component.ts @@ -0,0 +1,125 @@ +//our root app component +import {ChangeDetectorRef, Component, EventEmitter, Input, Output} from '@angular/core' +import {UploaderOriginalService} from './uplader-original.service'; +import {Subscription} from 'rxjs'; + +@Component({ + selector: 'app-uploader-original', + template: ` +
+ +
+
+ +
+ `, +}) + +export class UploaderOriginalComponent { + public file_srcs: string[] = []; + @Output('imagenes') img_emitter: EventEmitter = new EventEmitter(true); + @Input('files_count') files_count: number = 1; + @Input('imagen') img_src: string; + @Input('ruta') ruta_url: string; + subscription: Subscription; + + constructor(private changeDetectorRef: ChangeDetectorRef, private _upladerService: UploaderOriginalService) { + this.subscription = _upladerService.imageSourceAnnounced$.subscribe( + img => { + if (img != null) { + this.file_srcs.push(this.ruta_url + img); + } + }); + } + + + // The next two lines are just to show the resize debug + // they can be removed + public debug_size_before: string[] = []; + public debug_size_after: string[] = []; + + // This is called when the user selects new files from the upload button + fileChange(input) { + this.file_srcs = []; + this.readFiles(input.files); + } + + readFile(file, reader, callback) { + // Set a callback funtion to fire after the file is fully loaded + reader.onload = () => { + // callback with the results + callback(reader.result); + } + + // Read the file + reader.readAsDataURL(file); + } + + readFiles(files, index = 0) { + if (this.files_count > this.file_srcs.length) { + + if (this.files_count >= files.length) { + // Create the file reader + let reader = new FileReader(); + console.log('FILES => ', files); + // If there is a file + if (index in files) { + // Start reading this file + this.readFile(files[index], reader, (result) => { + // Create an img element and add the image file data to it + var img = document.createElement('img'); + img.src = result; + + this.show(img, (resized_jpeg, before, after) => { + // For debugging (size in bytes before and after) + this.debug_size_before.push(before); + this.debug_size_after.push(after); + + // Add the resized jpeg img source to a list for preview + // This is also the file you want to upload. (either as a + // base64 string or img.src = resized_jpeg if you prefer a file). + this.file_srcs.push(resized_jpeg); + this.img_emitter.emit(this.file_srcs); + // Read the next file; + this.readFiles(files, index + 1); + }); + }); + } else { + // When all files are done This forces a change detection + this.changeDetectorRef.detectChanges(); + } + } else { + console.log('Se han seleccionado mas de lo normal'); + } + } + } + + show(img, callback) { + // This will wait until the img is loaded before calling this function + return img.onload = () => { + console.log('img loaded'); + + this._upladerService.imagenCargada = true; + // Get the images current width and height + var width = img.width; + var height = img.height; + + // create a canvas object + var canvas = document.createElement('canvas'); + + // Set the canvas to the new calculated dimensions + canvas.width = width; + canvas.height = height; + var ctx = canvas.getContext('2d'); + + ctx.drawImage(img, 0, 0, width, height); + + // Get this encoded as a jpeg + // IMPORTANT: 'jpeg' NOT 'jpg' + var dataUrl = canvas.toDataURL('image/png'); + + // callback with the results + callback(dataUrl, img.src.length, dataUrl.length); + }; + } +} diff --git a/src/app/views/partials/layout/index.ts b/src/app/views/partials/layout/index.ts new file mode 100644 index 0000000..0c980a6 --- /dev/null +++ b/src/app/views/partials/layout/index.ts @@ -0,0 +1,29 @@ +// Components +export { ContextMenuComponent } from './context-menu/context-menu.component'; +export { ContextMenu2Component } from './context-menu2/context-menu2.component'; +export { QuickPanelComponent } from './quick-panel/quick-panel.component'; +export { ScrollTopComponent } from './scroll-top/scroll-top.component'; +export { SearchResultComponent } from './search-result/search-result.component'; +export { SplashScreenComponent } from './splash-screen/splash-screen.component'; +export { StickyToolbarComponent } from './sticky-toolbar/sticky-toolbar.component'; + +// Subheader components +export { Subheader1Component } from './subheader/subheader1/subheader1.component'; +export { Subheader2Component } from './subheader/subheader2/subheader2.component'; +export { Subheader3Component } from './subheader/subheader3/subheader3.component'; +export { Subheader4Component } from './subheader/subheader4/subheader4.component'; +export { Subheader5Component } from './subheader/subheader5/subheader5.component'; +export { SubheaderSearchComponent } from './subheader/subheader-search/subheader-search.component'; + +// Topbar components +export { LanguageSelectorComponent } from './topbar/language-selector/language-selector.component'; +export { NotificationComponent } from './topbar/notification/notification.component'; +export { QuickActionComponent } from './topbar/quick-action/quick-action.component'; +export { SearchDefaultComponent } from './topbar/search-default/search-default.component'; +export { SearchDropdownComponent } from './topbar/search-dropdown/search-dropdown.component'; +export { UserProfileComponent } from './topbar/user-profile/user-profile.component'; +export { UserProfile2Component } from './topbar/user-profile2/user-profile2.component'; +export { UserProfile3Component } from './topbar/user-profile3/user-profile3.component'; + +// Models +export { ISearchResult } from './search-result/search-result.component'; diff --git a/src/app/views/partials/layout/modal-espera/modal-espera.component.html b/src/app/views/partials/layout/modal-espera/modal-espera.component.html new file mode 100644 index 0000000..bad346d --- /dev/null +++ b/src/app/views/partials/layout/modal-espera/modal-espera.component.html @@ -0,0 +1,3 @@ +
+
Espere un momento... +
diff --git a/src/app/views/partials/layout/modal-espera/modal-espera.component.scss b/src/app/views/partials/layout/modal-espera/modal-espera.component.scss new file mode 100644 index 0000000..d5015ad --- /dev/null +++ b/src/app/views/partials/layout/modal-espera/modal-espera.component.scss @@ -0,0 +1,29 @@ +.loader { + border: 8px solid #f3f3f3; + border-radius: 50%; + border-top: 8px solid #3498db; + width: 50px; + height: 50px; + -webkit-animation: spin 1s infinite; /* Safari */ + animation: spin 1s infinite; +} + +/* Safari */ +@-webkit-keyframes spin { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); } +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +.d-flex{ + display: flex; + align-items: center; +} + +.mr-2{ + margin-right: 1.5rem; +} diff --git a/src/app/views/partials/layout/modal-espera/modal-espera.component.ts b/src/app/views/partials/layout/modal-espera/modal-espera.component.ts new file mode 100644 index 0000000..fc6871c --- /dev/null +++ b/src/app/views/partials/layout/modal-espera/modal-espera.component.ts @@ -0,0 +1,16 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'app-modal-espera', + templateUrl: './modal-espera.component.html', + styleUrls: ['./modal-espera.component.scss'] +}) +export class ModalEsperaComponent implements OnInit { + + constructor() { + } + + ngOnInit() { + } + +} diff --git a/src/app/views/partials/layout/quick-panel/quick-panel.component.html b/src/app/views/partials/layout/quick-panel/quick-panel.component.html new file mode 100644 index 0000000..9f24676 --- /dev/null +++ b/src/app/views/partials/layout/quick-panel/quick-panel.component.html @@ -0,0 +1,422 @@ + +
+ + +
+ +
+ +
+ + + + + + + + + + + + + +
+
+
Customer Care
+ +
+ +
+ + + +
+
+
+ +
+ + + +
+
+
+ +
+ + + +
+
+ +
+ +
Reports
+ +
+ +
+ + + +
+
+
+ +
+ + + +
+
+
+ +
+ + + +
+
+ +
+ +
Memebers
+ +
+ +
+ + + +
+
+
+ +
+ + + +
+
+
+ +
+ + + +
+
+
+
+
+
+
+
+
+ diff --git a/src/app/views/partials/layout/quick-panel/quick-panel.component.scss b/src/app/views/partials/layout/quick-panel/quick-panel.component.scss new file mode 100644 index 0000000..05307a6 --- /dev/null +++ b/src/app/views/partials/layout/quick-panel/quick-panel.component.scss @@ -0,0 +1,7 @@ +:host { + ::ng-deep { + ngb-tabset > .nav-tabs { + display: none; + } + } +} diff --git a/src/app/views/partials/layout/quick-panel/quick-panel.component.ts b/src/app/views/partials/layout/quick-panel/quick-panel.component.ts new file mode 100644 index 0000000..f405e1d --- /dev/null +++ b/src/app/views/partials/layout/quick-panel/quick-panel.component.ts @@ -0,0 +1,19 @@ +// Angular +import { Component } from '@angular/core'; +// Layout +import { OffcanvasOptions } from '../../../../core/_base/layout'; + +@Component({ + selector: 'kt-quick-panel', + templateUrl: './quick-panel.component.html', + styleUrls: ['./quick-panel.component.scss'] +}) +export class QuickPanelComponent { + // Public properties + offcanvasOptions: OffcanvasOptions = { + overlay: true, + baseClass: 'kt-quick-panel', + closeBy: 'kt_quick_panel_close_btn', + toggleBy: 'kt_quick_panel_toggler_btn' + }; +} diff --git a/src/app/views/partials/layout/scroll-top/scroll-top.component.html b/src/app/views/partials/layout/scroll-top/scroll-top.component.html new file mode 100644 index 0000000..7f2fe12 --- /dev/null +++ b/src/app/views/partials/layout/scroll-top/scroll-top.component.html @@ -0,0 +1,5 @@ + +
+ +
+ diff --git a/src/app/views/partials/layout/scroll-top/scroll-top.component.ts b/src/app/views/partials/layout/scroll-top/scroll-top.component.ts new file mode 100644 index 0000000..75b0139 --- /dev/null +++ b/src/app/views/partials/layout/scroll-top/scroll-top.component.ts @@ -0,0 +1,16 @@ +// Angular +import { Component } from '@angular/core'; +// Layout +import { ScrollTopOptions } from '../../../../core/_base/layout'; + +@Component({ + selector: 'kt-scroll-top', + templateUrl: './scroll-top.component.html', +}) +export class ScrollTopComponent { + // Public properties + scrollTopOptions: ScrollTopOptions = { + offset: 300, + speed: 600 + }; +} diff --git a/src/app/views/partials/layout/search-result/search-result.component.html b/src/app/views/partials/layout/search-result/search-result.component.html new file mode 100644 index 0000000..421b340 --- /dev/null +++ b/src/app/views/partials/layout/search-result/search-result.component.html @@ -0,0 +1,31 @@ +
+ + + + +
+ + +
+
+
+
+ + {{item.text}} + +
+ {{item.text}} +
+
+
+
+ + +
{{item.text}}
+
+ + +
+ {{noRecordText||'No record found'}} +
+
diff --git a/src/app/views/partials/layout/search-result/search-result.component.scss b/src/app/views/partials/layout/search-result/search-result.component.scss new file mode 100644 index 0000000..32b3166 --- /dev/null +++ b/src/app/views/partials/layout/search-result/search-result.component.scss @@ -0,0 +1,5 @@ +:host { + .kt-quick-search__category:first-child { + margin-top: 0; + } +} diff --git a/src/app/views/partials/layout/search-result/search-result.component.ts b/src/app/views/partials/layout/search-result/search-result.component.ts new file mode 100644 index 0000000..e43b503 --- /dev/null +++ b/src/app/views/partials/layout/search-result/search-result.component.ts @@ -0,0 +1,21 @@ +// Angular +import { Component, Input } from '@angular/core'; + +export interface ISearchResult { + icon: string; + img: string; + title: string; + text: string; + url: string; +} + +@Component({ + selector: 'kt-search-result', + templateUrl: './search-result.component.html', + styleUrls: ['./search-result.component.scss'] +}) +export class SearchResultComponent { + // Public properties + @Input() data: ISearchResult[]; + @Input() noRecordText: string; +} diff --git a/src/app/views/partials/layout/splash-screen/splash-screen.component.html b/src/app/views/partials/layout/splash-screen/splash-screen.component.html new file mode 100644 index 0000000..34e9863 --- /dev/null +++ b/src/app/views/partials/layout/splash-screen/splash-screen.component.html @@ -0,0 +1,6 @@ + +
+ {{loaderMessage}} + Logo + +
diff --git a/src/app/views/partials/layout/splash-screen/splash-screen.component.scss b/src/app/views/partials/layout/splash-screen/splash-screen.component.scss new file mode 100644 index 0000000..4414d00 --- /dev/null +++ b/src/app/views/partials/layout/splash-screen/splash-screen.component.scss @@ -0,0 +1,34 @@ +:host { + .kt-splash-screen { + background-color: #f2f3f8; + position: absolute; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100%; + width: 100%; + z-index: 1000; + + img { + margin-left: calc(100vw - 100%); + width: 90px; + margin-bottom: 30px; + } + + span { + margin-left: calc(100vw - 100%); + margin-bottom: 30px; + } + + ::ng-deep { + [role="progressbar"] { + margin-left: calc(100vw - 100%); + } + .mat-progress-spinner circle, .mat-spinner circle { + // brand color + stroke: #E63C2D; + } + } + } +} diff --git a/src/app/views/partials/layout/splash-screen/splash-screen.component.ts b/src/app/views/partials/layout/splash-screen/splash-screen.component.ts new file mode 100644 index 0000000..f8c782a --- /dev/null +++ b/src/app/views/partials/layout/splash-screen/splash-screen.component.ts @@ -0,0 +1,50 @@ +// Angular +import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +// Object-Path +import * as objectPath from 'object-path'; +// Layout +import { LayoutConfigService, SplashScreenService } from '../../../../core/_base/layout'; + +@Component({ + selector: 'kt-splash-screen', + templateUrl: './splash-screen.component.html', + styleUrls: ['./splash-screen.component.scss'] +}) +export class SplashScreenComponent implements OnInit { + // Public proprties + loaderLogo: string; + loaderType: string; + loaderMessage: string; + + @ViewChild('splashScreen', {static: true}) splashScreen: ElementRef; + + /** + * Component constructor + * + * @param el: ElementRef + * @param layoutConfigService: LayoutConfigService + * @param splashScreenService: SplachScreenService + */ + constructor( + private el: ElementRef, + private layoutConfigService: LayoutConfigService, + private splashScreenService: SplashScreenService) { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + // init splash screen, see loader option in layout.config.ts + const loaderConfig = this.layoutConfigService.getConfig('loader'); + this.loaderLogo = objectPath.get(loaderConfig, 'logo'); + this.loaderType = objectPath.get(loaderConfig, 'type'); + this.loaderMessage = objectPath.get(loaderConfig, 'message'); + + this.splashScreenService.init(this.splashScreen); + } +} diff --git a/src/app/views/partials/layout/sticky-toolbar/sticky-toolbar.component.html b/src/app/views/partials/layout/sticky-toolbar/sticky-toolbar.component.html new file mode 100644 index 0000000..cf10118 --- /dev/null +++ b/src/app/views/partials/layout/sticky-toolbar/sticky-toolbar.component.html @@ -0,0 +1,194 @@ + +
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+ + + +
+
+

+ Select A Demo +

+ +
+
+
+
+ Demo1 +
+
+ +
+ Preview +
+
+
+
+
+ Demo 2 +
+
+ +
+ Preview +
+
+
+
+
+ Demo 3 +
+
+ +
+ Preview +
+
+
+
+
+ Demo 4 +
+
+ +
+ Preview +
+
+
+
+
+ Demo 5 +
+
+ +
+ Preview +
+
+
+
+
+ Demo 6 +
+
+ +
+ Preview +
+
+
+
+
+ Demo 7 +
+
+ +
+ Preview +
+
+
+
+
+ Demo 8 +
+
+ +
+ Preview +
+
+
+
+
+ Demo 9 +
+
+ +
+ Preview +
+
+
+
+
+ Demo 10 +
+
+ +
+ Preview +
+
+
+
+
+ Demo 11 +
+
+ + +
+
+
+
+ Demo 12 +
+
+ + +
+
+
+
+ Demo 13 +
+
+ + +
+
+
+
+ Demo 14 +
+
+ + +
+
+
+
+ Demo 15 +
+
+ + +
+
+ + Buy Metronic Now! + +
+
+ diff --git a/src/app/views/partials/layout/sticky-toolbar/sticky-toolbar.component.scss b/src/app/views/partials/layout/sticky-toolbar/sticky-toolbar.component.scss new file mode 100644 index 0000000..03d1b96 --- /dev/null +++ b/src/app/views/partials/layout/sticky-toolbar/sticky-toolbar.component.scss @@ -0,0 +1,7 @@ +:host { + ::ng-deep { + .tooltip { + white-space: nowrap; + } + } +} diff --git a/src/app/views/partials/layout/sticky-toolbar/sticky-toolbar.component.ts b/src/app/views/partials/layout/sticky-toolbar/sticky-toolbar.component.ts new file mode 100644 index 0000000..6c7b5a2 --- /dev/null +++ b/src/app/views/partials/layout/sticky-toolbar/sticky-toolbar.component.ts @@ -0,0 +1,29 @@ +// Angular +import {Component} from '@angular/core'; +// Layout +import {LayoutConfigService, OffcanvasOptions} from '../../../../core/_base/layout'; + +@Component({ + selector: 'kt-sticky-toolbar', + templateUrl: './sticky-toolbar.component.html', + styleUrls: ['./sticky-toolbar.component.scss'], +}) +export class StickyToolbarComponent { + // Public properties + demoPanelOptions: OffcanvasOptions = { + overlay: true, + baseClass: 'kt-demo-panel', + closeBy: 'kt_demo_panel_close', + toggleBy: 'kt_demo_panel_toggle', + }; + + baseHref: string; + + constructor(private layoutConfigService: LayoutConfigService) { + this.baseHref = 'https://keenthemes.com/metronic/preview/angular/'; + } + + isActiveDemo(demo) { + return demo === this.layoutConfigService.getConfig('demo'); + } +} diff --git a/src/app/views/partials/layout/subheader/subheader-search/subheader-search.component.html b/src/app/views/partials/layout/subheader/subheader-search/subheader-search.component.html new file mode 100644 index 0000000..df6485b --- /dev/null +++ b/src/app/views/partials/layout/subheader/subheader-search/subheader-search.component.html @@ -0,0 +1,38 @@ + diff --git a/src/app/views/partials/layout/subheader/subheader-search/subheader-search.component.scss b/src/app/views/partials/layout/subheader/subheader-search/subheader-search.component.scss new file mode 100644 index 0000000..2e698db --- /dev/null +++ b/src/app/views/partials/layout/subheader/subheader-search/subheader-search.component.scss @@ -0,0 +1,5 @@ +:host { + .kt-subheader__desc { + margin: 0; + } +} diff --git a/src/app/views/partials/layout/subheader/subheader-search/subheader-search.component.ts b/src/app/views/partials/layout/subheader/subheader-search/subheader-search.component.ts new file mode 100644 index 0000000..64daece --- /dev/null +++ b/src/app/views/partials/layout/subheader/subheader-search/subheader-search.component.ts @@ -0,0 +1,72 @@ +// Angular +import { AfterViewInit, Component, Input, OnDestroy, OnInit } from '@angular/core'; +// RxJS +import { Subscription } from 'rxjs'; +// Layout +import { SubheaderService } from '../../../../../core/_base/layout'; +import { Breadcrumb } from '../../../../../core/_base/layout/services/subheader.service'; + +@Component({ + selector: 'kt-subheader-search', + templateUrl: './subheader-search.component.html', + styleUrls: ['./subheader-search.component.scss'] +}) +export class SubheaderSearchComponent implements OnInit, OnDestroy, AfterViewInit { + // Public properties + @Input() fluid: boolean; + @Input() clear: boolean; + + today: number = Date.now(); + title = ''; + desc = ''; + breadcrumbs: Breadcrumb[] = []; + + // Private properties + private readonly subscriptions: Subscription[] = []; + + /** + * Component constructor + * + * @param subheaderService: SubheaderService + */ + constructor(public subheaderService: SubheaderService) { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + } + + /** + * After view init + */ + ngAfterViewInit(): void { + this.subscriptions.push(this.subheaderService.title$.subscribe(bt => { + // breadcrumbs title sometimes can be undefined + if (bt) { + Promise.resolve(null).then(() => { + this.title = bt.title; + this.desc = bt.desc; + }); + } + })); + + this.subscriptions.push(this.subheaderService.breadcrumbs$.subscribe(bc => { + Promise.resolve(null).then(() => { + this.breadcrumbs = bc; + }); + })); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + this.subscriptions.forEach(sb => sb.unsubscribe()); + } +} diff --git a/src/app/views/partials/layout/subheader/subheader1/subheader1.component.html b/src/app/views/partials/layout/subheader/subheader1/subheader1.component.html new file mode 100644 index 0000000..f56a5c4 --- /dev/null +++ b/src/app/views/partials/layout/subheader/subheader1/subheader1.component.html @@ -0,0 +1,85 @@ + +
+
+
+

{{title}}

+ +
+ +
+
+ diff --git a/src/app/views/partials/layout/subheader/subheader1/subheader1.component.scss b/src/app/views/partials/layout/subheader/subheader1/subheader1.component.scss new file mode 100644 index 0000000..2e698db --- /dev/null +++ b/src/app/views/partials/layout/subheader/subheader1/subheader1.component.scss @@ -0,0 +1,5 @@ +:host { + .kt-subheader__desc { + margin: 0; + } +} diff --git a/src/app/views/partials/layout/subheader/subheader1/subheader1.component.ts b/src/app/views/partials/layout/subheader/subheader1/subheader1.component.ts new file mode 100644 index 0000000..649e651 --- /dev/null +++ b/src/app/views/partials/layout/subheader/subheader1/subheader1.component.ts @@ -0,0 +1,72 @@ +// Angular +import { AfterViewInit, Component, Input, OnDestroy, OnInit } from '@angular/core'; +// RxJS +import { Subscription } from 'rxjs'; +// Layout +import { SubheaderService } from '../../../../../core/_base/layout'; +import { Breadcrumb } from '../../../../../core/_base/layout/services/subheader.service'; + +@Component({ + selector: 'kt-subheader1', + templateUrl: './subheader1.component.html', + styleUrls: ['./subheader1.component.scss'] +}) +export class Subheader1Component implements OnInit, OnDestroy, AfterViewInit { + // Public properties + @Input() fluid: boolean; + @Input() clear: boolean; + + today: number = Date.now(); + title = ''; + desc = ''; + breadcrumbs: Breadcrumb[] = []; + + // Private properties + private subscriptions: Subscription[] = []; + + /** + * Component constructor + * + * @param subheaderService: SubheaderService + */ + constructor(public subheaderService: SubheaderService) { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + } + + /** + * After view init + */ + ngAfterViewInit(): void { + this.subscriptions.push(this.subheaderService.title$.subscribe(bt => { + // breadcrumbs title sometimes can be undefined + if (bt) { + Promise.resolve(null).then(() => { + this.title = bt.title; + this.desc = bt.desc; + }); + } + })); + + this.subscriptions.push(this.subheaderService.breadcrumbs$.subscribe(bc => { + Promise.resolve(null).then(() => { + this.breadcrumbs = bc; + }); + })); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + this.subscriptions.forEach(sb => sb.unsubscribe()); + } +} diff --git a/src/app/views/partials/layout/subheader/subheader2/subheader2.component.html b/src/app/views/partials/layout/subheader/subheader2/subheader2.component.html new file mode 100644 index 0000000..046c20d --- /dev/null +++ b/src/app/views/partials/layout/subheader/subheader2/subheader2.component.html @@ -0,0 +1,99 @@ + +
+
+
+

{{title}}

+ + {{desc}} + + Add New + +
+ +
+
+ diff --git a/src/app/views/partials/layout/subheader/subheader2/subheader2.component.scss b/src/app/views/partials/layout/subheader/subheader2/subheader2.component.scss new file mode 100644 index 0000000..2e698db --- /dev/null +++ b/src/app/views/partials/layout/subheader/subheader2/subheader2.component.scss @@ -0,0 +1,5 @@ +:host { + .kt-subheader__desc { + margin: 0; + } +} diff --git a/src/app/views/partials/layout/subheader/subheader2/subheader2.component.ts b/src/app/views/partials/layout/subheader/subheader2/subheader2.component.ts new file mode 100644 index 0000000..d87ee40 --- /dev/null +++ b/src/app/views/partials/layout/subheader/subheader2/subheader2.component.ts @@ -0,0 +1,72 @@ +// Angular +import { AfterViewInit, Component, Input, OnDestroy, OnInit } from '@angular/core'; +// RxJS +import { Subscription } from 'rxjs'; +// Layout +import { SubheaderService } from '../../../../../core/_base/layout'; +import { Breadcrumb } from '../../../../../core/_base/layout/services/subheader.service'; + +@Component({ + selector: 'kt-subheader2', + templateUrl: './subheader2.component.html', + styleUrls: ['./subheader2.component.scss'] +}) +export class Subheader2Component implements OnInit, OnDestroy, AfterViewInit { + // Public properties + @Input() fluid: boolean; + @Input() clear: boolean; + + today: number = Date.now(); + title = ''; + desc = ''; + breadcrumbs: Breadcrumb[] = []; + + // Private properties + private subscriptions: Subscription[] = []; + + /** + * Component constructor + * + * @param subheaderService: SubheaderService + */ + constructor(public subheaderService: SubheaderService) { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + } + + /** + * After view init + */ + ngAfterViewInit(): void { + this.subscriptions.push(this.subheaderService.title$.subscribe(bt => { + // breadcrumbs title sometimes can be undefined + if (bt) { + Promise.resolve(null).then(() => { + this.title = bt.title; + this.desc = bt.desc; + }); + } + })); + + this.subscriptions.push(this.subheaderService.breadcrumbs$.subscribe(bc => { + Promise.resolve(null).then(() => { + this.breadcrumbs = bc; + }); + })); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + this.subscriptions.forEach(sb => sb.unsubscribe()); + } +} diff --git a/src/app/views/partials/layout/subheader/subheader3/subheader3.component.html b/src/app/views/partials/layout/subheader/subheader3/subheader3.component.html new file mode 100644 index 0000000..4e4e005 --- /dev/null +++ b/src/app/views/partials/layout/subheader/subheader3/subheader3.component.html @@ -0,0 +1,97 @@ + +
+
+
+

{{title}}

+

{{desc}}

+
+ + + + + + {{item.title}} + + + +
+
+
+
+ Today + + Month + + Year + + + Actions   + + + + + + + + + + + +
+
+
+
+ diff --git a/src/app/views/partials/layout/subheader/subheader3/subheader3.component.scss b/src/app/views/partials/layout/subheader/subheader3/subheader3.component.scss new file mode 100644 index 0000000..2e698db --- /dev/null +++ b/src/app/views/partials/layout/subheader/subheader3/subheader3.component.scss @@ -0,0 +1,5 @@ +:host { + .kt-subheader__desc { + margin: 0; + } +} diff --git a/src/app/views/partials/layout/subheader/subheader3/subheader3.component.ts b/src/app/views/partials/layout/subheader/subheader3/subheader3.component.ts new file mode 100644 index 0000000..ffdea59 --- /dev/null +++ b/src/app/views/partials/layout/subheader/subheader3/subheader3.component.ts @@ -0,0 +1,72 @@ +// Angular +import { AfterViewInit, Component, Input, OnDestroy, OnInit } from '@angular/core'; +// RxJS +import { Subscription } from 'rxjs'; +// Layout +import { SubheaderService } from '../../../../../core/_base/layout'; +import { Breadcrumb } from '../../../../../core/_base/layout/services/subheader.service'; + +@Component({ + selector: 'kt-subheader3', + templateUrl: './subheader3.component.html', + styleUrls: ['./subheader3.component.scss'] +}) +export class Subheader3Component implements OnInit, OnDestroy, AfterViewInit { + // Public properties + @Input() fluid: boolean; + @Input() clear: boolean; + + today: number = Date.now(); + title = ''; + desc = ''; + breadcrumbs: Breadcrumb[] = []; + + // Private properties + private subscriptions: Subscription[] = []; + + /** + * Component constructor + * + * @param subheaderService: SubheaderService + */ + constructor(public subheaderService: SubheaderService) { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + } + + /** + * After view init + */ + ngAfterViewInit(): void { + this.subscriptions.push(this.subheaderService.title$.subscribe(bt => { + // breadcrumbs title sometimes can be undefined + if (bt) { + Promise.resolve(null).then(() => { + this.title = bt.title; + this.desc = bt.desc; + }); + } + })); + + this.subscriptions.push(this.subheaderService.breadcrumbs$.subscribe(bc => { + Promise.resolve(null).then(() => { + this.breadcrumbs = bc; + }); + })); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + this.subscriptions.forEach(sb => sb.unsubscribe()); + } +} diff --git a/src/app/views/partials/layout/subheader/subheader4/subheader4.component.html b/src/app/views/partials/layout/subheader/subheader4/subheader4.component.html new file mode 100644 index 0000000..7330a72 --- /dev/null +++ b/src/app/views/partials/layout/subheader/subheader4/subheader4.component.html @@ -0,0 +1,41 @@ + +
+
+
+

{{title}}

+

{{desc}}

+
+ + + + + + {{item.title}} + + + +
+
+ +
+
+ diff --git a/src/app/views/partials/layout/subheader/subheader4/subheader4.component.scss b/src/app/views/partials/layout/subheader/subheader4/subheader4.component.scss new file mode 100644 index 0000000..2e698db --- /dev/null +++ b/src/app/views/partials/layout/subheader/subheader4/subheader4.component.scss @@ -0,0 +1,5 @@ +:host { + .kt-subheader__desc { + margin: 0; + } +} diff --git a/src/app/views/partials/layout/subheader/subheader4/subheader4.component.ts b/src/app/views/partials/layout/subheader/subheader4/subheader4.component.ts new file mode 100644 index 0000000..e55e8f9 --- /dev/null +++ b/src/app/views/partials/layout/subheader/subheader4/subheader4.component.ts @@ -0,0 +1,72 @@ +// Angular +import { AfterViewInit, Component, Input, OnDestroy, OnInit } from '@angular/core'; +// RxJS +import { Subscription } from 'rxjs'; +// Layout +import { SubheaderService } from '../../../../../core/_base/layout'; +import { Breadcrumb } from '../../../../../core/_base/layout/services/subheader.service'; + +@Component({ + selector: 'kt-subheader4', + templateUrl: './subheader4.component.html', + styleUrls: ['./subheader4.component.scss'] +}) +export class Subheader4Component implements OnInit, OnDestroy, AfterViewInit { + // Public properties + @Input() fluid: boolean; + @Input() clear: boolean; + + today: number = Date.now(); + title = ''; + desc = ''; + breadcrumbs: Breadcrumb[] = []; + + // Private properties + private subscriptions: Subscription[] = []; + + /** + * Component constructor + * + * @param subheaderService: SubheaderService + */ + constructor(public subheaderService: SubheaderService) { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + } + + /** + * After view init + */ + ngAfterViewInit(): void { + this.subscriptions.push(this.subheaderService.title$.subscribe(bt => { + // breadcrumbs title sometimes can be undefined + if (bt) { + Promise.resolve(null).then(() => { + this.title = bt.title; + this.desc = bt.desc; + }); + } + })); + + this.subscriptions.push(this.subheaderService.breadcrumbs$.subscribe(bc => { + Promise.resolve(null).then(() => { + this.breadcrumbs = bc; + }); + })); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + this.subscriptions.forEach(sb => sb.unsubscribe()); + } +} diff --git a/src/app/views/partials/layout/subheader/subheader5/subheader5.component.html b/src/app/views/partials/layout/subheader/subheader5/subheader5.component.html new file mode 100644 index 0000000..460f8ad --- /dev/null +++ b/src/app/views/partials/layout/subheader/subheader5/subheader5.component.html @@ -0,0 +1,42 @@ + +
+
+

{{title}}

+

{{desc}}

+
+ + + + + + {{item.title}} + + + +
+
+ +
+ diff --git a/src/app/views/partials/layout/subheader/subheader5/subheader5.component.scss b/src/app/views/partials/layout/subheader/subheader5/subheader5.component.scss new file mode 100644 index 0000000..2e698db --- /dev/null +++ b/src/app/views/partials/layout/subheader/subheader5/subheader5.component.scss @@ -0,0 +1,5 @@ +:host { + .kt-subheader__desc { + margin: 0; + } +} diff --git a/src/app/views/partials/layout/subheader/subheader5/subheader5.component.ts b/src/app/views/partials/layout/subheader/subheader5/subheader5.component.ts new file mode 100644 index 0000000..a0811ed --- /dev/null +++ b/src/app/views/partials/layout/subheader/subheader5/subheader5.component.ts @@ -0,0 +1,72 @@ +// Angular +import { AfterViewInit, Component, Input, OnDestroy, OnInit } from '@angular/core'; +// RxJS +import { Subscription } from 'rxjs'; +// Layout +import { SubheaderService } from '../../../../../core/_base/layout'; +import { Breadcrumb } from '../../../../../core/_base/layout/services/subheader.service'; + +@Component({ + selector: 'kt-subheader5', + templateUrl: './subheader5.component.html', + styleUrls: ['./subheader5.component.scss'] +}) +export class Subheader5Component implements OnInit, OnDestroy, AfterViewInit { + // Public properties + @Input() fluid: boolean; + @Input() clear: boolean; + + today: number = Date.now(); + title = ''; + desc = ''; + breadcrumbs: Breadcrumb[] = []; + + // Private properties + private subscriptions: Subscription[] = []; + + /** + * Component constructor + * + * @param subheaderService: SubheaderService + */ + constructor(public subheaderService: SubheaderService) { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + } + + /** + * After view init + */ + ngAfterViewInit(): void { + this.subscriptions.push(this.subheaderService.title$.subscribe(bt => { + // breadcrumbs title sometimes can be undefined + if (bt) { + Promise.resolve(null).then(() => { + this.title = bt.title; + this.desc = bt.desc; + }); + } + })); + + this.subscriptions.push(this.subheaderService.breadcrumbs$.subscribe(bc => { + Promise.resolve(null).then(() => { + this.breadcrumbs = bc; + }); + })); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + this.subscriptions.forEach(sb => sb.unsubscribe()); + } +} diff --git a/src/app/views/partials/layout/topbar/cart/cart.component.html b/src/app/views/partials/layout/topbar/cart/cart.component.html new file mode 100644 index 0000000..2c05601 --- /dev/null +++ b/src/app/views/partials/layout/topbar/cart/cart.component.html @@ -0,0 +1,154 @@ + +
+
+ + + + +
+ +
+ diff --git a/src/app/views/partials/layout/topbar/cart/cart.component.scss b/src/app/views/partials/layout/topbar/cart/cart.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/partials/layout/topbar/cart/cart.component.ts b/src/app/views/partials/layout/topbar/cart/cart.component.ts new file mode 100644 index 0000000..f5a8ad4 --- /dev/null +++ b/src/app/views/partials/layout/topbar/cart/cart.component.ts @@ -0,0 +1,43 @@ +// Angular +import { AfterViewInit, Component, Input, OnInit } from '@angular/core'; + +@Component({ + selector: 'kt-cart', + templateUrl: './cart.component.html', + styleUrls: ['./cart.component.scss'] +}) +export class CartComponent implements OnInit, AfterViewInit { + // Public properties + + // Set icon class name + @Input() icon = 'flaticon2-shopping-cart-1'; + @Input() iconType: '' | 'brand'; + + // Set true to icon as SVG or false as icon class + @Input() useSVG: boolean; + + // Set bg image path + @Input() bgImage: string; + + /** + * Component constructor + */ + constructor() { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * After view init + */ + ngAfterViewInit(): void { + } + + /** + * On init + */ + ngOnInit(): void { + } +} diff --git a/src/app/views/partials/layout/topbar/language-selector/language-selector.component.html b/src/app/views/partials/layout/topbar/language-selector/language-selector.component.html new file mode 100644 index 0000000..0361b93 --- /dev/null +++ b/src/app/views/partials/layout/topbar/language-selector/language-selector.component.html @@ -0,0 +1,22 @@ +
+
+ + + +
+ +
diff --git a/src/app/views/partials/layout/topbar/language-selector/language-selector.component.ts b/src/app/views/partials/layout/topbar/language-selector/language-selector.component.ts new file mode 100644 index 0000000..c4a07c6 --- /dev/null +++ b/src/app/views/partials/layout/topbar/language-selector/language-selector.component.ts @@ -0,0 +1,107 @@ +// Angular +import { Component, HostBinding, OnInit, Input } from '@angular/core'; +import { NavigationStart, Router } from '@angular/router'; +// RxJS +import { filter } from 'rxjs/operators'; +// Translate +import { TranslationService } from '../../../../../core/_base/layout'; + +interface LanguageFlag { + lang: string; + name: string; + flag: string; + active?: boolean; +} + +@Component({ + selector: 'kt-language-selector', + templateUrl: './language-selector.component.html', +}) +export class LanguageSelectorComponent implements OnInit { + // Public properties + @HostBinding('class') classes = ''; + @Input() iconType: '' | 'brand'; + + language: LanguageFlag; + languages: LanguageFlag[] = [ + { + lang: 'en', + name: 'English', + flag: './assets/media/flags/260-united-kingdom.svg' + }, + { + lang: 'ch', + name: 'Mandarin', + flag: './assets/media/flags/034-china.svg' + }, + { + lang: 'es', + name: 'Spanish', + flag: './assets/media/flags/128-spain.svg' + }, + { + lang: 'jp', + name: 'Japanese', + flag: './assets/media/flags/063-japan.svg' + }, + { + lang: 'de', + name: 'German', + flag: './assets/media/flags/162-germany.svg' + }, + { + lang: 'fr', + name: 'French', + flag: './assets/media/flags/195-france.svg' + }, + ]; + + /** + * Component constructor + * + * @param translationService: TranslationService + * @param router: Router + */ + constructor(private translationService: TranslationService, private router: Router) { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + this.setSelectedLanguage(); + this.router.events + .pipe(filter(event => event instanceof NavigationStart)) + .subscribe(event => { + this.setSelectedLanguage(); + }); + } + + /** + * Set language + * + * @param lang: any + */ + setLanguage(lang) { + this.languages.forEach((language: LanguageFlag) => { + if (language.lang === lang) { + language.active = true; + this.language = language; + } else { + language.active = false; + } + }); + this.translationService.setLanguage(lang); + } + + /** + * Set selected language + */ + setSelectedLanguage(): any { + this.setLanguage(this.translationService.getSelectedLanguage()); + } +} diff --git a/src/app/views/partials/layout/topbar/notification/notification.component.html b/src/app/views/partials/layout/topbar/notification/notification.component.html new file mode 100644 index 0000000..7517db7 --- /dev/null +++ b/src/app/views/partials/layout/topbar/notification/notification.component.html @@ -0,0 +1,411 @@ +
+
+ + + + + + +
+ + +
diff --git a/src/app/views/partials/layout/topbar/notification/notification.component.scss b/src/app/views/partials/layout/topbar/notification/notification.component.scss new file mode 100644 index 0000000..05307a6 --- /dev/null +++ b/src/app/views/partials/layout/topbar/notification/notification.component.scss @@ -0,0 +1,7 @@ +:host { + ::ng-deep { + ngb-tabset > .nav-tabs { + display: none; + } + } +} diff --git a/src/app/views/partials/layout/topbar/notification/notification.component.ts b/src/app/views/partials/layout/topbar/notification/notification.component.ts new file mode 100644 index 0000000..3b5032a --- /dev/null +++ b/src/app/views/partials/layout/topbar/notification/notification.component.ts @@ -0,0 +1,50 @@ +// Angular +import { Component, Input } from '@angular/core'; +import { DomSanitizer } from '@angular/platform-browser'; + +@Component({ + selector: 'kt-notification', + templateUrl: './notification.component.html', + styleUrls: ['notification.component.scss'] +}) +export class NotificationComponent { + + // Show dot on top of the icon + @Input() dot: string; + + // Show pulse on icon + @Input() pulse: boolean; + + @Input() pulseLight: boolean; + + // Set icon class name + @Input() icon = 'flaticon2-bell-alarm-symbol'; + @Input() iconType: '' | 'success'; + + // Set true to icon as SVG or false as icon class + @Input() useSVG: boolean; + + // Set bg image path + @Input() bgImage: string; + + // Set skin color, default to light + @Input() skin: 'light' | 'dark' = 'light'; + + @Input() type: 'brand' | 'success' = 'success'; + + /** + * Component constructor + * + * @param sanitizer: DomSanitizer + */ + constructor(private sanitizer: DomSanitizer) { + } + + backGroundStyle(): string { + if (!this.bgImage) { + return 'none'; + } + + return 'url(' + this.bgImage + ')'; + } +} diff --git a/src/app/views/partials/layout/topbar/quick-action/quick-action.component.html b/src/app/views/partials/layout/topbar/quick-action/quick-action.component.html new file mode 100644 index 0000000..517d25c --- /dev/null +++ b/src/app/views/partials/layout/topbar/quick-action/quick-action.component.html @@ -0,0 +1,51 @@ + +
+
+ + + + +
+ +
+ diff --git a/src/app/views/partials/layout/topbar/quick-action/quick-action.component.ts b/src/app/views/partials/layout/topbar/quick-action/quick-action.component.ts new file mode 100644 index 0000000..67db85f --- /dev/null +++ b/src/app/views/partials/layout/topbar/quick-action/quick-action.component.ts @@ -0,0 +1,52 @@ +// Angular +import { AfterViewInit, Component, Input, OnInit } from '@angular/core'; + +@Component({ + selector: 'kt-quick-action', + templateUrl: './quick-action.component.html', +}) +export class QuickActionComponent implements OnInit, AfterViewInit { + // Public properties + + // Set icon class name + @Input() icon = 'flaticon2-gear'; + + @Input() iconType: '' | 'warning'; + + // Set true to icon as SVG or false as icon class + @Input() useSVG: boolean; + + // Set bg image path + @Input() bgImage: string; + + // Set skin color, default to light + @Input() skin: 'light' | 'dark' = 'light'; + + @Input() gridNavSkin: 'light' | 'dark' = 'light'; + + /** + * Component constructor + */ + constructor() { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * After view init + */ + ngAfterViewInit(): void { + } + + /** + * On init + */ + ngOnInit(): void { + } + + onSVGInserted(svg) { + svg.classList.add('kt-svg-icon', 'kt-svg-icon--success', 'kt-svg-icon--lg'); + } +} diff --git a/src/app/views/partials/layout/topbar/search-default/search-default.component.html b/src/app/views/partials/layout/topbar/search-default/search-default.component.html new file mode 100644 index 0000000..f00ff3a --- /dev/null +++ b/src/app/views/partials/layout/topbar/search-default/search-default.component.html @@ -0,0 +1,29 @@ + + + diff --git a/src/app/views/partials/layout/topbar/search-default/search-default.component.ts b/src/app/views/partials/layout/topbar/search-default/search-default.component.ts new file mode 100644 index 0000000..38c8ed4 --- /dev/null +++ b/src/app/views/partials/layout/topbar/search-default/search-default.component.ts @@ -0,0 +1,116 @@ +// Angular +import { ChangeDetectorRef, Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core'; + +@Component({ + selector: 'kt-search-default', + templateUrl: './search-default.component.html', +}) +export class SearchDefaultComponent implements OnInit { + // Public properties + + // Set icon class name + @Input() icon = 'flaticon2-search-1'; + + // Set true to icon as SVG or false as icon class + @Input() useSVG: boolean; + + @ViewChild('searchInput', {static: true}) searchInput: ElementRef; + + data: any[]; + result: any[]; + loading: boolean; + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + constructor(private cdr: ChangeDetectorRef) { + } + + /** + * On init + */ + ngOnInit(): void { + // simulate result from API + // type 0|1 as separator or item + this.result = [ + { + text: 'Documents', + type: 0 + }, { + icon: '', + text: 'Annual finance report', + type: 1 + }, { + icon: '', + text: 'Company meeting schedule', + type: 1 + }, { + icon: '', + text: 'Project quotations', + type: 1 + }, { + text: 'Customers', + type: 0 + }, { + img: '', + text: 'Amanda Anderson', + type: 1 + }, { + img: '', + text: 'Kennedy Lloyd', + type: 1 + }, { + img: '', + text: 'Megan Weldon', + type: 1 + }, { + img: '', + text: 'Marc-André ter Stegen', + type: 1 + }, { + text: 'Files', + type: 0 + }, { + icon: '', + text: 'Revenue report', + type: 1 + }, { + icon: '', + text: 'Anual finance report', + type: 1 + }, { + icon: '', + text: 'Tax calculations', + type: 1 + } + ]; + } + + /** + * Search + * @param e: Event + */ + search(e) { + this.data = null; + if (e.target.value.length > 2) { + this.loading = true; + // simulate getting search result + setTimeout(() => { + this.data = this.result; + this.loading = false; + this.cdr.markForCheck(); + }, 500); + } + } + + /** + * Clear search + * + * @param e: Event + */ + clear(e) { + this.data = null; + this.searchInput.nativeElement.value = ''; + } +} diff --git a/src/app/views/partials/layout/topbar/search-dropdown/search-dropdown.component.html b/src/app/views/partials/layout/topbar/search-dropdown/search-dropdown.component.html new file mode 100644 index 0000000..ca2d5df --- /dev/null +++ b/src/app/views/partials/layout/topbar/search-dropdown/search-dropdown.component.html @@ -0,0 +1,24 @@ + + + diff --git a/src/app/views/partials/layout/topbar/search-dropdown/search-dropdown.component.ts b/src/app/views/partials/layout/topbar/search-dropdown/search-dropdown.component.ts new file mode 100644 index 0000000..c6220b6 --- /dev/null +++ b/src/app/views/partials/layout/topbar/search-dropdown/search-dropdown.component.ts @@ -0,0 +1,122 @@ +// Angular +import { ChangeDetectorRef, Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core'; + +@Component({ + selector: 'kt-search-dropdown', + templateUrl: './search-dropdown.component.html', +}) +export class SearchDropdownComponent implements OnInit { + // Public properties + + // Set icon class name + @Input() icon = 'flaticon2-search-1'; + + // Set true to icon as SVG or false as icon class + @Input() useSVG: boolean; + + @Input() type: 'brand' | 'success' | 'warning' = 'success'; + + @ViewChild('searchInput', {static: true}) searchInput: ElementRef; + + data: any[]; + result: any[]; + loading: boolean; + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + constructor(private cdr: ChangeDetectorRef) { + } + + /** + * On init + */ + ngOnInit(): void { + // simulate result from API + // type 0|1 as separator or item + this.result = [ + { + text: 'Documents', + type: 0 + }, { + icon: '', + text: 'Annual finance report', + type: 1 + }, { + icon: '', + text: 'Company meeting schedule', + type: 1 + }, { + icon: '', + text: 'Project quotations', + type: 1 + }, { + text: 'Customers', + type: 0 + }, { + img: '', + text: 'Amanda Anderson', + type: 1 + }, { + img: '', + text: 'Kennedy Lloyd', + type: 1 + }, { + img: '', + text: 'Megan Weldon', + type: 1 + }, { + img: '', + text: 'Marc-André ter Stegen', + type: 1 + }, { + text: 'Files', + type: 0 + }, { + icon: '', + text: 'Revenue report', + type: 1 + }, { + icon: '', + text: 'Anual finance report', + type: 1 + }, { + icon: '', + text: 'Tax calculations', + type: 1 + } + ]; + } + + /** + * Search + * @param e: Event + */ + search(e) { + this.data = null; + if (e.target.value.length > 2) { + this.loading = true; + // simulate getting search result + setTimeout(() => { + this.data = this.result; + this.loading = false; + this.cdr.markForCheck(); + }, 500); + } + } + + /** + * Clear search + * + * @param e: Event + */ + clear(e) { + this.data = null; + this.searchInput.nativeElement.value = ''; + } + + openChange() { + setTimeout(() => this.searchInput.nativeElement.focus()); + } +} diff --git a/src/app/views/partials/layout/topbar/user-profile/user-profile.component.html b/src/app/views/partials/layout/topbar/user-profile/user-profile.component.html new file mode 100644 index 0000000..4beeb2d --- /dev/null +++ b/src/app/views/partials/layout/topbar/user-profile/user-profile.component.html @@ -0,0 +1,42 @@ +
+
+
+ Hi, + {{_user.fullname}} + + Pic + {{_user.fullname|firstLetter}} +
+
+ +
diff --git a/src/app/views/partials/layout/topbar/user-profile/user-profile.component.ts b/src/app/views/partials/layout/topbar/user-profile/user-profile.component.ts new file mode 100644 index 0000000..a6c1ec1 --- /dev/null +++ b/src/app/views/partials/layout/topbar/user-profile/user-profile.component.ts @@ -0,0 +1,44 @@ +// Angular +import { Component, Input, OnInit } from '@angular/core'; +// RxJS +import { Observable } from 'rxjs'; +// NGRX +import { select, Store } from '@ngrx/store'; +// State +import { AppState } from '../../../../../core/reducers'; +import {AuthService, currentUser, Logout, User} from '../../../../../core/auth'; + +@Component({ + selector: 'kt-user-profile', + templateUrl: './user-profile.component.html', +}) +export class UserProfileComponent implements OnInit { + // Public properties + user$: Observable; + + @Input() avatar = true; + @Input() greeting = true; + @Input() badge: boolean; + @Input() icon: boolean; + + constructor(private store: Store, private auth: AuthService) { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit(): void { + this.user$ = this.auth.getUser(); + } + + /** + * Log out + */ + logout() { + this.auth.logout(true); + } +} diff --git a/src/app/views/partials/layout/topbar/user-profile2/user-profile2.component.html b/src/app/views/partials/layout/topbar/user-profile2/user-profile2.component.html new file mode 100644 index 0000000..f9b70f5 --- /dev/null +++ b/src/app/views/partials/layout/topbar/user-profile2/user-profile2.component.html @@ -0,0 +1,118 @@ +
+
+ Hi, + {{_user.fullname}} + {{_user.fullname|firstLetter}} + Pic +
+ +
diff --git a/src/app/views/partials/layout/topbar/user-profile2/user-profile2.component.ts b/src/app/views/partials/layout/topbar/user-profile2/user-profile2.component.ts new file mode 100644 index 0000000..0139755 --- /dev/null +++ b/src/app/views/partials/layout/topbar/user-profile2/user-profile2.component.ts @@ -0,0 +1,49 @@ +// Angular +import { Component, Input, OnInit } from '@angular/core'; +// RxJS +import { Observable } from 'rxjs'; +// NGRX +import { select, Store } from '@ngrx/store'; +// State +import { AppState } from '../../../../../core/reducers'; +import { currentUser, Logout, User } from '../../../../../core/auth'; + +@Component({ + selector: 'kt-user-profile2', + templateUrl: './user-profile2.component.html', +}) +export class UserProfile2Component implements OnInit { + // Public properties + user$: Observable; + + @Input() avatar = true; + @Input() greeting = true; + @Input() badge: boolean; + @Input() icon: boolean; + + /** + * Component constructor + * + * @param store: Store + */ + constructor(private store: Store) { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit(): void { + this.user$ = this.store.pipe(select(currentUser)); + } + + /** + * Log out + */ + logout() { + this.store.dispatch(new Logout()); + } +} diff --git a/src/app/views/partials/layout/topbar/user-profile3/user-profile3.component.html b/src/app/views/partials/layout/topbar/user-profile3/user-profile3.component.html new file mode 100644 index 0000000..82222d9 --- /dev/null +++ b/src/app/views/partials/layout/topbar/user-profile3/user-profile3.component.html @@ -0,0 +1,120 @@ +
+
+ Hi, + {{_user.fullname}} + {{_user.fullname|firstLetter}} +
+ +
+ + + diff --git a/src/app/views/partials/layout/topbar/user-profile3/user-profile3.component.ts b/src/app/views/partials/layout/topbar/user-profile3/user-profile3.component.ts new file mode 100644 index 0000000..349717c --- /dev/null +++ b/src/app/views/partials/layout/topbar/user-profile3/user-profile3.component.ts @@ -0,0 +1,49 @@ +// Angular +import { Component, Input, OnInit } from '@angular/core'; +// RxJS +import { Observable } from 'rxjs'; +// NGRX +import { select, Store } from '@ngrx/store'; +// State +import { AppState } from '../../../../../core/reducers'; +import { currentUser, Logout, User } from '../../../../../core/auth'; + +@Component({ + selector: 'kt-user-profile3', + templateUrl: './user-profile3.component.html', +}) +export class UserProfile3Component implements OnInit { + // Public properties + user$: Observable; + + @Input() avatar = true; + @Input() greeting = true; + @Input() badge: boolean; + @Input() icon: boolean; + + /** + * Component constructor + * + * @param store: Store + */ + constructor(private store: Store) { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit(): void { + this.user$ = this.store.pipe(select(currentUser)); + } + + /** + * Log out + */ + logout() { + this.store.dispatch(new Logout()); + } +} diff --git a/src/app/views/partials/partials.module.ts b/src/app/views/partials/partials.module.ts new file mode 100644 index 0000000..4334f9e --- /dev/null +++ b/src/app/views/partials/partials.module.ts @@ -0,0 +1,211 @@ +// Angular +import { RouterModule } from '@angular/router'; +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { + MatAutocompleteModule, + MatButtonModule, + MatCardModule, + MatCheckboxModule, + MatDatepickerModule, + MatDialogModule, + MatIconModule, + MatInputModule, + MatMenuModule, + MatNativeDateModule, + MatPaginatorModule, + MatProgressBarModule, + MatProgressSpinnerModule, + MatRadioModule, + MatSelectModule, + MatSnackBarModule, + MatSortModule, + MatTableModule, + MatTabsModule, + MatTooltipModule, +} from '@angular/material'; +// NgBootstrap +import {NgbDropdownModule, NgbTabsetModule, NgbTooltipModule} from '@ng-bootstrap/ng-bootstrap'; +// Perfect Scrollbar +import {PerfectScrollbarModule} from 'ngx-perfect-scrollbar'; +// Core module +import {CoreModule} from '../../core/core.module'; +// CRUD Partials +import { + ActionNotificationComponent, + AlertComponent, + DeleteEntityDialogComponent, + FetchEntityDialogComponent, + UpdateStatusDialogComponent, +} from './content/crud'; +// Layout partials +import { + ContextMenu2Component, + ContextMenuComponent, + LanguageSelectorComponent, + NotificationComponent, + QuickActionComponent, + QuickPanelComponent, + ScrollTopComponent, + SearchDefaultComponent, + SearchDropdownComponent, + SearchResultComponent, + SplashScreenComponent, + StickyToolbarComponent, + Subheader1Component, + Subheader2Component, + Subheader3Component, + Subheader4Component, + Subheader5Component, + SubheaderSearchComponent, + UserProfile2Component, + UserProfile3Component, + UserProfileComponent, +} from './layout'; +// General +import {NoticeComponent} from './content/general/notice/notice.component'; +import {PortletModule} from './content/general/portlet/portlet.module'; +// Errpr +import {ErrorComponent} from './content/general/error/error.component'; +// Extra module +import {WidgetModule} from './content/widgets/widget.module'; +// SVG inline +import {InlineSVGModule} from 'ng-inline-svg'; +import {CartComponent} from './layout/topbar/cart/cart.component'; +import {ModalEsperaComponent} from './layout/modal-espera/modal-espera.component'; +import {FileUploaderComponent} from './layout/file-uploader/file-uploader-component'; +import {FileService} from './layout/file-uploader/file.service'; +import {UploaderOriginalComponent} from './layout/image-original-uploader/uploader-original.component'; +import {UploaderOriginalService} from './layout/image-original-uploader/uplader-original.service'; + +@NgModule({ + declarations: [ + ScrollTopComponent, + NoticeComponent, + ActionNotificationComponent, + DeleteEntityDialogComponent, + FetchEntityDialogComponent, + UpdateStatusDialogComponent, + AlertComponent, + + // topbar components + ContextMenu2Component, + ContextMenuComponent, + QuickPanelComponent, + ScrollTopComponent, + SearchResultComponent, + SplashScreenComponent, + StickyToolbarComponent, + Subheader1Component, + Subheader2Component, + Subheader3Component, + Subheader4Component, + Subheader5Component, + SubheaderSearchComponent, + LanguageSelectorComponent, + NotificationComponent, + QuickActionComponent, + SearchDefaultComponent, + SearchDropdownComponent, + UserProfileComponent, + UserProfile2Component, + UserProfile3Component, + CartComponent, + + ErrorComponent, + ModalEsperaComponent, + FileUploaderComponent, + UploaderOriginalComponent + ], + exports: [ + WidgetModule, + PortletModule, + + ScrollTopComponent, + NoticeComponent, + ActionNotificationComponent, + DeleteEntityDialogComponent, + FetchEntityDialogComponent, + UpdateStatusDialogComponent, + AlertComponent, + + // topbar components + ContextMenu2Component, + ContextMenuComponent, + QuickPanelComponent, + ScrollTopComponent, + SearchResultComponent, + SplashScreenComponent, + StickyToolbarComponent, + Subheader1Component, + Subheader2Component, + Subheader3Component, + Subheader4Component, + Subheader5Component, + SubheaderSearchComponent, + LanguageSelectorComponent, + NotificationComponent, + QuickActionComponent, + SearchDefaultComponent, + SearchDropdownComponent, + UserProfileComponent, + UserProfile2Component, + UserProfile3Component, + CartComponent, + + ErrorComponent, + ModalEsperaComponent, + FileUploaderComponent, + UploaderOriginalComponent + ], + imports: [ + CommonModule, + RouterModule, + FormsModule, + ReactiveFormsModule, + PerfectScrollbarModule, + InlineSVGModule, + CoreModule, + PortletModule, + WidgetModule, + + // angular material modules + MatButtonModule, + MatMenuModule, + MatSelectModule, + MatInputModule, + MatTableModule, + MatAutocompleteModule, + MatRadioModule, + MatIconModule, + MatNativeDateModule, + MatProgressBarModule, + MatDatepickerModule, + MatCardModule, + MatPaginatorModule, + MatSortModule, + MatCheckboxModule, + MatProgressSpinnerModule, + MatSnackBarModule, + MatTabsModule, + MatTooltipModule, + MatDialogModule, + + // ng-bootstrap modules + NgbDropdownModule, + NgbTabsetModule, + NgbTooltipModule, + ], + entryComponents:[ + ModalEsperaComponent, + FileUploaderComponent, + UploaderOriginalComponent + ], + providers: [ + FileService, + UploaderOriginalService + ] +}) +export class PartialsModule { +} diff --git a/src/app/views/theme/aside/aside-left.component.html b/src/app/views/theme/aside/aside-left.component.html new file mode 100644 index 0000000..e37706a --- /dev/null +++ b/src/app/views/theme/aside/aside-left.component.html @@ -0,0 +1,97 @@ + +
+ +
+
+
    + +
+
+
+ +
+ + + + + + + + + + + + + + + + +
  • + + + + + + + + + + + +
    + +
    + + +
    + + + +
    +
  • + +
    + + +
      + + + +
    +
    + + + + + + + + + + + + + + + {{item.title}} + + + {{item.badge.value}} + + + + + diff --git a/src/app/views/theme/aside/aside-left.component.scss b/src/app/views/theme/aside/aside-left.component.scss new file mode 100644 index 0000000..8ffdec6 --- /dev/null +++ b/src/app/views/theme/aside/aside-left.component.scss @@ -0,0 +1,5 @@ +:host { + .kt-aside { + height: 100%; + } +} diff --git a/src/app/views/theme/aside/aside-left.component.ts b/src/app/views/theme/aside/aside-left.component.ts new file mode 100644 index 0000000..56e3d0c --- /dev/null +++ b/src/app/views/theme/aside/aside-left.component.ts @@ -0,0 +1,235 @@ +import { + AfterViewInit, + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + ElementRef, + OnInit, + Renderer2, + ViewChild +} from '@angular/core'; +import { filter } from 'rxjs/operators'; +import { NavigationEnd, Router } from '@angular/router'; +import * as objectPath from 'object-path'; +// Layout +import { LayoutConfigService, MenuAsideService, MenuOptions, OffcanvasOptions } from '../../../core/_base/layout'; +import { HtmlClassService } from '../html-class.service'; + +@Component({ + selector: 'kt-aside-left', + templateUrl: './aside-left.component.html', + styleUrls: ['./aside-left.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class AsideLeftComponent implements OnInit, AfterViewInit { + + @ViewChild('asideMenu', {static: true}) asideMenu: ElementRef; + + currentRouteUrl = ''; + insideTm: any; + outsideTm: any; + + menuCanvasOptions: OffcanvasOptions = { + baseClass: 'kt-aside', + overlay: true, + closeBy: 'kt_aside_close_btn', + toggleBy: { + target: 'kt_aside_mobile_toggler', + state: 'kt-header-mobile__toolbar-toggler--active' + } + }; + + menuOptions: MenuOptions = { + // vertical scroll + scroll: null, + + // submenu setup + submenu: { + desktop: { + // by default the menu mode set to accordion in desktop mode + default: 'dropdown', + // whenever body has this class switch the menu mode to dropdown + state: { + body: 'kt-aside--minimize', + mode: 'dropdown' + } + }, + tablet: 'accordion', // menu set to accordion in tablet mode + mobile: 'accordion' // menu set to accordion in mobile mode + }, + + // accordion setup + accordion: { + expandAll: false // allow having multiple expanded accordions in the menu + } + }; + + /** + * Component Conctructor + * + * @param htmlClassService: HtmlClassService + * @param menuAsideService + * @param layoutConfigService: LayouConfigService + * @param router: Router + * @param render: Renderer2 + * @param cdr: ChangeDetectorRef + */ + constructor( + public htmlClassService: HtmlClassService, + public menuAsideService: MenuAsideService, + public layoutConfigService: LayoutConfigService, + private router: Router, + private render: Renderer2, + private cdr: ChangeDetectorRef + ) { + } + + ngAfterViewInit(): void { + } + + ngOnInit() { + this.currentRouteUrl = this.router.url.split(/[?#]/)[0]; + + this.router.events + .pipe(filter(event => event instanceof NavigationEnd)) + .subscribe(event => { + this.currentRouteUrl = this.router.url.split(/[?#]/)[0]; + this.cdr.markForCheck(); + }); + + const config = this.layoutConfigService.getConfig(); + + if (objectPath.get(config, 'aside.menu.dropdown') !== true && objectPath.get(config, 'aside.self.fixed')) { + this.render.setAttribute(this.asideMenu.nativeElement, 'data-ktmenu-scroll', '1'); + } + + if (objectPath.get(config, 'aside.menu.dropdown')) { + this.render.setAttribute(this.asideMenu.nativeElement, 'data-ktmenu-dropdown', '1'); + // tslint:disable-next-line:max-line-length + this.render.setAttribute(this.asideMenu.nativeElement, 'data-ktmenu-dropdown-timeout', objectPath.get(config, 'aside.menu.submenu.dropdown.hover-timeout')); + } + } + + /** + * Check Menu is active + * @param item: any + */ + isMenuItemIsActive(item): boolean { + if (item.submenu) { + return this.isMenuRootItemIsActive(item); + } + + if (!item.page) { + return false; + } + + return this.currentRouteUrl.indexOf(item.page) !== -1; + } + + /** + * Check Menu Root Item is active + * @param item: any + */ + isMenuRootItemIsActive(item): boolean { + let result = false; + + for (const subItem of item.submenu) { + result = this.isMenuItemIsActive(subItem); + if (result) { + return true; + } + } + + return false; + } + + /** + * Use for fixed left aside menu, to show menu on mouseenter event. + * @param e Event + */ + mouseEnter(e: Event) { + // check if the left aside menu is fixed + if (document.body.classList.contains('kt-aside--fixed')) { + if (this.outsideTm) { + clearTimeout(this.outsideTm); + this.outsideTm = null; + } + + this.insideTm = setTimeout(() => { + // if the left aside menu is minimized + if (document.body.classList.contains('kt-aside--minimize') && KTUtil.isInResponsiveRange('desktop')) { + // show the left aside menu + this.render.removeClass(document.body, 'kt-aside--minimize'); + this.render.addClass(document.body, 'kt-aside--minimize-hover'); + } + }, 50); + } + } + + /** + * Use for fixed left aside menu, to show menu on mouseenter event. + * @param e Event + */ + mouseLeave(e: Event) { + if (document.body.classList.contains('kt-aside--fixed')) { + if (this.insideTm) { + clearTimeout(this.insideTm); + this.insideTm = null; + } + + this.outsideTm = setTimeout(() => { + // if the left aside menu is expand + if (document.body.classList.contains('kt-aside--minimize-hover') && KTUtil.isInResponsiveRange('desktop')) { + // hide back the left aside menu + this.render.removeClass(document.body, 'kt-aside--minimize-hover'); + this.render.addClass(document.body, 'kt-aside--minimize'); + } + }, 100); + } + } + + /** + * Returns Submenu CSS Class Name + * @param item: any + */ + getItemCssClasses(item) { + let classes = 'kt-menu__item'; + + if (objectPath.get(item, 'submenu')) { + classes += ' kt-menu__item--submenu'; + } + + if (!item.submenu && this.isMenuItemIsActive(item)) { + classes += ' kt-menu__item--active kt-menu__item--here'; + } + + if (item.submenu && this.isMenuItemIsActive(item)) { + classes += ' kt-menu__item--open kt-menu__item--here'; + } + + // custom class for menu item + const customClass = objectPath.get(item, 'custom-class'); + if (customClass) { + classes += ' ' + customClass; + } + + if (objectPath.get(item, 'icon-only')) { + classes += ' kt-menu__item--icon-only'; + } + + return classes; + } + + getItemAttrSubmenuToggle(item) { + let toggle = 'hover'; + if (objectPath.get(item, 'toggle') === 'click') { + toggle = 'click'; + } else if (objectPath.get(item, 'submenu.type') === 'tabs') { + toggle = 'tabs'; + } else { + // submenu toggle default to 'hover' + } + + return toggle; + } +} diff --git a/src/app/views/theme/base/base.component.html b/src/app/views/theme/base/base.component.html new file mode 100644 index 0000000..dd37f25 --- /dev/null +++ b/src/app/views/theme/base/base.component.html @@ -0,0 +1,50 @@ + + + + + + +
    + +
    + + + + + + + +
    + + + + + +
    + + + + + +
    + +
    + +
    + + + +
    +
    + + + + + +
    +
    + + + + + diff --git a/src/app/views/theme/base/base.component.scss b/src/app/views/theme/base/base.component.scss new file mode 100644 index 0000000..d42bb60 --- /dev/null +++ b/src/app/views/theme/base/base.component.scss @@ -0,0 +1,15 @@ +kt-base { + opacity: 0; + height: 100%; + + .kt-grid--root { + height: 100%; + } +} + +.kt-page--loaded { + kt-base { + opacity: 1; + transition: opacity 1s ease-in-out; + } +} diff --git a/src/app/views/theme/base/base.component.ts b/src/app/views/theme/base/base.component.ts new file mode 100644 index 0000000..517e88a --- /dev/null +++ b/src/app/views/theme/base/base.component.ts @@ -0,0 +1,120 @@ +// Angular +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +// RxJS +import { Observable, Subscription } from 'rxjs'; +// Object-Path +import * as objectPath from 'object-path'; +// Layout +import { LayoutConfigService, MenuConfigService, PageConfigService } from '../../../core/_base/layout'; +import { HtmlClassService } from '../html-class.service'; +import { LayoutConfig } from '../../../core/_config/layout.config'; +import { MenuConfig } from '../../../core/_config/menu.config'; +import { PageConfig } from '../../../core/_config/page.config'; +// User permissions +import { NgxPermissionsService } from 'ngx-permissions'; +import { currentUserPermissions, Permission } from '../../../core/auth'; +import { select, Store } from '@ngrx/store'; +import { AppState } from '../../../core/reducers'; + +@Component({ + selector: 'kt-base', + templateUrl: './base.component.html', + styleUrls: ['./base.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class BaseComponent implements OnInit, OnDestroy { + // Public variables + selfLayout: string; + asideDisplay: boolean; + asideSecondary: boolean; + subheaderDisplay: boolean; + fluid: boolean; + + // Private properties + private unsubscribe: Subscription[] = []; // Read more: => https://brianflove.com/2016/12/11/anguar-2-unsubscribe-observables/ + private currentUserPermissions$: Observable; + + + /** + * Component constructor + * + * @param layoutConfigService: LayoutConfigService + * @param menuConfigService: MenuConfifService + * @param pageConfigService: PageConfigService + * @param htmlClassService: HtmlClassService + * @param store + * @param permissionsService + */ + constructor( + private layoutConfigService: LayoutConfigService, + private menuConfigService: MenuConfigService, + private pageConfigService: PageConfigService, + private htmlClassService: HtmlClassService, + private store: Store, + private permissionsService: NgxPermissionsService) { + this.loadRolesWithPermissions(); + + // register configs by demos + this.layoutConfigService.loadConfigs(new LayoutConfig().configs); + this.menuConfigService.loadConfigs(new MenuConfig().configs); + this.pageConfigService.loadConfigs(new PageConfig().configs); + + // setup element classes + this.htmlClassService.setConfig(this.layoutConfigService.getConfig()); + + const subscr = this.layoutConfigService.onConfigUpdated$.subscribe(layoutConfig => { + // reset body class based on global and page level layout config, refer to html-class.service.ts + document.body.className = ''; + this.htmlClassService.setConfig(layoutConfig); + }); + this.unsubscribe.push(subscr); + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit(): void { + const config = this.layoutConfigService.getConfig(); + this.selfLayout = objectPath.get(config, 'self.layout'); + this.asideDisplay = objectPath.get(config, 'aside.self.display'); + this.asideSecondary = objectPath.get(config, 'aside-secondary.self.display'); + this.subheaderDisplay = objectPath.get(config, 'subheader.display'); + this.fluid = objectPath.get(config, 'content.width') === 'fluid'; + + // let the layout type change + const subscr = this.layoutConfigService.onConfigUpdated$.subscribe(cfg => { + setTimeout(() => { + this.selfLayout = objectPath.get(cfg, 'self.layout'); + }); + }); + this.unsubscribe.push(subscr); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + this.unsubscribe.forEach(sb => sb.unsubscribe()); + } + + /** + * NGX Permissions, init roles + */ + loadRolesWithPermissions() { + this.currentUserPermissions$ = this.store.pipe(select(currentUserPermissions)); + + const subscr = this.currentUserPermissions$.subscribe(res => { + if (!res || res.length === 0) { + return; + } + + this.permissionsService.flushPermissions(); + res.forEach((pm: Permission) => this.permissionsService.addPermission(pm.name)); + }); + this.unsubscribe.push(subscr); + } +} diff --git a/src/app/views/theme/brand/brand.component.html b/src/app/views/theme/brand/brand.component.html new file mode 100644 index 0000000..8176838 --- /dev/null +++ b/src/app/views/theme/brand/brand.component.html @@ -0,0 +1,9 @@ + +
    + +
    + diff --git a/src/app/views/theme/brand/brand.component.ts b/src/app/views/theme/brand/brand.component.ts new file mode 100644 index 0000000..61f4ce8 --- /dev/null +++ b/src/app/views/theme/brand/brand.component.ts @@ -0,0 +1,48 @@ +// Angular +import { AfterViewInit, Component, OnInit } from '@angular/core'; +// Layout +import { LayoutConfigService, ToggleOptions } from '../../../core/_base/layout'; +import { HtmlClassService } from '../html-class.service'; + +@Component({ + selector: 'kt-brand', + templateUrl: './brand.component.html', +}) +export class BrandComponent implements OnInit, AfterViewInit { + // Public properties + headerLogo: string; + headerStickyLogo: string; + + toggleOptions: ToggleOptions = { + target: 'body', + targetState: 'kt-aside--minimize', + togglerState: 'kt-aside__brand-aside-toggler--active' + }; + + /** + * Component constructor + * + * @param layoutConfigService: LayoutConfigService + * @param htmlClassService: HtmlClassService + */ + constructor(private layoutConfigService: LayoutConfigService, public htmlClassService: HtmlClassService) { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit(): void { + this.headerLogo = this.layoutConfigService.getLogo(); + this.headerStickyLogo = this.layoutConfigService.getStickyLogo(); + } + + /** + * On after view init + */ + ngAfterViewInit(): void { + } +} diff --git a/src/app/views/theme/content/builder/builder.component.html b/src/app/views/theme/content/builder/builder.component.html new file mode 100644 index 0000000..e4d676d --- /dev/null +++ b/src/app/views/theme/content/builder/builder.component.html @@ -0,0 +1,267 @@ + + The layout builder helps to configure the layout with preferred options and preview it in real time. + The configured layout options will be saved until you change or reset them. + To use the layout builder choose the layout options and click the Preview button to preview the changes. + + +
    + + + + + + + + + + +
    +
    +
    + +
    + +
    Select page loading indicator
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    + +
    + + + +
    Enable fixed header for desktop mode
    +
    +
    +
    + +
    + + + +
    Enable fixed header for mobile mode
    +
    +
    + +
    + +
    + +
    + + + +
    Display header menu
    +
    +
    +
    + +
    + + + +
    Enable header menu root link arrows
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    + +
    + + + +
    Display subheader
    +
    +
    +
    + +
    + +
    Select subheader layout
    +
    +
    +
    + +
    + +
    Select layout width type.
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    + +
    + +
    Select layout width type.
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    + +
    + + + +
    Display aside menu
    +
    +
    +
    + +
    + + + +
    Set fixed aside layout
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    + +
    + +
    Select layout width type.
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + +   + +
    +
    +
    +
    +
    +
    + + + + + +
    +
    +
    +
    +
    diff --git a/src/app/views/theme/content/builder/builder.component.scss b/src/app/views/theme/content/builder/builder.component.scss new file mode 100644 index 0000000..05307a6 --- /dev/null +++ b/src/app/views/theme/content/builder/builder.component.scss @@ -0,0 +1,7 @@ +:host { + ::ng-deep { + ngb-tabset > .nav-tabs { + display: none; + } + } +} diff --git a/src/app/views/theme/content/builder/builder.component.ts b/src/app/views/theme/content/builder/builder.component.ts new file mode 100644 index 0000000..bcd88a6 --- /dev/null +++ b/src/app/views/theme/content/builder/builder.component.ts @@ -0,0 +1,56 @@ +// Angular +import { Component, OnInit, ViewChild } from '@angular/core'; +import { NgForm } from '@angular/forms'; +// Layout +import { LayoutConfigModel, LayoutConfigService } from '../../../../core/_base/layout'; + +@Component({ + selector: 'kt-builder', + templateUrl: './builder.component.html', + styleUrls: ['./builder.component.scss'] +}) +export class BuilderComponent implements OnInit { + // Public properties + model: LayoutConfigModel; + @ViewChild('form', {static: true}) form: NgForm; + + /** + * Component constructor + * + * @param layoutConfigService: LayoutConfigService + */ + constructor(private layoutConfigService: LayoutConfigService) { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit(): void { + this.model = this.layoutConfigService.getConfig(); + } + + /** + * Reset preview + * + * @param e: Event + */ + resetPreview(e: Event): void { + e.preventDefault(); + this.layoutConfigService.resetConfig(); + location.reload(); + } + + /** + * Submit preview + * + * @param e: Event + */ + submitPreview(e: Event): void { + this.layoutConfigService.setConfig(this.model, true); + location.reload(); + } +} diff --git a/src/app/views/theme/content/builder/builder.module.ts b/src/app/views/theme/content/builder/builder.module.ts new file mode 100644 index 0000000..3ea818c --- /dev/null +++ b/src/app/views/theme/content/builder/builder.module.ts @@ -0,0 +1,43 @@ +// Angular +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; +import { FormsModule } from '@angular/forms'; +import { MatTabsModule } from '@angular/material'; +// NgBootstrap +import { NgbTabsetModule } from '@ng-bootstrap/ng-bootstrap'; +// Perfect Scrollbar +import { PerfectScrollbarModule } from 'ngx-perfect-scrollbar'; +// Partials +import { PartialsModule } from '../../../partials/partials.module'; +// Highlight JS +import { HighlightModule } from 'ngx-highlightjs'; +// CoreModule +import { CoreModule } from '../../../../core/core.module'; +// Builder component +import { BuilderComponent } from './builder.component'; + +@NgModule({ + imports: [ + CommonModule, + PartialsModule, + FormsModule, + MatTabsModule, + CoreModule, + PerfectScrollbarModule, + HighlightModule, + RouterModule.forChild([ + { + path: '', + component: BuilderComponent + } + ]), + + // ng-bootstrap modules + NgbTabsetModule, + ], + providers: [], + declarations: [BuilderComponent] +}) +export class BuilderModule { +} diff --git a/src/app/views/theme/content/error-page/error-page.component.html b/src/app/views/theme/content/error-page/error-page.component.html new file mode 100644 index 0000000..a8381c0 --- /dev/null +++ b/src/app/views/theme/content/error-page/error-page.component.html @@ -0,0 +1,8 @@ + diff --git a/src/app/views/theme/content/error-page/error-page.component.scss b/src/app/views/theme/content/error-page/error-page.component.scss new file mode 100644 index 0000000..d44182c --- /dev/null +++ b/src/app/views/theme/content/error-page/error-page.component.scss @@ -0,0 +1,6 @@ +@import "sass/pages/error/error-1"; +@import "sass/pages/error/error-2"; +@import "sass/pages/error/error-3"; +@import "sass/pages/error/error-4"; +@import "sass/pages/error/error-5"; +@import "sass/pages/error/error-6"; diff --git a/src/app/views/theme/content/error-page/error-page.component.ts b/src/app/views/theme/content/error-page/error-page.component.ts new file mode 100644 index 0000000..d2c283c --- /dev/null +++ b/src/app/views/theme/content/error-page/error-page.component.ts @@ -0,0 +1,175 @@ +// Angular +import { Component, Input, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +// RXJS +import { Subscription } from 'rxjs'; +// Layout +import { LayoutConfigService } from '../../../../core/_base/layout'; + +@Component({ + selector: 'kt-error-page', + templateUrl: './error-page.component.html', + styleUrls: ['./error-page.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class ErrorPageComponent implements OnInit, OnDestroy { + // Public properties + // type of error template to be used, accepted values; error-v1 | error-v2 | error-v3 | error-v4 | error-v5 | error-v6 + @Input() type = 'error-v1'; + // full background image + @Input() image: string; + // error code, some error types template has it + @Input() code = '404'; + // error title + @Input() title: string; + // error subtitle, some error types template has it + @Input() subtitle: string; + // error descriptions + @Input() desc = 'Oops! Something went wrong!'; + // return back button title + @Input() return = 'Return back'; + + private sub: Subscription; + + /** + * Component constructor + * + * @param route: ActivatedRoute + * @param layoutConfigService: LayoutConfigService + */ + constructor(private route: ActivatedRoute, private layoutConfigService: LayoutConfigService) { + // set temporary values to the layout config on this page + this.layoutConfigService.setConfig({self: {layout: 'blank'}}); + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + this.type = this.route.snapshot.paramMap.get('type'); + this.sub = this.route.data.subscribe(param => { + if (param.type) { + this.type = param.type; + } + if (param.image) { + this.image = param.image; + } + if (param.code) { + this.code = param.code; + } + if (param.title) { + this.title = param.title; + } + if (param.subtitle) { + this.subtitle = param.subtitle; + } + if (param.desc) { + this.desc = param.desc; + } + if (param.return) { + this.return = param.return; + } + }); + + switch (this.type) { + case 'error-v1': + if (!this.image) { + this.image = './assets/media/error/bg1.jpg'; + } + if (!this.code) { + this.code = '404'; + } + if (!this.desc) { + this.desc = 'OOPS! Something went wrong here'; + } + break; + case 'error-v2': + if (!this.image) { + this.image = './assets/media/error/bg2.jpg'; + } + if (!this.code) { + this.code = '404'; + } + if (!this.title) { + this.title = 'OOPS!'; + } + if (!this.desc) { + this.desc = 'Something went wrong here'; + } + break; + case 'error-v3': + if (!this.code) { + this.code = '404'; + } + if (!this.title) { + this.title = 'How did you get here'; + } + if (!this.subtitle) { + this.subtitle = 'Sorry we can\'t seem to find the page you\'re looking for.'; + } + if (!this.desc) { + this.desc = 'There may be amisspelling in the URL entered,
    ' + 'or the page you are looking for may no longer exist.'; + } + if (!this.image) { + this.image = './assets/media/error/bg3.jpg'; + } + break; + case 'error-v4': + if (!this.code) { + this.code = '404'; + } + if (!this.title) { + this.title = 'ERROR'; + } + if (!this.desc) { + this.desc = 'Nothing left to do here'; + } + if (!this.image) { + this.image = './assets/media/error/bg4.jpg'; + } + break; + case 'error-v5': + if (!this.title) { + this.title = 'Oops!'; + } + if (!this.subtitle) { + this.subtitle = 'Something went wrong here'; + } + if (!this.desc) { + this.desc = 'We\'re working on it and we\'ll get it fixed
    ' + 'as soon possible.
    ' + 'You can back or use our Help Center.'; + } + if (!this.image) { + this.image = './assets/media/error/bg5.jpg'; + } + break; + case 'error-v6': + if (!this.title) { + this.title = 'Oops...'; + } + if (!this.desc) { + this.desc = 'Looks like something went wrong.
    ' + 'We\'re working on it'; + } + if (!this.image) { + this.image = './assets/media/error/bg6.jpg'; + } + break; + default: + if (!this.image) { + this.image = './assets/media/error/bg1.jpg'; + } + } + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // reset config from any temporary values + this.layoutConfigService.reloadConfigs(); + this.sub.unsubscribe(); + } +} diff --git a/src/app/views/theme/footer/footer.component.html b/src/app/views/theme/footer/footer.component.html new file mode 100644 index 0000000..9fb023e --- /dev/null +++ b/src/app/views/theme/footer/footer.component.html @@ -0,0 +1,9 @@ + + + diff --git a/src/app/views/theme/footer/footer.component.ts b/src/app/views/theme/footer/footer.component.ts new file mode 100644 index 0000000..df350b8 --- /dev/null +++ b/src/app/views/theme/footer/footer.component.ts @@ -0,0 +1,38 @@ +// Angular +import { Component, OnInit } from '@angular/core'; +// Layout +import { LayoutConfigService } from '../../../core/_base/layout'; +// Object-Path +import * as objectPath from 'object-path'; + +@Component({ + selector: 'kt-footer', + templateUrl: './footer.component.html', +}) +export class FooterComponent implements OnInit { + // Public properties + today: number = Date.now(); + fluid: boolean; + + /** + * Component constructor + * + * @param layoutConfigService: LayouConfigService + */ + constructor(private layoutConfigService: LayoutConfigService) { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit(): void { + const config = this.layoutConfigService.getConfig(); + + // footer width fluid + this.fluid = objectPath.get(config, 'footer.self.width') === 'fluid'; + } +} diff --git a/src/app/views/theme/header/header-mobile/header-mobile.component.html b/src/app/views/theme/header/header-mobile/header-mobile.component.html new file mode 100644 index 0000000..4e1bd49 --- /dev/null +++ b/src/app/views/theme/header/header-mobile/header-mobile.component.html @@ -0,0 +1,13 @@ + +
    + +
    + + +
    +
    + diff --git a/src/app/views/theme/header/header-mobile/header-mobile.component.scss b/src/app/views/theme/header/header-mobile/header-mobile.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/theme/header/header-mobile/header-mobile.component.ts b/src/app/views/theme/header/header-mobile/header-mobile.component.ts new file mode 100644 index 0000000..6a41acd --- /dev/null +++ b/src/app/views/theme/header/header-mobile/header-mobile.component.ts @@ -0,0 +1,41 @@ +// Angular +import { Component, OnInit } from '@angular/core'; +// Layout +import { LayoutConfigService, ToggleOptions } from '../../../../core/_base/layout'; + +@Component({ + selector: 'kt-header-mobile', + templateUrl: './header-mobile.component.html', + styleUrls: ['./header-mobile.component.scss'] +}) +export class HeaderMobileComponent implements OnInit { + // Public properties + headerLogo: string; + asideDisplay: boolean; + + toggleOptions: ToggleOptions = { + target: 'body', + targetState: 'kt-header__topbar--mobile-on', + togglerState: 'kt-header-mobile__toolbar-topbar-toggler--active' + }; + + /** + * Component constructor + * + * @param layoutConfigService: LayoutConfigService + */ + constructor(private layoutConfigService: LayoutConfigService) { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit() { + this.headerLogo = this.layoutConfigService.getLogo(); + this.asideDisplay = this.layoutConfigService.getConfig('aside.self.display'); + } +} diff --git a/src/app/views/theme/header/header.component.html b/src/app/views/theme/header/header.component.html new file mode 100644 index 0000000..fb40175 --- /dev/null +++ b/src/app/views/theme/header/header.component.html @@ -0,0 +1,25 @@ + +
    + + + + + + + +

    + logo +

    + + + + + + + + +
    + + +
    + diff --git a/src/app/views/theme/header/header.component.scss b/src/app/views/theme/header/header.component.scss new file mode 100644 index 0000000..0065da6 --- /dev/null +++ b/src/app/views/theme/header/header.component.scss @@ -0,0 +1,26 @@ +:host { + ::ng-deep { + .kt-loading-bar { + position: absolute; + top: 0; + left: 0; + right: 0; + width: 100%; + + .progress-bar { + background-color: #3d4aed; + } + } + + .kt-header__topbar-item { + height: 100%; + } + + @media (min-width: 1025px) { + .kt-header__topbar, .kt-header__topbar-item-wrapper { + height: 100%; + } + } + } +} + diff --git a/src/app/views/theme/header/header.component.ts b/src/app/views/theme/header/header.component.ts new file mode 100644 index 0000000..cf4bdac --- /dev/null +++ b/src/app/views/theme/header/header.component.ts @@ -0,0 +1,95 @@ +// Angular +import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import { + NavigationCancel, + NavigationEnd, + NavigationStart, + RouteConfigLoadEnd, + RouteConfigLoadStart, + Router +} from '@angular/router'; +// Object-Path +import * as objectPath from 'object-path'; +// Loading bar +import { LoadingBarService } from '@ngx-loading-bar/core'; +// Layout +import { LayoutConfigService, LayoutRefService } from '../../../core/_base/layout'; +// HTML Class Service +import { HtmlClassService } from '../html-class.service'; + + +@Component({ + selector: 'kt-header', + templateUrl: './header.component.html', + styleUrls: ['./header.component.scss'], +}) +export class HeaderComponent implements OnInit, AfterViewInit { + // Public properties + menuHeaderDisplay: boolean; + fluid: boolean; + + @ViewChild('ktHeader', {static: true}) ktHeader: ElementRef; + + /** + * Component constructor + * + * @param router: Router + * @param layoutRefService: LayoutRefService + * @param layoutConfigService: LayoutConfigService + * @param loader: LoadingBarService + * @param htmlClassService: HtmlClassService + */ + constructor( + private router: Router, + private layoutRefService: LayoutRefService, + private layoutConfigService: LayoutConfigService, + public loader: LoadingBarService, + public htmlClassService: HtmlClassService + ) { + // page progress bar percentage + this.router.events.subscribe(event => { + if (event instanceof NavigationStart) { + // set page progress bar loading to start on NavigationStart event router + this.loader.start(); + } + if (event instanceof RouteConfigLoadStart) { + this.loader.increment(35); + } + if (event instanceof RouteConfigLoadEnd) { + this.loader.increment(75); + } + if (event instanceof NavigationEnd || event instanceof NavigationCancel) { + // set page progress bar loading to end on NavigationEnd event router + this.loader.complete(); + } + }); + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit(): void { + const config = this.layoutConfigService.getConfig(); + + // get menu header display option + this.menuHeaderDisplay = objectPath.get(config, 'header.menu.self.display'); + + // header width fluid + this.fluid = objectPath.get(config, 'header.self.width') === 'fluid'; + + // animate the header minimize the height on scroll down + if (objectPath.get(config, 'header.self.fixed.desktop.enabled') || objectPath.get(config, 'header.self.fixed.desktop')) { + // header minimize on scroll down + this.ktHeader.nativeElement.setAttribute('data-ktheader-minimize', '1'); + } + } + + ngAfterViewInit(): void { + // keep header element in the service + this.layoutRefService.addElement('header', this.ktHeader.nativeElement); + } +} diff --git a/src/app/views/theme/header/menu-horizontal/menu-horizontal.component.html b/src/app/views/theme/header/menu-horizontal/menu-horizontal.component.html new file mode 100644 index 0000000..1809418 --- /dev/null +++ b/src/app/views/theme/header/menu-horizontal/menu-horizontal.component.html @@ -0,0 +1,126 @@ + + +
    +
    +
      + + + +
    +
    +
    + + + + +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
      + + + + +
    + +
      + + + + +
    + +
    +
      + + + +
    +
    + +
    +
    +
  • +
    + + + + + + + + + + + + + + + + + + + + + {{item.title}} + + + + + + {{item.title}} + + {{item.badge.value}} + + + + + + +
  • +

    + + {{item.heading.title}} + + +

    + +
      + + + + +
    +
    +
  • +
    diff --git a/src/app/views/theme/header/menu-horizontal/menu-horizontal.component.scss b/src/app/views/theme/header/menu-horizontal/menu-horizontal.component.scss new file mode 100644 index 0000000..eb2c41f --- /dev/null +++ b/src/app/views/theme/header/menu-horizontal/menu-horizontal.component.scss @@ -0,0 +1,7 @@ +:host { + width: 100%; + + .kt-header-menu-wrapper { + height: 100%; + } +} diff --git a/src/app/views/theme/header/menu-horizontal/menu-horizontal.component.ts b/src/app/views/theme/header/menu-horizontal/menu-horizontal.component.ts new file mode 100644 index 0000000..2824b61 --- /dev/null +++ b/src/app/views/theme/header/menu-horizontal/menu-horizontal.component.ts @@ -0,0 +1,252 @@ +// Angular +import { + AfterViewInit, + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + ElementRef, + OnInit, + Renderer2 +} from '@angular/core'; +import { NavigationEnd, Router } from '@angular/router'; +// RxJS +import { filter } from 'rxjs/operators'; +// Object-Path +import * as objectPath from 'object-path'; +// Layout +import { + LayoutConfigService, + MenuConfigService, + MenuHorizontalService, + MenuOptions, + OffcanvasOptions +} from '../../../../core/_base/layout'; +// HTML Class +import { HtmlClassService } from '../../html-class.service'; + +@Component({ + selector: 'kt-menu-horizontal', + templateUrl: './menu-horizontal.component.html', + styleUrls: ['./menu-horizontal.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class MenuHorizontalComponent implements OnInit, AfterViewInit { + // Public properties + currentRouteUrl: any = ''; + + rootArrowEnabled: boolean; + + menuOptions: MenuOptions = { + submenu: { + desktop: 'dropdown', + tablet: 'accordion', + mobile: 'accordion' + }, + accordion: { + slideSpeed: 200, // accordion toggle slide speed in milliseconds + expandAll: false // allow having multiple expanded accordions in the menu + }, + dropdown: { + timeout: 50 + } + }; + + offcanvasOptions: OffcanvasOptions = { + overlay: true, + baseClass: 'kt-header-menu-wrapper', + closeBy: 'kt_header_menu_mobile_close_btn', + toggleBy: { + target: 'kt_header_mobile_toggler', + state: 'kt-header-mobile__toolbar-toggler--active' + } + }; + + /** + * Component Conctructor + * + * @param el: ElementRef + * @param htmlClassService: HtmlClassService + * @param menuHorService: MenuHorService + * @param menuConfigService: MenuConfigService + * @param layoutConfigService: LayouConfigService + * @param router: Router + * @param render: Renderer2 + * @param cdr: ChangeDetectorRef + */ + constructor( + private el: ElementRef, + public htmlClassService: HtmlClassService, + public menuHorService: MenuHorizontalService, + private menuConfigService: MenuConfigService, + private layoutConfigService: LayoutConfigService, + private router: Router, + private render: Renderer2, + private cdr: ChangeDetectorRef + ) { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * After view init + */ + ngAfterViewInit(): void { + } + + /** + * On init + */ + ngOnInit(): void { + this.rootArrowEnabled = this.layoutConfigService.getConfig('header.menu.self.root-arrow'); + + this.currentRouteUrl = this.router.url; + this.router.events + .pipe(filter(event => event instanceof NavigationEnd)) + .subscribe(event => { + this.currentRouteUrl = this.router.url; + this.cdr.markForCheck(); + }); + } + + /** + * Return Css Class Name + * @param item: any + */ + getItemCssClasses(item) { + let classes = 'kt-menu__item'; + + if (objectPath.get(item, 'submenu')) { + classes += ' kt-menu__item--submenu'; + } + + if (!item.submenu && this.isMenuItemIsActive(item)) { + classes += ' kt-menu__item--active kt-menu__item--here'; + } + + if (item.submenu && this.isMenuItemIsActive(item)) { + classes += ' kt-menu__item--open kt-menu__item--here'; + } + + if (objectPath.get(item, 'resizer')) { + classes += ' kt-menu__item--resize'; + } + + const menuType = objectPath.get(item, 'submenu.type') || 'classic'; + if ((objectPath.get(item, 'root') && menuType === 'classic') + || parseInt(objectPath.get(item, 'submenu.width'), 10) > 0) { + classes += ' kt-menu__item--rel'; + } + + const customClass = objectPath.get(item, 'custom-class'); + if (customClass) { + classes += ' ' + customClass; + } + + if (objectPath.get(item, 'icon-only')) { + classes += ' kt-menu__item--icon-only'; + } + + return classes; + } + + /** + * Returns Attribute SubMenu Toggle + * @param item: any + */ + getItemAttrSubmenuToggle(item) { + let toggle = 'hover'; + if (objectPath.get(item, 'toggle') === 'click') { + toggle = 'click'; + } else if (objectPath.get(item, 'submenu.type') === 'tabs') { + toggle = 'tabs'; + } else { + // submenu toggle default to 'hover' + } + + return toggle; + } + + /** + * Returns Submenu CSS Class Name + * @param item: any + */ + getItemMenuSubmenuClass(item) { + let classes = ''; + + const alignment = objectPath.get(item, 'alignment') || 'right'; + + if (alignment) { + classes += ' kt-menu__submenu--' + alignment; + } + + const type = objectPath.get(item, 'type') || 'classic'; + if (type === 'classic') { + classes += ' kt-menu__submenu--classic'; + } + if (type === 'tabs') { + classes += ' kt-menu__submenu--tabs'; + } + if (type === 'mega') { + if (objectPath.get(item, 'width')) { + classes += ' kt-menu__submenu--fixed'; + } + } + + if (objectPath.get(item, 'pull')) { + classes += ' kt-menu__submenu--pull'; + } + + return classes; + } + + /** + * Check Menu is active + * @param item: any + */ + isMenuItemIsActive(item): boolean { + if (item.submenu) { + return this.isMenuRootItemIsActive(item); + } + + if (!item.page) { + return false; + } + + return this.currentRouteUrl.indexOf(item.page) !== -1; + } + + /** + * Check Menu Root Item is active + * @param item: any + */ + isMenuRootItemIsActive(item): boolean { + if (item.submenu.items) { + for (const subItem of item.submenu.items) { + if (this.isMenuItemIsActive(subItem)) { + return true; + } + } + } + + if (item.submenu.columns) { + for (const subItem of item.submenu.columns) { + if (this.isMenuItemIsActive(subItem)) { + return true; + } + } + } + + if (typeof item.submenu[Symbol.iterator] === 'function') { + for (const subItem of item.submenu) { + const active = this.isMenuItemIsActive(subItem); + if (active) { + return true; + } + } + } + + return false; + } +} diff --git a/src/app/views/theme/header/topbar/topbar.component.html b/src/app/views/theme/header/topbar/topbar.component.html new file mode 100644 index 0000000..7251c4f --- /dev/null +++ b/src/app/views/theme/header/topbar/topbar.component.html @@ -0,0 +1,29 @@ + +
    + + + + + + + + + +
    + diff --git a/src/app/views/theme/header/topbar/topbar.component.scss b/src/app/views/theme/header/topbar/topbar.component.scss new file mode 100644 index 0000000..025563b --- /dev/null +++ b/src/app/views/theme/header/topbar/topbar.component.scss @@ -0,0 +1,15 @@ +:host { + ::ng-deep { + // override default version style + .kt-header__topbar { + > :last-child:not([role="tooltip"]) { + .kt-header__topbar-item { + margin-right: 0 !important; + } + } + .kt-header__topbar-item { + margin-right: 0.36rem !important; + } + } + } +} diff --git a/src/app/views/theme/header/topbar/topbar.component.ts b/src/app/views/theme/header/topbar/topbar.component.ts new file mode 100644 index 0000000..88dfd61 --- /dev/null +++ b/src/app/views/theme/header/topbar/topbar.component.ts @@ -0,0 +1,9 @@ +// Angular +import { Component } from '@angular/core'; + +@Component({ + selector: 'kt-topbar', + templateUrl: './topbar.component.html', + styleUrls: ['./topbar.component.scss'], +}) +export class TopbarComponent { } diff --git a/src/app/views/theme/html-class.service.ts b/src/app/views/theme/html-class.service.ts new file mode 100644 index 0000000..2462d69 --- /dev/null +++ b/src/app/views/theme/html-class.service.ts @@ -0,0 +1,189 @@ +// Angular +import { Injectable } from '@angular/core'; +// Object-Path +import * as objectPath from 'object-path'; +// RxJS +import { BehaviorSubject } from 'rxjs'; +// Layout +import { LayoutConfigModel } from '../../core/_base/layout'; + +export interface ClassType { + header: string[]; + header_mobile: string[]; + header_menu: string[]; + aside_menu: string[]; +} + +@Injectable() +export class HtmlClassService { + // Public properties + config: LayoutConfigModel; + classes: ClassType; + onClassesUpdated$: BehaviorSubject; + // Private properties + private loaded: string[] = []; + + /** + * Component constructor + */ + constructor() { + this.onClassesUpdated$ = new BehaviorSubject(this.classes); + } + + /** + * Build html element classes from layout config + * @param layoutConfig + */ + setConfig(layoutConfig: LayoutConfigModel) { + this.config = layoutConfig; + + // scope list of classes + this.classes = { + header: [], + header_mobile: [], + header_menu: [], + aside_menu: [], + }; + + // init base layout + this.initLayout(); + this.initLoader(); + + // init header and subheader menu + this.initHeader(); + this.initSubheader(); + + // init aside and aside menu + this.initAside(); + + // init footer + this.initFooter(); + + this.onClassesUpdated$.next(this.classes); + } + + /** + * Returns Classes + * + * @param path: string + * @param toString boolean + */ + getClasses(path?: string, toString?: boolean): ClassType | string[] | string { + if (path) { + const classes = objectPath.get(this.classes, path) || ''; + if (toString && Array.isArray(classes)) { + return classes.join(' '); + } + return classes.toString(); + } + return this.classes; + } + + /** + * Init Layout + */ + private initLayout() { + if (objectPath.has(this.config, 'self.body.class')) { + const selfBodyClass = (objectPath.get(this.config, 'self.body.class')).toString(); + if (selfBodyClass) { + const bodyClasses: string[] = selfBodyClass.split(' '); + bodyClasses.forEach(cssClass => document.body.classList.add(cssClass)); + } + } + if (objectPath.get(this.config, 'self.layout') === 'boxed' && objectPath.has(this.config, 'self.body.background-image')) { + document.body.style.backgroundImage = 'url("' + objectPath.get(this.config, 'self.body.background-image') + '")'; + } + + // Offcanvas directions + document.body.classList.add('kt-quick-panel--right'); + document.body.classList.add('kt-demo-panel--right'); + document.body.classList.add('kt-offcanvas-panel--right'); + } + + /** + * Init Loader + */ + private initLoader() { + } + + /** + * Init Header + */ + private initHeader() { + // Fixed header + if (objectPath.get(this.config, 'header.self.fixed.desktop')) { + document.body.classList.add('kt-header--fixed'); + objectPath.push(this.classes, 'header', 'kt-header--fixed'); + } else { + document.body.classList.add('kt-header--static'); + } + + if (objectPath.get(this.config, 'header.self.fixed.mobile')) { + document.body.classList.add('kt-header-mobile--fixed'); + objectPath.push(this.classes, 'header_mobile', 'kt-header-mobile--fixed'); + } + + if (objectPath.get(this.config, 'header.menu.self.layout')) { + objectPath.push(this.classes, 'header_menu', 'kt-header-menu--layout-' + objectPath.get(this.config, 'header.menu.self.layout')); + } + } + + /** + * Inin Subheader + */ + private initSubheader() { + // Fixed content head + if (objectPath.get(this.config, 'subheader.fixed')) { + document.body.classList.add('kt-subheader--fixed'); + } + + if (objectPath.get(this.config, 'subheader.display')) { + document.body.classList.add('kt-subheader--enabled'); + } + + if (objectPath.has(this.config, 'subheader.style')) { + document.body.classList.add('kt-subheader--' + objectPath.get(this.config, 'subheader.style')); + } + } + + /** + * Init Aside + */ + private initAside() { + if (objectPath.get(this.config, 'aside.self.display') !== true) { + return; + } + + document.body.classList.add('kt-aside--enabled'); + + // Fixed Aside + if (objectPath.get(this.config, 'aside.self.fixed')) { + document.body.classList.add('kt-aside--fixed'); + objectPath.push(this.classes, 'aside', 'kt-aside--fixed'); + } else { + document.body.classList.add('kt-aside--static'); + } + + // Default fixed + if (objectPath.get(this.config, 'aside.self.minimize.default')) { + document.body.classList.add('kt-aside--minimize'); + } + + // Menu + // Dropdown Submenu + if (objectPath.get(this.config, 'aside.menu.dropdown')) { + objectPath.push(this.classes, 'aside_menu', 'kt-aside-menu--dropdown'); + // enable menu dropdown + } + } + + /** + * Init Footer + */ + private initFooter() { + // Fixed header + if (objectPath.get(this.config, 'footer.self.fixed')) { + document.body.classList.add('kt-footer--fixed'); + } + } +} diff --git a/src/app/views/theme/subheader/subheader.component.html b/src/app/views/theme/subheader/subheader.component.html new file mode 100644 index 0000000..a689001 --- /dev/null +++ b/src/app/views/theme/subheader/subheader.component.html @@ -0,0 +1,4 @@ + + + + diff --git a/src/app/views/theme/subheader/subheader.component.ts b/src/app/views/theme/subheader/subheader.component.ts new file mode 100644 index 0000000..c588782 --- /dev/null +++ b/src/app/views/theme/subheader/subheader.component.ts @@ -0,0 +1,41 @@ +// Angular +import { Component, OnInit } from '@angular/core'; +// Layout +import { LayoutConfigService } from '../../../core/_base/layout'; +// Object-Path +import * as objectPath from 'object-path'; + +@Component({ + selector: 'kt-subheader', + templateUrl: './subheader.component.html', +}) +export class SubheaderComponent implements OnInit { + // Public properties + // subheader layout + layout: string; + fluid: boolean; + clear: boolean; + + /** + * Component constructor + * + * @param layoutConfigService: LayoutConfigService + */ + constructor(private layoutConfigService: LayoutConfigService) { + } + + /** + * @ Lifecycle sequences => https://angular.io/guide/lifecycle-hooks + */ + + /** + * On init + */ + ngOnInit(): void { + const config = this.layoutConfigService.getConfig(); + + this.layout = objectPath.get(config, 'subheader.layout'); + this.fluid = objectPath.get(config, 'footer.self.width') === 'fluid'; + this.clear = objectPath.get(config, 'subheader.clear'); + } +} diff --git a/src/app/views/theme/theme.module.ts b/src/app/views/theme/theme.module.ts new file mode 100644 index 0000000..9d95a2b --- /dev/null +++ b/src/app/views/theme/theme.module.ts @@ -0,0 +1,116 @@ +import { NgxPermissionsModule } from 'ngx-permissions'; +// Angular +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; +import { FormsModule } from '@angular/forms'; +// Angular Material +import { MatButtonModule, MatProgressBarModule, MatTabsModule, MatTooltipModule } from '@angular/material'; +// NgBootstrap +import { NgbProgressbarModule, NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap'; +// Translation +import { TranslateModule } from '@ngx-translate/core'; +// Loading bar +import { LoadingBarModule } from '@ngx-loading-bar/core'; +// NGRX +import { StoreModule } from '@ngrx/store'; +import { EffectsModule } from '@ngrx/effects'; +// Ngx DatePicker +// Perfect Scrollbar +import { PerfectScrollbarModule } from 'ngx-perfect-scrollbar'; +// SVG inline +import { InlineSVGModule } from 'ng-inline-svg'; +// Core Module +import { CoreModule } from '../../core/core.module'; +import { HeaderComponent } from './header/header.component'; +import { AsideLeftComponent } from './aside/aside-left.component'; +import { FooterComponent } from './footer/footer.component'; +import { SubheaderComponent } from './subheader/subheader.component'; +import { BrandComponent } from './brand/brand.component'; +import { TopbarComponent } from './header/topbar/topbar.component'; +import { MenuHorizontalComponent } from './header/menu-horizontal/menu-horizontal.component'; +import { PartialsModule } from '../partials/partials.module'; +import { BaseComponent } from './base/base.component'; +import { PagesModule } from '../pages/pages.module'; +import { HtmlClassService } from './html-class.service'; +import { HeaderMobileComponent } from './header/header-mobile/header-mobile.component'; +import { ErrorPageComponent } from './content/error-page/error-page.component'; +import { PermissionEffects, permissionsReducer, RoleEffects, rolesReducer } from '../../core/auth'; + +@NgModule({ + declarations: [ + BaseComponent, + FooterComponent, + + // headers + HeaderComponent, + BrandComponent, + HeaderMobileComponent, + + // subheader + SubheaderComponent, + + // topbar components + TopbarComponent, + + // aside left menu components + AsideLeftComponent, + + // horizontal menu components + MenuHorizontalComponent, + + ErrorPageComponent, + ], + exports: [ + BaseComponent, + FooterComponent, + + // headers + HeaderComponent, + BrandComponent, + HeaderMobileComponent, + + // subheader + SubheaderComponent, + + // topbar components + TopbarComponent, + + // aside left menu components + AsideLeftComponent, + + // horizontal menu components + MenuHorizontalComponent, + + ErrorPageComponent, + ], + providers: [ + HtmlClassService, + ], + imports: [ + CommonModule, + RouterModule, + NgxPermissionsModule.forChild(), + StoreModule.forFeature('roles', rolesReducer), + StoreModule.forFeature('permissions', permissionsReducer), + //EffectsModule.forFeature([PermissionEffects, RoleEffects]), + PagesModule, + PartialsModule, + CoreModule, + PerfectScrollbarModule, + FormsModule, + MatProgressBarModule, + MatTabsModule, + MatButtonModule, + MatTooltipModule, + TranslateModule.forChild(), + LoadingBarModule, + InlineSVGModule, + + // ng-bootstrap modules + NgbProgressbarModule, + NgbTooltipModule, + ] +}) +export class ThemeModule { +} diff --git a/src/assets/fa/HELP-US-OUT.txt b/src/assets/fa/HELP-US-OUT.txt new file mode 100644 index 0000000..83d083d --- /dev/null +++ b/src/assets/fa/HELP-US-OUT.txt @@ -0,0 +1,7 @@ +I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project, +Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome, +comprehensive icon sets or copy and paste your own. + +Please. Check it out. + +-Dave Gandy diff --git a/src/assets/fa/css/font-awesome.css b/src/assets/fa/css/font-awesome.css new file mode 100644 index 0000000..ee906a8 --- /dev/null +++ b/src/assets/fa/css/font-awesome.css @@ -0,0 +1,2337 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('../fonts/fontawesome-webfont.eot?v=4.7.0'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.33333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.28571429em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: 0.14285714em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.85714286em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.fa-pull-left { + float: left; +} +.fa-pull-right { + float: right; +} +.fa.fa-pull-left { + margin-right: .3em; +} +.fa.fa-pull-right { + margin-left: .3em; +} +/* Deprecated as of 4.4.0 */ +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.fa.pull-right { + margin-left: .3em; +} +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + filter: none; +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook-f:before, +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-feed:before, +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-desc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-asc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before, +.fa-gratipay:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} +.fa-space-shuttle:before { + content: "\f197"; +} +.fa-slack:before { + content: "\f198"; +} +.fa-envelope-square:before { + content: "\f199"; +} +.fa-wordpress:before { + content: "\f19a"; +} +.fa-openid:before { + content: "\f19b"; +} +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: "\f19c"; +} +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: "\f19d"; +} +.fa-yahoo:before { + content: "\f19e"; +} +.fa-google:before { + content: "\f1a0"; +} +.fa-reddit:before { + content: "\f1a1"; +} +.fa-reddit-square:before { + content: "\f1a2"; +} +.fa-stumbleupon-circle:before { + content: "\f1a3"; +} +.fa-stumbleupon:before { + content: "\f1a4"; +} +.fa-delicious:before { + content: "\f1a5"; +} +.fa-digg:before { + content: "\f1a6"; +} +.fa-pied-piper-pp:before { + content: "\f1a7"; +} +.fa-pied-piper-alt:before { + content: "\f1a8"; +} +.fa-drupal:before { + content: "\f1a9"; +} +.fa-joomla:before { + content: "\f1aa"; +} +.fa-language:before { + content: "\f1ab"; +} +.fa-fax:before { + content: "\f1ac"; +} +.fa-building:before { + content: "\f1ad"; +} +.fa-child:before { + content: "\f1ae"; +} +.fa-paw:before { + content: "\f1b0"; +} +.fa-spoon:before { + content: "\f1b1"; +} +.fa-cube:before { + content: "\f1b2"; +} +.fa-cubes:before { + content: "\f1b3"; +} +.fa-behance:before { + content: "\f1b4"; +} +.fa-behance-square:before { + content: "\f1b5"; +} +.fa-steam:before { + content: "\f1b6"; +} +.fa-steam-square:before { + content: "\f1b7"; +} +.fa-recycle:before { + content: "\f1b8"; +} +.fa-automobile:before, +.fa-car:before { + content: "\f1b9"; +} +.fa-cab:before, +.fa-taxi:before { + content: "\f1ba"; +} +.fa-tree:before { + content: "\f1bb"; +} +.fa-spotify:before { + content: "\f1bc"; +} +.fa-deviantart:before { + content: "\f1bd"; +} +.fa-soundcloud:before { + content: "\f1be"; +} +.fa-database:before { + content: "\f1c0"; +} +.fa-file-pdf-o:before { + content: "\f1c1"; +} +.fa-file-word-o:before { + content: "\f1c2"; +} +.fa-file-excel-o:before { + content: "\f1c3"; +} +.fa-file-powerpoint-o:before { + content: "\f1c4"; +} +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: "\f1c5"; +} +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: "\f1c6"; +} +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: "\f1c7"; +} +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: "\f1c8"; +} +.fa-file-code-o:before { + content: "\f1c9"; +} +.fa-vine:before { + content: "\f1ca"; +} +.fa-codepen:before { + content: "\f1cb"; +} +.fa-jsfiddle:before { + content: "\f1cc"; +} +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: "\f1cd"; +} +.fa-circle-o-notch:before { + content: "\f1ce"; +} +.fa-ra:before, +.fa-resistance:before, +.fa-rebel:before { + content: "\f1d0"; +} +.fa-ge:before, +.fa-empire:before { + content: "\f1d1"; +} +.fa-git-square:before { + content: "\f1d2"; +} +.fa-git:before { + content: "\f1d3"; +} +.fa-y-combinator-square:before, +.fa-yc-square:before, +.fa-hacker-news:before { + content: "\f1d4"; +} +.fa-tencent-weibo:before { + content: "\f1d5"; +} +.fa-qq:before { + content: "\f1d6"; +} +.fa-wechat:before, +.fa-weixin:before { + content: "\f1d7"; +} +.fa-send:before, +.fa-paper-plane:before { + content: "\f1d8"; +} +.fa-send-o:before, +.fa-paper-plane-o:before { + content: "\f1d9"; +} +.fa-history:before { + content: "\f1da"; +} +.fa-circle-thin:before { + content: "\f1db"; +} +.fa-header:before { + content: "\f1dc"; +} +.fa-paragraph:before { + content: "\f1dd"; +} +.fa-sliders:before { + content: "\f1de"; +} +.fa-share-alt:before { + content: "\f1e0"; +} +.fa-share-alt-square:before { + content: "\f1e1"; +} +.fa-bomb:before { + content: "\f1e2"; +} +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: "\f1e3"; +} +.fa-tty:before { + content: "\f1e4"; +} +.fa-binoculars:before { + content: "\f1e5"; +} +.fa-plug:before { + content: "\f1e6"; +} +.fa-slideshare:before { + content: "\f1e7"; +} +.fa-twitch:before { + content: "\f1e8"; +} +.fa-yelp:before { + content: "\f1e9"; +} +.fa-newspaper-o:before { + content: "\f1ea"; +} +.fa-wifi:before { + content: "\f1eb"; +} +.fa-calculator:before { + content: "\f1ec"; +} +.fa-paypal:before { + content: "\f1ed"; +} +.fa-google-wallet:before { + content: "\f1ee"; +} +.fa-cc-visa:before { + content: "\f1f0"; +} +.fa-cc-mastercard:before { + content: "\f1f1"; +} +.fa-cc-discover:before { + content: "\f1f2"; +} +.fa-cc-amex:before { + content: "\f1f3"; +} +.fa-cc-paypal:before { + content: "\f1f4"; +} +.fa-cc-stripe:before { + content: "\f1f5"; +} +.fa-bell-slash:before { + content: "\f1f6"; +} +.fa-bell-slash-o:before { + content: "\f1f7"; +} +.fa-trash:before { + content: "\f1f8"; +} +.fa-copyright:before { + content: "\f1f9"; +} +.fa-at:before { + content: "\f1fa"; +} +.fa-eyedropper:before { + content: "\f1fb"; +} +.fa-paint-brush:before { + content: "\f1fc"; +} +.fa-birthday-cake:before { + content: "\f1fd"; +} +.fa-area-chart:before { + content: "\f1fe"; +} +.fa-pie-chart:before { + content: "\f200"; +} +.fa-line-chart:before { + content: "\f201"; +} +.fa-lastfm:before { + content: "\f202"; +} +.fa-lastfm-square:before { + content: "\f203"; +} +.fa-toggle-off:before { + content: "\f204"; +} +.fa-toggle-on:before { + content: "\f205"; +} +.fa-bicycle:before { + content: "\f206"; +} +.fa-bus:before { + content: "\f207"; +} +.fa-ioxhost:before { + content: "\f208"; +} +.fa-angellist:before { + content: "\f209"; +} +.fa-cc:before { + content: "\f20a"; +} +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: "\f20b"; +} +.fa-meanpath:before { + content: "\f20c"; +} +.fa-buysellads:before { + content: "\f20d"; +} +.fa-connectdevelop:before { + content: "\f20e"; +} +.fa-dashcube:before { + content: "\f210"; +} +.fa-forumbee:before { + content: "\f211"; +} +.fa-leanpub:before { + content: "\f212"; +} +.fa-sellsy:before { + content: "\f213"; +} +.fa-shirtsinbulk:before { + content: "\f214"; +} +.fa-simplybuilt:before { + content: "\f215"; +} +.fa-skyatlas:before { + content: "\f216"; +} +.fa-cart-plus:before { + content: "\f217"; +} +.fa-cart-arrow-down:before { + content: "\f218"; +} +.fa-diamond:before { + content: "\f219"; +} +.fa-ship:before { + content: "\f21a"; +} +.fa-user-secret:before { + content: "\f21b"; +} +.fa-motorcycle:before { + content: "\f21c"; +} +.fa-street-view:before { + content: "\f21d"; +} +.fa-heartbeat:before { + content: "\f21e"; +} +.fa-venus:before { + content: "\f221"; +} +.fa-mars:before { + content: "\f222"; +} +.fa-mercury:before { + content: "\f223"; +} +.fa-intersex:before, +.fa-transgender:before { + content: "\f224"; +} +.fa-transgender-alt:before { + content: "\f225"; +} +.fa-venus-double:before { + content: "\f226"; +} +.fa-mars-double:before { + content: "\f227"; +} +.fa-venus-mars:before { + content: "\f228"; +} +.fa-mars-stroke:before { + content: "\f229"; +} +.fa-mars-stroke-v:before { + content: "\f22a"; +} +.fa-mars-stroke-h:before { + content: "\f22b"; +} +.fa-neuter:before { + content: "\f22c"; +} +.fa-genderless:before { + content: "\f22d"; +} +.fa-facebook-official:before { + content: "\f230"; +} +.fa-pinterest-p:before { + content: "\f231"; +} +.fa-whatsapp:before { + content: "\f232"; +} +.fa-server:before { + content: "\f233"; +} +.fa-user-plus:before { + content: "\f234"; +} +.fa-user-times:before { + content: "\f235"; +} +.fa-hotel:before, +.fa-bed:before { + content: "\f236"; +} +.fa-viacoin:before { + content: "\f237"; +} +.fa-train:before { + content: "\f238"; +} +.fa-subway:before { + content: "\f239"; +} +.fa-medium:before { + content: "\f23a"; +} +.fa-yc:before, +.fa-y-combinator:before { + content: "\f23b"; +} +.fa-optin-monster:before { + content: "\f23c"; +} +.fa-opencart:before { + content: "\f23d"; +} +.fa-expeditedssl:before { + content: "\f23e"; +} +.fa-battery-4:before, +.fa-battery:before, +.fa-battery-full:before { + content: "\f240"; +} +.fa-battery-3:before, +.fa-battery-three-quarters:before { + content: "\f241"; +} +.fa-battery-2:before, +.fa-battery-half:before { + content: "\f242"; +} +.fa-battery-1:before, +.fa-battery-quarter:before { + content: "\f243"; +} +.fa-battery-0:before, +.fa-battery-empty:before { + content: "\f244"; +} +.fa-mouse-pointer:before { + content: "\f245"; +} +.fa-i-cursor:before { + content: "\f246"; +} +.fa-object-group:before { + content: "\f247"; +} +.fa-object-ungroup:before { + content: "\f248"; +} +.fa-sticky-note:before { + content: "\f249"; +} +.fa-sticky-note-o:before { + content: "\f24a"; +} +.fa-cc-jcb:before { + content: "\f24b"; +} +.fa-cc-diners-club:before { + content: "\f24c"; +} +.fa-clone:before { + content: "\f24d"; +} +.fa-balance-scale:before { + content: "\f24e"; +} +.fa-hourglass-o:before { + content: "\f250"; +} +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: "\f251"; +} +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: "\f252"; +} +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: "\f253"; +} +.fa-hourglass:before { + content: "\f254"; +} +.fa-hand-grab-o:before, +.fa-hand-rock-o:before { + content: "\f255"; +} +.fa-hand-stop-o:before, +.fa-hand-paper-o:before { + content: "\f256"; +} +.fa-hand-scissors-o:before { + content: "\f257"; +} +.fa-hand-lizard-o:before { + content: "\f258"; +} +.fa-hand-spock-o:before { + content: "\f259"; +} +.fa-hand-pointer-o:before { + content: "\f25a"; +} +.fa-hand-peace-o:before { + content: "\f25b"; +} +.fa-trademark:before { + content: "\f25c"; +} +.fa-registered:before { + content: "\f25d"; +} +.fa-creative-commons:before { + content: "\f25e"; +} +.fa-gg:before { + content: "\f260"; +} +.fa-gg-circle:before { + content: "\f261"; +} +.fa-tripadvisor:before { + content: "\f262"; +} +.fa-odnoklassniki:before { + content: "\f263"; +} +.fa-odnoklassniki-square:before { + content: "\f264"; +} +.fa-get-pocket:before { + content: "\f265"; +} +.fa-wikipedia-w:before { + content: "\f266"; +} +.fa-safari:before { + content: "\f267"; +} +.fa-chrome:before { + content: "\f268"; +} +.fa-firefox:before { + content: "\f269"; +} +.fa-opera:before { + content: "\f26a"; +} +.fa-internet-explorer:before { + content: "\f26b"; +} +.fa-tv:before, +.fa-television:before { + content: "\f26c"; +} +.fa-contao:before { + content: "\f26d"; +} +.fa-500px:before { + content: "\f26e"; +} +.fa-amazon:before { + content: "\f270"; +} +.fa-calendar-plus-o:before { + content: "\f271"; +} +.fa-calendar-minus-o:before { + content: "\f272"; +} +.fa-calendar-times-o:before { + content: "\f273"; +} +.fa-calendar-check-o:before { + content: "\f274"; +} +.fa-industry:before { + content: "\f275"; +} +.fa-map-pin:before { + content: "\f276"; +} +.fa-map-signs:before { + content: "\f277"; +} +.fa-map-o:before { + content: "\f278"; +} +.fa-map:before { + content: "\f279"; +} +.fa-commenting:before { + content: "\f27a"; +} +.fa-commenting-o:before { + content: "\f27b"; +} +.fa-houzz:before { + content: "\f27c"; +} +.fa-vimeo:before { + content: "\f27d"; +} +.fa-black-tie:before { + content: "\f27e"; +} +.fa-fonticons:before { + content: "\f280"; +} +.fa-reddit-alien:before { + content: "\f281"; +} +.fa-edge:before { + content: "\f282"; +} +.fa-credit-card-alt:before { + content: "\f283"; +} +.fa-codiepie:before { + content: "\f284"; +} +.fa-modx:before { + content: "\f285"; +} +.fa-fort-awesome:before { + content: "\f286"; +} +.fa-usb:before { + content: "\f287"; +} +.fa-product-hunt:before { + content: "\f288"; +} +.fa-mixcloud:before { + content: "\f289"; +} +.fa-scribd:before { + content: "\f28a"; +} +.fa-pause-circle:before { + content: "\f28b"; +} +.fa-pause-circle-o:before { + content: "\f28c"; +} +.fa-stop-circle:before { + content: "\f28d"; +} +.fa-stop-circle-o:before { + content: "\f28e"; +} +.fa-shopping-bag:before { + content: "\f290"; +} +.fa-shopping-basket:before { + content: "\f291"; +} +.fa-hashtag:before { + content: "\f292"; +} +.fa-bluetooth:before { + content: "\f293"; +} +.fa-bluetooth-b:before { + content: "\f294"; +} +.fa-percent:before { + content: "\f295"; +} +.fa-gitlab:before { + content: "\f296"; +} +.fa-wpbeginner:before { + content: "\f297"; +} +.fa-wpforms:before { + content: "\f298"; +} +.fa-envira:before { + content: "\f299"; +} +.fa-universal-access:before { + content: "\f29a"; +} +.fa-wheelchair-alt:before { + content: "\f29b"; +} +.fa-question-circle-o:before { + content: "\f29c"; +} +.fa-blind:before { + content: "\f29d"; +} +.fa-audio-description:before { + content: "\f29e"; +} +.fa-volume-control-phone:before { + content: "\f2a0"; +} +.fa-braille:before { + content: "\f2a1"; +} +.fa-assistive-listening-systems:before { + content: "\f2a2"; +} +.fa-asl-interpreting:before, +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; +} +.fa-deafness:before, +.fa-hard-of-hearing:before, +.fa-deaf:before { + content: "\f2a4"; +} +.fa-glide:before { + content: "\f2a5"; +} +.fa-glide-g:before { + content: "\f2a6"; +} +.fa-signing:before, +.fa-sign-language:before { + content: "\f2a7"; +} +.fa-low-vision:before { + content: "\f2a8"; +} +.fa-viadeo:before { + content: "\f2a9"; +} +.fa-viadeo-square:before { + content: "\f2aa"; +} +.fa-snapchat:before { + content: "\f2ab"; +} +.fa-snapchat-ghost:before { + content: "\f2ac"; +} +.fa-snapchat-square:before { + content: "\f2ad"; +} +.fa-pied-piper:before { + content: "\f2ae"; +} +.fa-first-order:before { + content: "\f2b0"; +} +.fa-yoast:before { + content: "\f2b1"; +} +.fa-themeisle:before { + content: "\f2b2"; +} +.fa-google-plus-circle:before, +.fa-google-plus-official:before { + content: "\f2b3"; +} +.fa-fa:before, +.fa-font-awesome:before { + content: "\f2b4"; +} +.fa-handshake-o:before { + content: "\f2b5"; +} +.fa-envelope-open:before { + content: "\f2b6"; +} +.fa-envelope-open-o:before { + content: "\f2b7"; +} +.fa-linode:before { + content: "\f2b8"; +} +.fa-address-book:before { + content: "\f2b9"; +} +.fa-address-book-o:before { + content: "\f2ba"; +} +.fa-vcard:before, +.fa-address-card:before { + content: "\f2bb"; +} +.fa-vcard-o:before, +.fa-address-card-o:before { + content: "\f2bc"; +} +.fa-user-circle:before { + content: "\f2bd"; +} +.fa-user-circle-o:before { + content: "\f2be"; +} +.fa-user-o:before { + content: "\f2c0"; +} +.fa-id-badge:before { + content: "\f2c1"; +} +.fa-drivers-license:before, +.fa-id-card:before { + content: "\f2c2"; +} +.fa-drivers-license-o:before, +.fa-id-card-o:before { + content: "\f2c3"; +} +.fa-quora:before { + content: "\f2c4"; +} +.fa-free-code-camp:before { + content: "\f2c5"; +} +.fa-telegram:before { + content: "\f2c6"; +} +.fa-thermometer-4:before, +.fa-thermometer:before, +.fa-thermometer-full:before { + content: "\f2c7"; +} +.fa-thermometer-3:before, +.fa-thermometer-three-quarters:before { + content: "\f2c8"; +} +.fa-thermometer-2:before, +.fa-thermometer-half:before { + content: "\f2c9"; +} +.fa-thermometer-1:before, +.fa-thermometer-quarter:before { + content: "\f2ca"; +} +.fa-thermometer-0:before, +.fa-thermometer-empty:before { + content: "\f2cb"; +} +.fa-shower:before { + content: "\f2cc"; +} +.fa-bathtub:before, +.fa-s15:before, +.fa-bath:before { + content: "\f2cd"; +} +.fa-podcast:before { + content: "\f2ce"; +} +.fa-window-maximize:before { + content: "\f2d0"; +} +.fa-window-minimize:before { + content: "\f2d1"; +} +.fa-window-restore:before { + content: "\f2d2"; +} +.fa-times-rectangle:before, +.fa-window-close:before { + content: "\f2d3"; +} +.fa-times-rectangle-o:before, +.fa-window-close-o:before { + content: "\f2d4"; +} +.fa-bandcamp:before { + content: "\f2d5"; +} +.fa-grav:before { + content: "\f2d6"; +} +.fa-etsy:before { + content: "\f2d7"; +} +.fa-imdb:before { + content: "\f2d8"; +} +.fa-ravelry:before { + content: "\f2d9"; +} +.fa-eercast:before { + content: "\f2da"; +} +.fa-microchip:before { + content: "\f2db"; +} +.fa-snowflake-o:before { + content: "\f2dc"; +} +.fa-superpowers:before { + content: "\f2dd"; +} +.fa-wpexplorer:before { + content: "\f2de"; +} +.fa-meetup:before { + content: "\f2e0"; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} diff --git a/src/assets/fa/css/font-awesome.min.css b/src/assets/fa/css/font-awesome.min.css new file mode 100644 index 0000000..540440c --- /dev/null +++ b/src/assets/fa/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/src/assets/fa/fonts/FontAwesome.otf b/src/assets/fa/fonts/FontAwesome.otf new file mode 100644 index 0000000..401ec0f Binary files /dev/null and b/src/assets/fa/fonts/FontAwesome.otf differ diff --git a/src/assets/fa/fonts/fontawesome-webfont.eot b/src/assets/fa/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..e9f60ca Binary files /dev/null and b/src/assets/fa/fonts/fontawesome-webfont.eot differ diff --git a/src/assets/fa/fonts/fontawesome-webfont.svg b/src/assets/fa/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..855c845 --- /dev/null +++ b/src/assets/fa/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/fa/fonts/fontawesome-webfont.ttf b/src/assets/fa/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..35acda2 Binary files /dev/null and b/src/assets/fa/fonts/fontawesome-webfont.ttf differ diff --git a/src/assets/fa/fonts/fontawesome-webfont.woff b/src/assets/fa/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..400014a Binary files /dev/null and b/src/assets/fa/fonts/fontawesome-webfont.woff differ diff --git a/src/assets/fa/fonts/fontawesome-webfont.woff2 b/src/assets/fa/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000..4d13fc6 Binary files /dev/null and b/src/assets/fa/fonts/fontawesome-webfont.woff2 differ diff --git a/src/assets/fa/less/animated.less b/src/assets/fa/less/animated.less new file mode 100644 index 0000000..66ad52a --- /dev/null +++ b/src/assets/fa/less/animated.less @@ -0,0 +1,34 @@ +// Animated Icons +// -------------------------- + +.@{fa-css-prefix}-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +.@{fa-css-prefix}-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} diff --git a/src/assets/fa/less/bordered-pulled.less b/src/assets/fa/less/bordered-pulled.less new file mode 100644 index 0000000..f1c8ad7 --- /dev/null +++ b/src/assets/fa/less/bordered-pulled.less @@ -0,0 +1,25 @@ +// Bordered & Pulled +// ------------------------- + +.@{fa-css-prefix}-border { + padding: .2em .25em .15em; + border: solid .08em @fa-border-color; + border-radius: .1em; +} + +.@{fa-css-prefix}-pull-left { float: left; } +.@{fa-css-prefix}-pull-right { float: right; } + +.@{fa-css-prefix} { + &.@{fa-css-prefix}-pull-left { margin-right: .3em; } + &.@{fa-css-prefix}-pull-right { margin-left: .3em; } +} + +/* Deprecated as of 4.4.0 */ +.pull-right { float: right; } +.pull-left { float: left; } + +.@{fa-css-prefix} { + &.pull-left { margin-right: .3em; } + &.pull-right { margin-left: .3em; } +} diff --git a/src/assets/fa/less/core.less b/src/assets/fa/less/core.less new file mode 100644 index 0000000..c577ac8 --- /dev/null +++ b/src/assets/fa/less/core.less @@ -0,0 +1,12 @@ +// Base Class Definition +// ------------------------- + +.@{fa-css-prefix} { + display: inline-block; + font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} diff --git a/src/assets/fa/less/fixed-width.less b/src/assets/fa/less/fixed-width.less new file mode 100644 index 0000000..110289f --- /dev/null +++ b/src/assets/fa/less/fixed-width.less @@ -0,0 +1,6 @@ +// Fixed Width Icons +// ------------------------- +.@{fa-css-prefix}-fw { + width: (18em / 14); + text-align: center; +} diff --git a/src/assets/fa/less/font-awesome.less b/src/assets/fa/less/font-awesome.less new file mode 100644 index 0000000..c3677de --- /dev/null +++ b/src/assets/fa/less/font-awesome.less @@ -0,0 +1,18 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables.less"; +@import "mixins.less"; +@import "path.less"; +@import "core.less"; +@import "larger.less"; +@import "fixed-width.less"; +@import "list.less"; +@import "bordered-pulled.less"; +@import "animated.less"; +@import "rotated-flipped.less"; +@import "stacked.less"; +@import "icons.less"; +@import "screen-reader.less"; diff --git a/src/assets/fa/less/icons.less b/src/assets/fa/less/icons.less new file mode 100644 index 0000000..159d600 --- /dev/null +++ b/src/assets/fa/less/icons.less @@ -0,0 +1,789 @@ +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + +.@{fa-css-prefix}-glass:before { content: @fa-var-glass; } +.@{fa-css-prefix}-music:before { content: @fa-var-music; } +.@{fa-css-prefix}-search:before { content: @fa-var-search; } +.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; } +.@{fa-css-prefix}-heart:before { content: @fa-var-heart; } +.@{fa-css-prefix}-star:before { content: @fa-var-star; } +.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; } +.@{fa-css-prefix}-user:before { content: @fa-var-user; } +.@{fa-css-prefix}-film:before { content: @fa-var-film; } +.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; } +.@{fa-css-prefix}-th:before { content: @fa-var-th; } +.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; } +.@{fa-css-prefix}-check:before { content: @fa-var-check; } +.@{fa-css-prefix}-remove:before, +.@{fa-css-prefix}-close:before, +.@{fa-css-prefix}-times:before { content: @fa-var-times; } +.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; } +.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; } +.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; } +.@{fa-css-prefix}-signal:before { content: @fa-var-signal; } +.@{fa-css-prefix}-gear:before, +.@{fa-css-prefix}-cog:before { content: @fa-var-cog; } +.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; } +.@{fa-css-prefix}-home:before { content: @fa-var-home; } +.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; } +.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; } +.@{fa-css-prefix}-road:before { content: @fa-var-road; } +.@{fa-css-prefix}-download:before { content: @fa-var-download; } +.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; } +.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; } +.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; } +.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; } +.@{fa-css-prefix}-rotate-right:before, +.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; } +.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; } +.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; } +.@{fa-css-prefix}-lock:before { content: @fa-var-lock; } +.@{fa-css-prefix}-flag:before { content: @fa-var-flag; } +.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; } +.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; } +.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; } +.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; } +.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; } +.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; } +.@{fa-css-prefix}-tag:before { content: @fa-var-tag; } +.@{fa-css-prefix}-tags:before { content: @fa-var-tags; } +.@{fa-css-prefix}-book:before { content: @fa-var-book; } +.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; } +.@{fa-css-prefix}-print:before { content: @fa-var-print; } +.@{fa-css-prefix}-camera:before { content: @fa-var-camera; } +.@{fa-css-prefix}-font:before { content: @fa-var-font; } +.@{fa-css-prefix}-bold:before { content: @fa-var-bold; } +.@{fa-css-prefix}-italic:before { content: @fa-var-italic; } +.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; } +.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; } +.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; } +.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; } +.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; } +.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; } +.@{fa-css-prefix}-list:before { content: @fa-var-list; } +.@{fa-css-prefix}-dedent:before, +.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; } +.@{fa-css-prefix}-indent:before { content: @fa-var-indent; } +.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; } +.@{fa-css-prefix}-photo:before, +.@{fa-css-prefix}-image:before, +.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; } +.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; } +.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; } +.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; } +.@{fa-css-prefix}-tint:before { content: @fa-var-tint; } +.@{fa-css-prefix}-edit:before, +.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; } +.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; } +.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; } +.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; } +.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; } +.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; } +.@{fa-css-prefix}-backward:before { content: @fa-var-backward; } +.@{fa-css-prefix}-play:before { content: @fa-var-play; } +.@{fa-css-prefix}-pause:before { content: @fa-var-pause; } +.@{fa-css-prefix}-stop:before { content: @fa-var-stop; } +.@{fa-css-prefix}-forward:before { content: @fa-var-forward; } +.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; } +.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; } +.@{fa-css-prefix}-eject:before { content: @fa-var-eject; } +.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; } +.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; } +.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; } +.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; } +.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; } +.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; } +.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; } +.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; } +.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; } +.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; } +.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; } +.@{fa-css-prefix}-ban:before { content: @fa-var-ban; } +.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; } +.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; } +.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; } +.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; } +.@{fa-css-prefix}-mail-forward:before, +.@{fa-css-prefix}-share:before { content: @fa-var-share; } +.@{fa-css-prefix}-expand:before { content: @fa-var-expand; } +.@{fa-css-prefix}-compress:before { content: @fa-var-compress; } +.@{fa-css-prefix}-plus:before { content: @fa-var-plus; } +.@{fa-css-prefix}-minus:before { content: @fa-var-minus; } +.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; } +.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; } +.@{fa-css-prefix}-gift:before { content: @fa-var-gift; } +.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; } +.@{fa-css-prefix}-fire:before { content: @fa-var-fire; } +.@{fa-css-prefix}-eye:before { content: @fa-var-eye; } +.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; } +.@{fa-css-prefix}-warning:before, +.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; } +.@{fa-css-prefix}-plane:before { content: @fa-var-plane; } +.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; } +.@{fa-css-prefix}-random:before { content: @fa-var-random; } +.@{fa-css-prefix}-comment:before { content: @fa-var-comment; } +.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; } +.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; } +.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; } +.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; } +.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; } +.@{fa-css-prefix}-folder:before { content: @fa-var-folder; } +.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; } +.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; } +.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; } +.@{fa-css-prefix}-bar-chart-o:before, +.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; } +.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; } +.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; } +.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; } +.@{fa-css-prefix}-key:before { content: @fa-var-key; } +.@{fa-css-prefix}-gears:before, +.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; } +.@{fa-css-prefix}-comments:before { content: @fa-var-comments; } +.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; } +.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; } +.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; } +.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; } +.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; } +.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; } +.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; } +.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; } +.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; } +.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; } +.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; } +.@{fa-css-prefix}-upload:before { content: @fa-var-upload; } +.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; } +.@{fa-css-prefix}-phone:before { content: @fa-var-phone; } +.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; } +.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; } +.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; } +.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; } +.@{fa-css-prefix}-facebook-f:before, +.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; } +.@{fa-css-prefix}-github:before { content: @fa-var-github; } +.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; } +.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; } +.@{fa-css-prefix}-feed:before, +.@{fa-css-prefix}-rss:before { content: @fa-var-rss; } +.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; } +.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; } +.@{fa-css-prefix}-bell:before { content: @fa-var-bell; } +.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; } +.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; } +.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; } +.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; } +.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; } +.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; } +.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; } +.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; } +.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; } +.@{fa-css-prefix}-globe:before { content: @fa-var-globe; } +.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; } +.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; } +.@{fa-css-prefix}-filter:before { content: @fa-var-filter; } +.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; } +.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; } +.@{fa-css-prefix}-group:before, +.@{fa-css-prefix}-users:before { content: @fa-var-users; } +.@{fa-css-prefix}-chain:before, +.@{fa-css-prefix}-link:before { content: @fa-var-link; } +.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; } +.@{fa-css-prefix}-flask:before { content: @fa-var-flask; } +.@{fa-css-prefix}-cut:before, +.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; } +.@{fa-css-prefix}-copy:before, +.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; } +.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; } +.@{fa-css-prefix}-save:before, +.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; } +.@{fa-css-prefix}-square:before { content: @fa-var-square; } +.@{fa-css-prefix}-navicon:before, +.@{fa-css-prefix}-reorder:before, +.@{fa-css-prefix}-bars:before { content: @fa-var-bars; } +.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; } +.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; } +.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; } +.@{fa-css-prefix}-underline:before { content: @fa-var-underline; } +.@{fa-css-prefix}-table:before { content: @fa-var-table; } +.@{fa-css-prefix}-magic:before { content: @fa-var-magic; } +.@{fa-css-prefix}-truck:before { content: @fa-var-truck; } +.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; } +.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; } +.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; } +.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; } +.@{fa-css-prefix}-money:before { content: @fa-var-money; } +.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; } +.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; } +.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; } +.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; } +.@{fa-css-prefix}-columns:before { content: @fa-var-columns; } +.@{fa-css-prefix}-unsorted:before, +.@{fa-css-prefix}-sort:before { content: @fa-var-sort; } +.@{fa-css-prefix}-sort-down:before, +.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; } +.@{fa-css-prefix}-sort-up:before, +.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; } +.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; } +.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; } +.@{fa-css-prefix}-rotate-left:before, +.@{fa-css-prefix}-undo:before { content: @fa-var-undo; } +.@{fa-css-prefix}-legal:before, +.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; } +.@{fa-css-prefix}-dashboard:before, +.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; } +.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; } +.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; } +.@{fa-css-prefix}-flash:before, +.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; } +.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; } +.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; } +.@{fa-css-prefix}-paste:before, +.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; } +.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; } +.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; } +.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; } +.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; } +.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; } +.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; } +.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; } +.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; } +.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; } +.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; } +.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; } +.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; } +.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; } +.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; } +.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; } +.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; } +.@{fa-css-prefix}-beer:before { content: @fa-var-beer; } +.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; } +.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; } +.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; } +.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; } +.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; } +.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; } +.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; } +.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; } +.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; } +.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; } +.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; } +.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; } +.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; } +.@{fa-css-prefix}-mobile-phone:before, +.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; } +.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; } +.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; } +.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; } +.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; } +.@{fa-css-prefix}-circle:before { content: @fa-var-circle; } +.@{fa-css-prefix}-mail-reply:before, +.@{fa-css-prefix}-reply:before { content: @fa-var-reply; } +.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; } +.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; } +.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; } +.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; } +.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; } +.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; } +.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; } +.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; } +.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; } +.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; } +.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; } +.@{fa-css-prefix}-code:before { content: @fa-var-code; } +.@{fa-css-prefix}-mail-reply-all:before, +.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; } +.@{fa-css-prefix}-star-half-empty:before, +.@{fa-css-prefix}-star-half-full:before, +.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; } +.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; } +.@{fa-css-prefix}-crop:before { content: @fa-var-crop; } +.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; } +.@{fa-css-prefix}-unlink:before, +.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; } +.@{fa-css-prefix}-question:before { content: @fa-var-question; } +.@{fa-css-prefix}-info:before { content: @fa-var-info; } +.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; } +.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; } +.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; } +.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; } +.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; } +.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; } +.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; } +.@{fa-css-prefix}-shield:before { content: @fa-var-shield; } +.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; } +.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; } +.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; } +.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; } +.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; } +.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; } +.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; } +.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; } +.@{fa-css-prefix}-html5:before { content: @fa-var-html5; } +.@{fa-css-prefix}-css3:before { content: @fa-var-css3; } +.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; } +.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; } +.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; } +.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; } +.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; } +.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; } +.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; } +.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; } +.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; } +.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; } +.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; } +.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; } +.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; } +.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; } +.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; } +.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; } +.@{fa-css-prefix}-compass:before { content: @fa-var-compass; } +.@{fa-css-prefix}-toggle-down:before, +.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; } +.@{fa-css-prefix}-toggle-up:before, +.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; } +.@{fa-css-prefix}-toggle-right:before, +.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; } +.@{fa-css-prefix}-euro:before, +.@{fa-css-prefix}-eur:before { content: @fa-var-eur; } +.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; } +.@{fa-css-prefix}-dollar:before, +.@{fa-css-prefix}-usd:before { content: @fa-var-usd; } +.@{fa-css-prefix}-rupee:before, +.@{fa-css-prefix}-inr:before { content: @fa-var-inr; } +.@{fa-css-prefix}-cny:before, +.@{fa-css-prefix}-rmb:before, +.@{fa-css-prefix}-yen:before, +.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; } +.@{fa-css-prefix}-ruble:before, +.@{fa-css-prefix}-rouble:before, +.@{fa-css-prefix}-rub:before { content: @fa-var-rub; } +.@{fa-css-prefix}-won:before, +.@{fa-css-prefix}-krw:before { content: @fa-var-krw; } +.@{fa-css-prefix}-bitcoin:before, +.@{fa-css-prefix}-btc:before { content: @fa-var-btc; } +.@{fa-css-prefix}-file:before { content: @fa-var-file; } +.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; } +.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; } +.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; } +.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; } +.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; } +.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; } +.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; } +.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; } +.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; } +.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; } +.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; } +.@{fa-css-prefix}-xing:before { content: @fa-var-xing; } +.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; } +.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; } +.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; } +.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; } +.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; } +.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; } +.@{fa-css-prefix}-adn:before { content: @fa-var-adn; } +.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; } +.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; } +.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; } +.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; } +.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; } +.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; } +.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; } +.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; } +.@{fa-css-prefix}-apple:before { content: @fa-var-apple; } +.@{fa-css-prefix}-windows:before { content: @fa-var-windows; } +.@{fa-css-prefix}-android:before { content: @fa-var-android; } +.@{fa-css-prefix}-linux:before { content: @fa-var-linux; } +.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; } +.@{fa-css-prefix}-skype:before { content: @fa-var-skype; } +.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; } +.@{fa-css-prefix}-trello:before { content: @fa-var-trello; } +.@{fa-css-prefix}-female:before { content: @fa-var-female; } +.@{fa-css-prefix}-male:before { content: @fa-var-male; } +.@{fa-css-prefix}-gittip:before, +.@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; } +.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; } +.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; } +.@{fa-css-prefix}-archive:before { content: @fa-var-archive; } +.@{fa-css-prefix}-bug:before { content: @fa-var-bug; } +.@{fa-css-prefix}-vk:before { content: @fa-var-vk; } +.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; } +.@{fa-css-prefix}-renren:before { content: @fa-var-renren; } +.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; } +.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; } +.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; } +.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; } +.@{fa-css-prefix}-toggle-left:before, +.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; } +.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; } +.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; } +.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; } +.@{fa-css-prefix}-turkish-lira:before, +.@{fa-css-prefix}-try:before { content: @fa-var-try; } +.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; } +.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; } +.@{fa-css-prefix}-slack:before { content: @fa-var-slack; } +.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; } +.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; } +.@{fa-css-prefix}-openid:before { content: @fa-var-openid; } +.@{fa-css-prefix}-institution:before, +.@{fa-css-prefix}-bank:before, +.@{fa-css-prefix}-university:before { content: @fa-var-university; } +.@{fa-css-prefix}-mortar-board:before, +.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; } +.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; } +.@{fa-css-prefix}-google:before { content: @fa-var-google; } +.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; } +.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; } +.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; } +.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; } +.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; } +.@{fa-css-prefix}-digg:before { content: @fa-var-digg; } +.@{fa-css-prefix}-pied-piper-pp:before { content: @fa-var-pied-piper-pp; } +.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; } +.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; } +.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; } +.@{fa-css-prefix}-language:before { content: @fa-var-language; } +.@{fa-css-prefix}-fax:before { content: @fa-var-fax; } +.@{fa-css-prefix}-building:before { content: @fa-var-building; } +.@{fa-css-prefix}-child:before { content: @fa-var-child; } +.@{fa-css-prefix}-paw:before { content: @fa-var-paw; } +.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; } +.@{fa-css-prefix}-cube:before { content: @fa-var-cube; } +.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; } +.@{fa-css-prefix}-behance:before { content: @fa-var-behance; } +.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; } +.@{fa-css-prefix}-steam:before { content: @fa-var-steam; } +.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; } +.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; } +.@{fa-css-prefix}-automobile:before, +.@{fa-css-prefix}-car:before { content: @fa-var-car; } +.@{fa-css-prefix}-cab:before, +.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; } +.@{fa-css-prefix}-tree:before { content: @fa-var-tree; } +.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; } +.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; } +.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; } +.@{fa-css-prefix}-database:before { content: @fa-var-database; } +.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; } +.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; } +.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; } +.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; } +.@{fa-css-prefix}-file-photo-o:before, +.@{fa-css-prefix}-file-picture-o:before, +.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; } +.@{fa-css-prefix}-file-zip-o:before, +.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; } +.@{fa-css-prefix}-file-sound-o:before, +.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; } +.@{fa-css-prefix}-file-movie-o:before, +.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; } +.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; } +.@{fa-css-prefix}-vine:before { content: @fa-var-vine; } +.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; } +.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; } +.@{fa-css-prefix}-life-bouy:before, +.@{fa-css-prefix}-life-buoy:before, +.@{fa-css-prefix}-life-saver:before, +.@{fa-css-prefix}-support:before, +.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; } +.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; } +.@{fa-css-prefix}-ra:before, +.@{fa-css-prefix}-resistance:before, +.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; } +.@{fa-css-prefix}-ge:before, +.@{fa-css-prefix}-empire:before { content: @fa-var-empire; } +.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; } +.@{fa-css-prefix}-git:before { content: @fa-var-git; } +.@{fa-css-prefix}-y-combinator-square:before, +.@{fa-css-prefix}-yc-square:before, +.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; } +.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; } +.@{fa-css-prefix}-qq:before { content: @fa-var-qq; } +.@{fa-css-prefix}-wechat:before, +.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; } +.@{fa-css-prefix}-send:before, +.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; } +.@{fa-css-prefix}-send-o:before, +.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; } +.@{fa-css-prefix}-history:before { content: @fa-var-history; } +.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; } +.@{fa-css-prefix}-header:before { content: @fa-var-header; } +.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; } +.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; } +.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; } +.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; } +.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; } +.@{fa-css-prefix}-soccer-ball-o:before, +.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; } +.@{fa-css-prefix}-tty:before { content: @fa-var-tty; } +.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; } +.@{fa-css-prefix}-plug:before { content: @fa-var-plug; } +.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; } +.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; } +.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; } +.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; } +.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; } +.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; } +.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; } +.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; } +.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; } +.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; } +.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; } +.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; } +.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; } +.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; } +.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; } +.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; } +.@{fa-css-prefix}-trash:before { content: @fa-var-trash; } +.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; } +.@{fa-css-prefix}-at:before { content: @fa-var-at; } +.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; } +.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; } +.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; } +.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; } +.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; } +.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; } +.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; } +.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; } +.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; } +.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; } +.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; } +.@{fa-css-prefix}-bus:before { content: @fa-var-bus; } +.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; } +.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; } +.@{fa-css-prefix}-cc:before { content: @fa-var-cc; } +.@{fa-css-prefix}-shekel:before, +.@{fa-css-prefix}-sheqel:before, +.@{fa-css-prefix}-ils:before { content: @fa-var-ils; } +.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; } +.@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; } +.@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; } +.@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; } +.@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; } +.@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; } +.@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; } +.@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; } +.@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; } +.@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; } +.@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; } +.@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; } +.@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; } +.@{fa-css-prefix}-ship:before { content: @fa-var-ship; } +.@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; } +.@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; } +.@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; } +.@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; } +.@{fa-css-prefix}-venus:before { content: @fa-var-venus; } +.@{fa-css-prefix}-mars:before { content: @fa-var-mars; } +.@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; } +.@{fa-css-prefix}-intersex:before, +.@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; } +.@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; } +.@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; } +.@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; } +.@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; } +.@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; } +.@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; } +.@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; } +.@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; } +.@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; } +.@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; } +.@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; } +.@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; } +.@{fa-css-prefix}-server:before { content: @fa-var-server; } +.@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; } +.@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; } +.@{fa-css-prefix}-hotel:before, +.@{fa-css-prefix}-bed:before { content: @fa-var-bed; } +.@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; } +.@{fa-css-prefix}-train:before { content: @fa-var-train; } +.@{fa-css-prefix}-subway:before { content: @fa-var-subway; } +.@{fa-css-prefix}-medium:before { content: @fa-var-medium; } +.@{fa-css-prefix}-yc:before, +.@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; } +.@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; } +.@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; } +.@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; } +.@{fa-css-prefix}-battery-4:before, +.@{fa-css-prefix}-battery:before, +.@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; } +.@{fa-css-prefix}-battery-3:before, +.@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; } +.@{fa-css-prefix}-battery-2:before, +.@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; } +.@{fa-css-prefix}-battery-1:before, +.@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; } +.@{fa-css-prefix}-battery-0:before, +.@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; } +.@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; } +.@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; } +.@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; } +.@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; } +.@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; } +.@{fa-css-prefix}-sticky-note-o:before { content: @fa-var-sticky-note-o; } +.@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; } +.@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; } +.@{fa-css-prefix}-clone:before { content: @fa-var-clone; } +.@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; } +.@{fa-css-prefix}-hourglass-o:before { content: @fa-var-hourglass-o; } +.@{fa-css-prefix}-hourglass-1:before, +.@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; } +.@{fa-css-prefix}-hourglass-2:before, +.@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; } +.@{fa-css-prefix}-hourglass-3:before, +.@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; } +.@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; } +.@{fa-css-prefix}-hand-grab-o:before, +.@{fa-css-prefix}-hand-rock-o:before { content: @fa-var-hand-rock-o; } +.@{fa-css-prefix}-hand-stop-o:before, +.@{fa-css-prefix}-hand-paper-o:before { content: @fa-var-hand-paper-o; } +.@{fa-css-prefix}-hand-scissors-o:before { content: @fa-var-hand-scissors-o; } +.@{fa-css-prefix}-hand-lizard-o:before { content: @fa-var-hand-lizard-o; } +.@{fa-css-prefix}-hand-spock-o:before { content: @fa-var-hand-spock-o; } +.@{fa-css-prefix}-hand-pointer-o:before { content: @fa-var-hand-pointer-o; } +.@{fa-css-prefix}-hand-peace-o:before { content: @fa-var-hand-peace-o; } +.@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; } +.@{fa-css-prefix}-registered:before { content: @fa-var-registered; } +.@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; } +.@{fa-css-prefix}-gg:before { content: @fa-var-gg; } +.@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; } +.@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; } +.@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; } +.@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; } +.@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; } +.@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; } +.@{fa-css-prefix}-safari:before { content: @fa-var-safari; } +.@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; } +.@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; } +.@{fa-css-prefix}-opera:before { content: @fa-var-opera; } +.@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; } +.@{fa-css-prefix}-tv:before, +.@{fa-css-prefix}-television:before { content: @fa-var-television; } +.@{fa-css-prefix}-contao:before { content: @fa-var-contao; } +.@{fa-css-prefix}-500px:before { content: @fa-var-500px; } +.@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; } +.@{fa-css-prefix}-calendar-plus-o:before { content: @fa-var-calendar-plus-o; } +.@{fa-css-prefix}-calendar-minus-o:before { content: @fa-var-calendar-minus-o; } +.@{fa-css-prefix}-calendar-times-o:before { content: @fa-var-calendar-times-o; } +.@{fa-css-prefix}-calendar-check-o:before { content: @fa-var-calendar-check-o; } +.@{fa-css-prefix}-industry:before { content: @fa-var-industry; } +.@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; } +.@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; } +.@{fa-css-prefix}-map-o:before { content: @fa-var-map-o; } +.@{fa-css-prefix}-map:before { content: @fa-var-map; } +.@{fa-css-prefix}-commenting:before { content: @fa-var-commenting; } +.@{fa-css-prefix}-commenting-o:before { content: @fa-var-commenting-o; } +.@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; } +.@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; } +.@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; } +.@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; } +.@{fa-css-prefix}-reddit-alien:before { content: @fa-var-reddit-alien; } +.@{fa-css-prefix}-edge:before { content: @fa-var-edge; } +.@{fa-css-prefix}-credit-card-alt:before { content: @fa-var-credit-card-alt; } +.@{fa-css-prefix}-codiepie:before { content: @fa-var-codiepie; } +.@{fa-css-prefix}-modx:before { content: @fa-var-modx; } +.@{fa-css-prefix}-fort-awesome:before { content: @fa-var-fort-awesome; } +.@{fa-css-prefix}-usb:before { content: @fa-var-usb; } +.@{fa-css-prefix}-product-hunt:before { content: @fa-var-product-hunt; } +.@{fa-css-prefix}-mixcloud:before { content: @fa-var-mixcloud; } +.@{fa-css-prefix}-scribd:before { content: @fa-var-scribd; } +.@{fa-css-prefix}-pause-circle:before { content: @fa-var-pause-circle; } +.@{fa-css-prefix}-pause-circle-o:before { content: @fa-var-pause-circle-o; } +.@{fa-css-prefix}-stop-circle:before { content: @fa-var-stop-circle; } +.@{fa-css-prefix}-stop-circle-o:before { content: @fa-var-stop-circle-o; } +.@{fa-css-prefix}-shopping-bag:before { content: @fa-var-shopping-bag; } +.@{fa-css-prefix}-shopping-basket:before { content: @fa-var-shopping-basket; } +.@{fa-css-prefix}-hashtag:before { content: @fa-var-hashtag; } +.@{fa-css-prefix}-bluetooth:before { content: @fa-var-bluetooth; } +.@{fa-css-prefix}-bluetooth-b:before { content: @fa-var-bluetooth-b; } +.@{fa-css-prefix}-percent:before { content: @fa-var-percent; } +.@{fa-css-prefix}-gitlab:before { content: @fa-var-gitlab; } +.@{fa-css-prefix}-wpbeginner:before { content: @fa-var-wpbeginner; } +.@{fa-css-prefix}-wpforms:before { content: @fa-var-wpforms; } +.@{fa-css-prefix}-envira:before { content: @fa-var-envira; } +.@{fa-css-prefix}-universal-access:before { content: @fa-var-universal-access; } +.@{fa-css-prefix}-wheelchair-alt:before { content: @fa-var-wheelchair-alt; } +.@{fa-css-prefix}-question-circle-o:before { content: @fa-var-question-circle-o; } +.@{fa-css-prefix}-blind:before { content: @fa-var-blind; } +.@{fa-css-prefix}-audio-description:before { content: @fa-var-audio-description; } +.@{fa-css-prefix}-volume-control-phone:before { content: @fa-var-volume-control-phone; } +.@{fa-css-prefix}-braille:before { content: @fa-var-braille; } +.@{fa-css-prefix}-assistive-listening-systems:before { content: @fa-var-assistive-listening-systems; } +.@{fa-css-prefix}-asl-interpreting:before, +.@{fa-css-prefix}-american-sign-language-interpreting:before { content: @fa-var-american-sign-language-interpreting; } +.@{fa-css-prefix}-deafness:before, +.@{fa-css-prefix}-hard-of-hearing:before, +.@{fa-css-prefix}-deaf:before { content: @fa-var-deaf; } +.@{fa-css-prefix}-glide:before { content: @fa-var-glide; } +.@{fa-css-prefix}-glide-g:before { content: @fa-var-glide-g; } +.@{fa-css-prefix}-signing:before, +.@{fa-css-prefix}-sign-language:before { content: @fa-var-sign-language; } +.@{fa-css-prefix}-low-vision:before { content: @fa-var-low-vision; } +.@{fa-css-prefix}-viadeo:before { content: @fa-var-viadeo; } +.@{fa-css-prefix}-viadeo-square:before { content: @fa-var-viadeo-square; } +.@{fa-css-prefix}-snapchat:before { content: @fa-var-snapchat; } +.@{fa-css-prefix}-snapchat-ghost:before { content: @fa-var-snapchat-ghost; } +.@{fa-css-prefix}-snapchat-square:before { content: @fa-var-snapchat-square; } +.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; } +.@{fa-css-prefix}-first-order:before { content: @fa-var-first-order; } +.@{fa-css-prefix}-yoast:before { content: @fa-var-yoast; } +.@{fa-css-prefix}-themeisle:before { content: @fa-var-themeisle; } +.@{fa-css-prefix}-google-plus-circle:before, +.@{fa-css-prefix}-google-plus-official:before { content: @fa-var-google-plus-official; } +.@{fa-css-prefix}-fa:before, +.@{fa-css-prefix}-font-awesome:before { content: @fa-var-font-awesome; } +.@{fa-css-prefix}-handshake-o:before { content: @fa-var-handshake-o; } +.@{fa-css-prefix}-envelope-open:before { content: @fa-var-envelope-open; } +.@{fa-css-prefix}-envelope-open-o:before { content: @fa-var-envelope-open-o; } +.@{fa-css-prefix}-linode:before { content: @fa-var-linode; } +.@{fa-css-prefix}-address-book:before { content: @fa-var-address-book; } +.@{fa-css-prefix}-address-book-o:before { content: @fa-var-address-book-o; } +.@{fa-css-prefix}-vcard:before, +.@{fa-css-prefix}-address-card:before { content: @fa-var-address-card; } +.@{fa-css-prefix}-vcard-o:before, +.@{fa-css-prefix}-address-card-o:before { content: @fa-var-address-card-o; } +.@{fa-css-prefix}-user-circle:before { content: @fa-var-user-circle; } +.@{fa-css-prefix}-user-circle-o:before { content: @fa-var-user-circle-o; } +.@{fa-css-prefix}-user-o:before { content: @fa-var-user-o; } +.@{fa-css-prefix}-id-badge:before { content: @fa-var-id-badge; } +.@{fa-css-prefix}-drivers-license:before, +.@{fa-css-prefix}-id-card:before { content: @fa-var-id-card; } +.@{fa-css-prefix}-drivers-license-o:before, +.@{fa-css-prefix}-id-card-o:before { content: @fa-var-id-card-o; } +.@{fa-css-prefix}-quora:before { content: @fa-var-quora; } +.@{fa-css-prefix}-free-code-camp:before { content: @fa-var-free-code-camp; } +.@{fa-css-prefix}-telegram:before { content: @fa-var-telegram; } +.@{fa-css-prefix}-thermometer-4:before, +.@{fa-css-prefix}-thermometer:before, +.@{fa-css-prefix}-thermometer-full:before { content: @fa-var-thermometer-full; } +.@{fa-css-prefix}-thermometer-3:before, +.@{fa-css-prefix}-thermometer-three-quarters:before { content: @fa-var-thermometer-three-quarters; } +.@{fa-css-prefix}-thermometer-2:before, +.@{fa-css-prefix}-thermometer-half:before { content: @fa-var-thermometer-half; } +.@{fa-css-prefix}-thermometer-1:before, +.@{fa-css-prefix}-thermometer-quarter:before { content: @fa-var-thermometer-quarter; } +.@{fa-css-prefix}-thermometer-0:before, +.@{fa-css-prefix}-thermometer-empty:before { content: @fa-var-thermometer-empty; } +.@{fa-css-prefix}-shower:before { content: @fa-var-shower; } +.@{fa-css-prefix}-bathtub:before, +.@{fa-css-prefix}-s15:before, +.@{fa-css-prefix}-bath:before { content: @fa-var-bath; } +.@{fa-css-prefix}-podcast:before { content: @fa-var-podcast; } +.@{fa-css-prefix}-window-maximize:before { content: @fa-var-window-maximize; } +.@{fa-css-prefix}-window-minimize:before { content: @fa-var-window-minimize; } +.@{fa-css-prefix}-window-restore:before { content: @fa-var-window-restore; } +.@{fa-css-prefix}-times-rectangle:before, +.@{fa-css-prefix}-window-close:before { content: @fa-var-window-close; } +.@{fa-css-prefix}-times-rectangle-o:before, +.@{fa-css-prefix}-window-close-o:before { content: @fa-var-window-close-o; } +.@{fa-css-prefix}-bandcamp:before { content: @fa-var-bandcamp; } +.@{fa-css-prefix}-grav:before { content: @fa-var-grav; } +.@{fa-css-prefix}-etsy:before { content: @fa-var-etsy; } +.@{fa-css-prefix}-imdb:before { content: @fa-var-imdb; } +.@{fa-css-prefix}-ravelry:before { content: @fa-var-ravelry; } +.@{fa-css-prefix}-eercast:before { content: @fa-var-eercast; } +.@{fa-css-prefix}-microchip:before { content: @fa-var-microchip; } +.@{fa-css-prefix}-snowflake-o:before { content: @fa-var-snowflake-o; } +.@{fa-css-prefix}-superpowers:before { content: @fa-var-superpowers; } +.@{fa-css-prefix}-wpexplorer:before { content: @fa-var-wpexplorer; } +.@{fa-css-prefix}-meetup:before { content: @fa-var-meetup; } diff --git a/src/assets/fa/less/larger.less b/src/assets/fa/less/larger.less new file mode 100644 index 0000000..c9d6467 --- /dev/null +++ b/src/assets/fa/less/larger.less @@ -0,0 +1,13 @@ +// Icon Sizes +// ------------------------- + +/* makes the font 33% larger relative to the icon container */ +.@{fa-css-prefix}-lg { + font-size: (4em / 3); + line-height: (3em / 4); + vertical-align: -15%; +} +.@{fa-css-prefix}-2x { font-size: 2em; } +.@{fa-css-prefix}-3x { font-size: 3em; } +.@{fa-css-prefix}-4x { font-size: 4em; } +.@{fa-css-prefix}-5x { font-size: 5em; } diff --git a/src/assets/fa/less/list.less b/src/assets/fa/less/list.less new file mode 100644 index 0000000..0b44038 --- /dev/null +++ b/src/assets/fa/less/list.less @@ -0,0 +1,19 @@ +// List Icons +// ------------------------- + +.@{fa-css-prefix}-ul { + padding-left: 0; + margin-left: @fa-li-width; + list-style-type: none; + > li { position: relative; } +} +.@{fa-css-prefix}-li { + position: absolute; + left: -@fa-li-width; + width: @fa-li-width; + top: (2em / 14); + text-align: center; + &.@{fa-css-prefix}-lg { + left: (-@fa-li-width + (4em / 14)); + } +} diff --git a/src/assets/fa/less/mixins.less b/src/assets/fa/less/mixins.less new file mode 100644 index 0000000..beef231 --- /dev/null +++ b/src/assets/fa/less/mixins.less @@ -0,0 +1,60 @@ +// Mixins +// -------------------------- + +.fa-icon() { + display: inline-block; + font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} + +.fa-icon-rotate(@degrees, @rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; + -webkit-transform: rotate(@degrees); + -ms-transform: rotate(@degrees); + transform: rotate(@degrees); +} + +.fa-icon-flip(@horiz, @vert, @rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; + -webkit-transform: scale(@horiz, @vert); + -ms-transform: scale(@horiz, @vert); + transform: scale(@horiz, @vert); +} + + +// Only display content to screen readers. A la Bootstrap 4. +// +// See: http://a11yproject.com/posts/how-to-hide-content/ + +.sr-only() { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; +} + +// Use in conjunction with .sr-only to only display content when it's focused. +// +// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// +// Credit: HTML5 Boilerplate + +.sr-only-focusable() { + &:active, + &:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; + } +} diff --git a/src/assets/fa/less/path.less b/src/assets/fa/less/path.less new file mode 100644 index 0000000..835be41 --- /dev/null +++ b/src/assets/fa/less/path.less @@ -0,0 +1,15 @@ +/* FONT PATH + * -------------------------- */ + +@font-face { + font-family: 'FontAwesome'; + src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); + src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), + url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), + url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), + url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), + url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); + // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} diff --git a/src/assets/fa/less/rotated-flipped.less b/src/assets/fa/less/rotated-flipped.less new file mode 100644 index 0000000..f6ba814 --- /dev/null +++ b/src/assets/fa/less/rotated-flipped.less @@ -0,0 +1,20 @@ +// Rotated & Flipped Icons +// ------------------------- + +.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } +.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } +.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } + +.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } +.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } + +// Hook for IE8-9 +// ------------------------- + +:root .@{fa-css-prefix}-rotate-90, +:root .@{fa-css-prefix}-rotate-180, +:root .@{fa-css-prefix}-rotate-270, +:root .@{fa-css-prefix}-flip-horizontal, +:root .@{fa-css-prefix}-flip-vertical { + filter: none; +} diff --git a/src/assets/fa/less/screen-reader.less b/src/assets/fa/less/screen-reader.less new file mode 100644 index 0000000..11c1881 --- /dev/null +++ b/src/assets/fa/less/screen-reader.less @@ -0,0 +1,5 @@ +// Screen Readers +// ------------------------- + +.sr-only { .sr-only(); } +.sr-only-focusable { .sr-only-focusable(); } diff --git a/src/assets/fa/less/stacked.less b/src/assets/fa/less/stacked.less new file mode 100644 index 0000000..fc53fb0 --- /dev/null +++ b/src/assets/fa/less/stacked.less @@ -0,0 +1,20 @@ +// Stacked Icons +// ------------------------- + +.@{fa-css-prefix}-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.@{fa-css-prefix}-stack-1x { line-height: inherit; } +.@{fa-css-prefix}-stack-2x { font-size: 2em; } +.@{fa-css-prefix}-inverse { color: @fa-inverse; } diff --git a/src/assets/fa/less/variables.less b/src/assets/fa/less/variables.less new file mode 100644 index 0000000..7ddbbc0 --- /dev/null +++ b/src/assets/fa/less/variables.less @@ -0,0 +1,800 @@ +// Variables +// -------------------------- + +@fa-font-path: "../fonts"; +@fa-font-size-base: 14px; +@fa-line-height-base: 1; +//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts"; // for referencing Bootstrap CDN font files directly +@fa-css-prefix: fa; +@fa-version: "4.7.0"; +@fa-border-color: #eee; +@fa-inverse: #fff; +@fa-li-width: (30em / 14); + +@fa-var-500px: "\f26e"; +@fa-var-address-book: "\f2b9"; +@fa-var-address-book-o: "\f2ba"; +@fa-var-address-card: "\f2bb"; +@fa-var-address-card-o: "\f2bc"; +@fa-var-adjust: "\f042"; +@fa-var-adn: "\f170"; +@fa-var-align-center: "\f037"; +@fa-var-align-justify: "\f039"; +@fa-var-align-left: "\f036"; +@fa-var-align-right: "\f038"; +@fa-var-amazon: "\f270"; +@fa-var-ambulance: "\f0f9"; +@fa-var-american-sign-language-interpreting: "\f2a3"; +@fa-var-anchor: "\f13d"; +@fa-var-android: "\f17b"; +@fa-var-angellist: "\f209"; +@fa-var-angle-double-down: "\f103"; +@fa-var-angle-double-left: "\f100"; +@fa-var-angle-double-right: "\f101"; +@fa-var-angle-double-up: "\f102"; +@fa-var-angle-down: "\f107"; +@fa-var-angle-left: "\f104"; +@fa-var-angle-right: "\f105"; +@fa-var-angle-up: "\f106"; +@fa-var-apple: "\f179"; +@fa-var-archive: "\f187"; +@fa-var-area-chart: "\f1fe"; +@fa-var-arrow-circle-down: "\f0ab"; +@fa-var-arrow-circle-left: "\f0a8"; +@fa-var-arrow-circle-o-down: "\f01a"; +@fa-var-arrow-circle-o-left: "\f190"; +@fa-var-arrow-circle-o-right: "\f18e"; +@fa-var-arrow-circle-o-up: "\f01b"; +@fa-var-arrow-circle-right: "\f0a9"; +@fa-var-arrow-circle-up: "\f0aa"; +@fa-var-arrow-down: "\f063"; +@fa-var-arrow-left: "\f060"; +@fa-var-arrow-right: "\f061"; +@fa-var-arrow-up: "\f062"; +@fa-var-arrows: "\f047"; +@fa-var-arrows-alt: "\f0b2"; +@fa-var-arrows-h: "\f07e"; +@fa-var-arrows-v: "\f07d"; +@fa-var-asl-interpreting: "\f2a3"; +@fa-var-assistive-listening-systems: "\f2a2"; +@fa-var-asterisk: "\f069"; +@fa-var-at: "\f1fa"; +@fa-var-audio-description: "\f29e"; +@fa-var-automobile: "\f1b9"; +@fa-var-backward: "\f04a"; +@fa-var-balance-scale: "\f24e"; +@fa-var-ban: "\f05e"; +@fa-var-bandcamp: "\f2d5"; +@fa-var-bank: "\f19c"; +@fa-var-bar-chart: "\f080"; +@fa-var-bar-chart-o: "\f080"; +@fa-var-barcode: "\f02a"; +@fa-var-bars: "\f0c9"; +@fa-var-bath: "\f2cd"; +@fa-var-bathtub: "\f2cd"; +@fa-var-battery: "\f240"; +@fa-var-battery-0: "\f244"; +@fa-var-battery-1: "\f243"; +@fa-var-battery-2: "\f242"; +@fa-var-battery-3: "\f241"; +@fa-var-battery-4: "\f240"; +@fa-var-battery-empty: "\f244"; +@fa-var-battery-full: "\f240"; +@fa-var-battery-half: "\f242"; +@fa-var-battery-quarter: "\f243"; +@fa-var-battery-three-quarters: "\f241"; +@fa-var-bed: "\f236"; +@fa-var-beer: "\f0fc"; +@fa-var-behance: "\f1b4"; +@fa-var-behance-square: "\f1b5"; +@fa-var-bell: "\f0f3"; +@fa-var-bell-o: "\f0a2"; +@fa-var-bell-slash: "\f1f6"; +@fa-var-bell-slash-o: "\f1f7"; +@fa-var-bicycle: "\f206"; +@fa-var-binoculars: "\f1e5"; +@fa-var-birthday-cake: "\f1fd"; +@fa-var-bitbucket: "\f171"; +@fa-var-bitbucket-square: "\f172"; +@fa-var-bitcoin: "\f15a"; +@fa-var-black-tie: "\f27e"; +@fa-var-blind: "\f29d"; +@fa-var-bluetooth: "\f293"; +@fa-var-bluetooth-b: "\f294"; +@fa-var-bold: "\f032"; +@fa-var-bolt: "\f0e7"; +@fa-var-bomb: "\f1e2"; +@fa-var-book: "\f02d"; +@fa-var-bookmark: "\f02e"; +@fa-var-bookmark-o: "\f097"; +@fa-var-braille: "\f2a1"; +@fa-var-briefcase: "\f0b1"; +@fa-var-btc: "\f15a"; +@fa-var-bug: "\f188"; +@fa-var-building: "\f1ad"; +@fa-var-building-o: "\f0f7"; +@fa-var-bullhorn: "\f0a1"; +@fa-var-bullseye: "\f140"; +@fa-var-bus: "\f207"; +@fa-var-buysellads: "\f20d"; +@fa-var-cab: "\f1ba"; +@fa-var-calculator: "\f1ec"; +@fa-var-calendar: "\f073"; +@fa-var-calendar-check-o: "\f274"; +@fa-var-calendar-minus-o: "\f272"; +@fa-var-calendar-o: "\f133"; +@fa-var-calendar-plus-o: "\f271"; +@fa-var-calendar-times-o: "\f273"; +@fa-var-camera: "\f030"; +@fa-var-camera-retro: "\f083"; +@fa-var-car: "\f1b9"; +@fa-var-caret-down: "\f0d7"; +@fa-var-caret-left: "\f0d9"; +@fa-var-caret-right: "\f0da"; +@fa-var-caret-square-o-down: "\f150"; +@fa-var-caret-square-o-left: "\f191"; +@fa-var-caret-square-o-right: "\f152"; +@fa-var-caret-square-o-up: "\f151"; +@fa-var-caret-up: "\f0d8"; +@fa-var-cart-arrow-down: "\f218"; +@fa-var-cart-plus: "\f217"; +@fa-var-cc: "\f20a"; +@fa-var-cc-amex: "\f1f3"; +@fa-var-cc-diners-club: "\f24c"; +@fa-var-cc-discover: "\f1f2"; +@fa-var-cc-jcb: "\f24b"; +@fa-var-cc-mastercard: "\f1f1"; +@fa-var-cc-paypal: "\f1f4"; +@fa-var-cc-stripe: "\f1f5"; +@fa-var-cc-visa: "\f1f0"; +@fa-var-certificate: "\f0a3"; +@fa-var-chain: "\f0c1"; +@fa-var-chain-broken: "\f127"; +@fa-var-check: "\f00c"; +@fa-var-check-circle: "\f058"; +@fa-var-check-circle-o: "\f05d"; +@fa-var-check-square: "\f14a"; +@fa-var-check-square-o: "\f046"; +@fa-var-chevron-circle-down: "\f13a"; +@fa-var-chevron-circle-left: "\f137"; +@fa-var-chevron-circle-right: "\f138"; +@fa-var-chevron-circle-up: "\f139"; +@fa-var-chevron-down: "\f078"; +@fa-var-chevron-left: "\f053"; +@fa-var-chevron-right: "\f054"; +@fa-var-chevron-up: "\f077"; +@fa-var-child: "\f1ae"; +@fa-var-chrome: "\f268"; +@fa-var-circle: "\f111"; +@fa-var-circle-o: "\f10c"; +@fa-var-circle-o-notch: "\f1ce"; +@fa-var-circle-thin: "\f1db"; +@fa-var-clipboard: "\f0ea"; +@fa-var-clock-o: "\f017"; +@fa-var-clone: "\f24d"; +@fa-var-close: "\f00d"; +@fa-var-cloud: "\f0c2"; +@fa-var-cloud-download: "\f0ed"; +@fa-var-cloud-upload: "\f0ee"; +@fa-var-cny: "\f157"; +@fa-var-code: "\f121"; +@fa-var-code-fork: "\f126"; +@fa-var-codepen: "\f1cb"; +@fa-var-codiepie: "\f284"; +@fa-var-coffee: "\f0f4"; +@fa-var-cog: "\f013"; +@fa-var-cogs: "\f085"; +@fa-var-columns: "\f0db"; +@fa-var-comment: "\f075"; +@fa-var-comment-o: "\f0e5"; +@fa-var-commenting: "\f27a"; +@fa-var-commenting-o: "\f27b"; +@fa-var-comments: "\f086"; +@fa-var-comments-o: "\f0e6"; +@fa-var-compass: "\f14e"; +@fa-var-compress: "\f066"; +@fa-var-connectdevelop: "\f20e"; +@fa-var-contao: "\f26d"; +@fa-var-copy: "\f0c5"; +@fa-var-copyright: "\f1f9"; +@fa-var-creative-commons: "\f25e"; +@fa-var-credit-card: "\f09d"; +@fa-var-credit-card-alt: "\f283"; +@fa-var-crop: "\f125"; +@fa-var-crosshairs: "\f05b"; +@fa-var-css3: "\f13c"; +@fa-var-cube: "\f1b2"; +@fa-var-cubes: "\f1b3"; +@fa-var-cut: "\f0c4"; +@fa-var-cutlery: "\f0f5"; +@fa-var-dashboard: "\f0e4"; +@fa-var-dashcube: "\f210"; +@fa-var-database: "\f1c0"; +@fa-var-deaf: "\f2a4"; +@fa-var-deafness: "\f2a4"; +@fa-var-dedent: "\f03b"; +@fa-var-delicious: "\f1a5"; +@fa-var-desktop: "\f108"; +@fa-var-deviantart: "\f1bd"; +@fa-var-diamond: "\f219"; +@fa-var-digg: "\f1a6"; +@fa-var-dollar: "\f155"; +@fa-var-dot-circle-o: "\f192"; +@fa-var-download: "\f019"; +@fa-var-dribbble: "\f17d"; +@fa-var-drivers-license: "\f2c2"; +@fa-var-drivers-license-o: "\f2c3"; +@fa-var-dropbox: "\f16b"; +@fa-var-drupal: "\f1a9"; +@fa-var-edge: "\f282"; +@fa-var-edit: "\f044"; +@fa-var-eercast: "\f2da"; +@fa-var-eject: "\f052"; +@fa-var-ellipsis-h: "\f141"; +@fa-var-ellipsis-v: "\f142"; +@fa-var-empire: "\f1d1"; +@fa-var-envelope: "\f0e0"; +@fa-var-envelope-o: "\f003"; +@fa-var-envelope-open: "\f2b6"; +@fa-var-envelope-open-o: "\f2b7"; +@fa-var-envelope-square: "\f199"; +@fa-var-envira: "\f299"; +@fa-var-eraser: "\f12d"; +@fa-var-etsy: "\f2d7"; +@fa-var-eur: "\f153"; +@fa-var-euro: "\f153"; +@fa-var-exchange: "\f0ec"; +@fa-var-exclamation: "\f12a"; +@fa-var-exclamation-circle: "\f06a"; +@fa-var-exclamation-triangle: "\f071"; +@fa-var-expand: "\f065"; +@fa-var-expeditedssl: "\f23e"; +@fa-var-external-link: "\f08e"; +@fa-var-external-link-square: "\f14c"; +@fa-var-eye: "\f06e"; +@fa-var-eye-slash: "\f070"; +@fa-var-eyedropper: "\f1fb"; +@fa-var-fa: "\f2b4"; +@fa-var-facebook: "\f09a"; +@fa-var-facebook-f: "\f09a"; +@fa-var-facebook-official: "\f230"; +@fa-var-facebook-square: "\f082"; +@fa-var-fast-backward: "\f049"; +@fa-var-fast-forward: "\f050"; +@fa-var-fax: "\f1ac"; +@fa-var-feed: "\f09e"; +@fa-var-female: "\f182"; +@fa-var-fighter-jet: "\f0fb"; +@fa-var-file: "\f15b"; +@fa-var-file-archive-o: "\f1c6"; +@fa-var-file-audio-o: "\f1c7"; +@fa-var-file-code-o: "\f1c9"; +@fa-var-file-excel-o: "\f1c3"; +@fa-var-file-image-o: "\f1c5"; +@fa-var-file-movie-o: "\f1c8"; +@fa-var-file-o: "\f016"; +@fa-var-file-pdf-o: "\f1c1"; +@fa-var-file-photo-o: "\f1c5"; +@fa-var-file-picture-o: "\f1c5"; +@fa-var-file-powerpoint-o: "\f1c4"; +@fa-var-file-sound-o: "\f1c7"; +@fa-var-file-text: "\f15c"; +@fa-var-file-text-o: "\f0f6"; +@fa-var-file-video-o: "\f1c8"; +@fa-var-file-word-o: "\f1c2"; +@fa-var-file-zip-o: "\f1c6"; +@fa-var-files-o: "\f0c5"; +@fa-var-film: "\f008"; +@fa-var-filter: "\f0b0"; +@fa-var-fire: "\f06d"; +@fa-var-fire-extinguisher: "\f134"; +@fa-var-firefox: "\f269"; +@fa-var-first-order: "\f2b0"; +@fa-var-flag: "\f024"; +@fa-var-flag-checkered: "\f11e"; +@fa-var-flag-o: "\f11d"; +@fa-var-flash: "\f0e7"; +@fa-var-flask: "\f0c3"; +@fa-var-flickr: "\f16e"; +@fa-var-floppy-o: "\f0c7"; +@fa-var-folder: "\f07b"; +@fa-var-folder-o: "\f114"; +@fa-var-folder-open: "\f07c"; +@fa-var-folder-open-o: "\f115"; +@fa-var-font: "\f031"; +@fa-var-font-awesome: "\f2b4"; +@fa-var-fonticons: "\f280"; +@fa-var-fort-awesome: "\f286"; +@fa-var-forumbee: "\f211"; +@fa-var-forward: "\f04e"; +@fa-var-foursquare: "\f180"; +@fa-var-free-code-camp: "\f2c5"; +@fa-var-frown-o: "\f119"; +@fa-var-futbol-o: "\f1e3"; +@fa-var-gamepad: "\f11b"; +@fa-var-gavel: "\f0e3"; +@fa-var-gbp: "\f154"; +@fa-var-ge: "\f1d1"; +@fa-var-gear: "\f013"; +@fa-var-gears: "\f085"; +@fa-var-genderless: "\f22d"; +@fa-var-get-pocket: "\f265"; +@fa-var-gg: "\f260"; +@fa-var-gg-circle: "\f261"; +@fa-var-gift: "\f06b"; +@fa-var-git: "\f1d3"; +@fa-var-git-square: "\f1d2"; +@fa-var-github: "\f09b"; +@fa-var-github-alt: "\f113"; +@fa-var-github-square: "\f092"; +@fa-var-gitlab: "\f296"; +@fa-var-gittip: "\f184"; +@fa-var-glass: "\f000"; +@fa-var-glide: "\f2a5"; +@fa-var-glide-g: "\f2a6"; +@fa-var-globe: "\f0ac"; +@fa-var-google: "\f1a0"; +@fa-var-google-plus: "\f0d5"; +@fa-var-google-plus-circle: "\f2b3"; +@fa-var-google-plus-official: "\f2b3"; +@fa-var-google-plus-square: "\f0d4"; +@fa-var-google-wallet: "\f1ee"; +@fa-var-graduation-cap: "\f19d"; +@fa-var-gratipay: "\f184"; +@fa-var-grav: "\f2d6"; +@fa-var-group: "\f0c0"; +@fa-var-h-square: "\f0fd"; +@fa-var-hacker-news: "\f1d4"; +@fa-var-hand-grab-o: "\f255"; +@fa-var-hand-lizard-o: "\f258"; +@fa-var-hand-o-down: "\f0a7"; +@fa-var-hand-o-left: "\f0a5"; +@fa-var-hand-o-right: "\f0a4"; +@fa-var-hand-o-up: "\f0a6"; +@fa-var-hand-paper-o: "\f256"; +@fa-var-hand-peace-o: "\f25b"; +@fa-var-hand-pointer-o: "\f25a"; +@fa-var-hand-rock-o: "\f255"; +@fa-var-hand-scissors-o: "\f257"; +@fa-var-hand-spock-o: "\f259"; +@fa-var-hand-stop-o: "\f256"; +@fa-var-handshake-o: "\f2b5"; +@fa-var-hard-of-hearing: "\f2a4"; +@fa-var-hashtag: "\f292"; +@fa-var-hdd-o: "\f0a0"; +@fa-var-header: "\f1dc"; +@fa-var-headphones: "\f025"; +@fa-var-heart: "\f004"; +@fa-var-heart-o: "\f08a"; +@fa-var-heartbeat: "\f21e"; +@fa-var-history: "\f1da"; +@fa-var-home: "\f015"; +@fa-var-hospital-o: "\f0f8"; +@fa-var-hotel: "\f236"; +@fa-var-hourglass: "\f254"; +@fa-var-hourglass-1: "\f251"; +@fa-var-hourglass-2: "\f252"; +@fa-var-hourglass-3: "\f253"; +@fa-var-hourglass-end: "\f253"; +@fa-var-hourglass-half: "\f252"; +@fa-var-hourglass-o: "\f250"; +@fa-var-hourglass-start: "\f251"; +@fa-var-houzz: "\f27c"; +@fa-var-html5: "\f13b"; +@fa-var-i-cursor: "\f246"; +@fa-var-id-badge: "\f2c1"; +@fa-var-id-card: "\f2c2"; +@fa-var-id-card-o: "\f2c3"; +@fa-var-ils: "\f20b"; +@fa-var-image: "\f03e"; +@fa-var-imdb: "\f2d8"; +@fa-var-inbox: "\f01c"; +@fa-var-indent: "\f03c"; +@fa-var-industry: "\f275"; +@fa-var-info: "\f129"; +@fa-var-info-circle: "\f05a"; +@fa-var-inr: "\f156"; +@fa-var-instagram: "\f16d"; +@fa-var-institution: "\f19c"; +@fa-var-internet-explorer: "\f26b"; +@fa-var-intersex: "\f224"; +@fa-var-ioxhost: "\f208"; +@fa-var-italic: "\f033"; +@fa-var-joomla: "\f1aa"; +@fa-var-jpy: "\f157"; +@fa-var-jsfiddle: "\f1cc"; +@fa-var-key: "\f084"; +@fa-var-keyboard-o: "\f11c"; +@fa-var-krw: "\f159"; +@fa-var-language: "\f1ab"; +@fa-var-laptop: "\f109"; +@fa-var-lastfm: "\f202"; +@fa-var-lastfm-square: "\f203"; +@fa-var-leaf: "\f06c"; +@fa-var-leanpub: "\f212"; +@fa-var-legal: "\f0e3"; +@fa-var-lemon-o: "\f094"; +@fa-var-level-down: "\f149"; +@fa-var-level-up: "\f148"; +@fa-var-life-bouy: "\f1cd"; +@fa-var-life-buoy: "\f1cd"; +@fa-var-life-ring: "\f1cd"; +@fa-var-life-saver: "\f1cd"; +@fa-var-lightbulb-o: "\f0eb"; +@fa-var-line-chart: "\f201"; +@fa-var-link: "\f0c1"; +@fa-var-linkedin: "\f0e1"; +@fa-var-linkedin-square: "\f08c"; +@fa-var-linode: "\f2b8"; +@fa-var-linux: "\f17c"; +@fa-var-list: "\f03a"; +@fa-var-list-alt: "\f022"; +@fa-var-list-ol: "\f0cb"; +@fa-var-list-ul: "\f0ca"; +@fa-var-location-arrow: "\f124"; +@fa-var-lock: "\f023"; +@fa-var-long-arrow-down: "\f175"; +@fa-var-long-arrow-left: "\f177"; +@fa-var-long-arrow-right: "\f178"; +@fa-var-long-arrow-up: "\f176"; +@fa-var-low-vision: "\f2a8"; +@fa-var-magic: "\f0d0"; +@fa-var-magnet: "\f076"; +@fa-var-mail-forward: "\f064"; +@fa-var-mail-reply: "\f112"; +@fa-var-mail-reply-all: "\f122"; +@fa-var-male: "\f183"; +@fa-var-map: "\f279"; +@fa-var-map-marker: "\f041"; +@fa-var-map-o: "\f278"; +@fa-var-map-pin: "\f276"; +@fa-var-map-signs: "\f277"; +@fa-var-mars: "\f222"; +@fa-var-mars-double: "\f227"; +@fa-var-mars-stroke: "\f229"; +@fa-var-mars-stroke-h: "\f22b"; +@fa-var-mars-stroke-v: "\f22a"; +@fa-var-maxcdn: "\f136"; +@fa-var-meanpath: "\f20c"; +@fa-var-medium: "\f23a"; +@fa-var-medkit: "\f0fa"; +@fa-var-meetup: "\f2e0"; +@fa-var-meh-o: "\f11a"; +@fa-var-mercury: "\f223"; +@fa-var-microchip: "\f2db"; +@fa-var-microphone: "\f130"; +@fa-var-microphone-slash: "\f131"; +@fa-var-minus: "\f068"; +@fa-var-minus-circle: "\f056"; +@fa-var-minus-square: "\f146"; +@fa-var-minus-square-o: "\f147"; +@fa-var-mixcloud: "\f289"; +@fa-var-mobile: "\f10b"; +@fa-var-mobile-phone: "\f10b"; +@fa-var-modx: "\f285"; +@fa-var-money: "\f0d6"; +@fa-var-moon-o: "\f186"; +@fa-var-mortar-board: "\f19d"; +@fa-var-motorcycle: "\f21c"; +@fa-var-mouse-pointer: "\f245"; +@fa-var-music: "\f001"; +@fa-var-navicon: "\f0c9"; +@fa-var-neuter: "\f22c"; +@fa-var-newspaper-o: "\f1ea"; +@fa-var-object-group: "\f247"; +@fa-var-object-ungroup: "\f248"; +@fa-var-odnoklassniki: "\f263"; +@fa-var-odnoklassniki-square: "\f264"; +@fa-var-opencart: "\f23d"; +@fa-var-openid: "\f19b"; +@fa-var-opera: "\f26a"; +@fa-var-optin-monster: "\f23c"; +@fa-var-outdent: "\f03b"; +@fa-var-pagelines: "\f18c"; +@fa-var-paint-brush: "\f1fc"; +@fa-var-paper-plane: "\f1d8"; +@fa-var-paper-plane-o: "\f1d9"; +@fa-var-paperclip: "\f0c6"; +@fa-var-paragraph: "\f1dd"; +@fa-var-paste: "\f0ea"; +@fa-var-pause: "\f04c"; +@fa-var-pause-circle: "\f28b"; +@fa-var-pause-circle-o: "\f28c"; +@fa-var-paw: "\f1b0"; +@fa-var-paypal: "\f1ed"; +@fa-var-pencil: "\f040"; +@fa-var-pencil-square: "\f14b"; +@fa-var-pencil-square-o: "\f044"; +@fa-var-percent: "\f295"; +@fa-var-phone: "\f095"; +@fa-var-phone-square: "\f098"; +@fa-var-photo: "\f03e"; +@fa-var-picture-o: "\f03e"; +@fa-var-pie-chart: "\f200"; +@fa-var-pied-piper: "\f2ae"; +@fa-var-pied-piper-alt: "\f1a8"; +@fa-var-pied-piper-pp: "\f1a7"; +@fa-var-pinterest: "\f0d2"; +@fa-var-pinterest-p: "\f231"; +@fa-var-pinterest-square: "\f0d3"; +@fa-var-plane: "\f072"; +@fa-var-play: "\f04b"; +@fa-var-play-circle: "\f144"; +@fa-var-play-circle-o: "\f01d"; +@fa-var-plug: "\f1e6"; +@fa-var-plus: "\f067"; +@fa-var-plus-circle: "\f055"; +@fa-var-plus-square: "\f0fe"; +@fa-var-plus-square-o: "\f196"; +@fa-var-podcast: "\f2ce"; +@fa-var-power-off: "\f011"; +@fa-var-print: "\f02f"; +@fa-var-product-hunt: "\f288"; +@fa-var-puzzle-piece: "\f12e"; +@fa-var-qq: "\f1d6"; +@fa-var-qrcode: "\f029"; +@fa-var-question: "\f128"; +@fa-var-question-circle: "\f059"; +@fa-var-question-circle-o: "\f29c"; +@fa-var-quora: "\f2c4"; +@fa-var-quote-left: "\f10d"; +@fa-var-quote-right: "\f10e"; +@fa-var-ra: "\f1d0"; +@fa-var-random: "\f074"; +@fa-var-ravelry: "\f2d9"; +@fa-var-rebel: "\f1d0"; +@fa-var-recycle: "\f1b8"; +@fa-var-reddit: "\f1a1"; +@fa-var-reddit-alien: "\f281"; +@fa-var-reddit-square: "\f1a2"; +@fa-var-refresh: "\f021"; +@fa-var-registered: "\f25d"; +@fa-var-remove: "\f00d"; +@fa-var-renren: "\f18b"; +@fa-var-reorder: "\f0c9"; +@fa-var-repeat: "\f01e"; +@fa-var-reply: "\f112"; +@fa-var-reply-all: "\f122"; +@fa-var-resistance: "\f1d0"; +@fa-var-retweet: "\f079"; +@fa-var-rmb: "\f157"; +@fa-var-road: "\f018"; +@fa-var-rocket: "\f135"; +@fa-var-rotate-left: "\f0e2"; +@fa-var-rotate-right: "\f01e"; +@fa-var-rouble: "\f158"; +@fa-var-rss: "\f09e"; +@fa-var-rss-square: "\f143"; +@fa-var-rub: "\f158"; +@fa-var-ruble: "\f158"; +@fa-var-rupee: "\f156"; +@fa-var-s15: "\f2cd"; +@fa-var-safari: "\f267"; +@fa-var-save: "\f0c7"; +@fa-var-scissors: "\f0c4"; +@fa-var-scribd: "\f28a"; +@fa-var-search: "\f002"; +@fa-var-search-minus: "\f010"; +@fa-var-search-plus: "\f00e"; +@fa-var-sellsy: "\f213"; +@fa-var-send: "\f1d8"; +@fa-var-send-o: "\f1d9"; +@fa-var-server: "\f233"; +@fa-var-share: "\f064"; +@fa-var-share-alt: "\f1e0"; +@fa-var-share-alt-square: "\f1e1"; +@fa-var-share-square: "\f14d"; +@fa-var-share-square-o: "\f045"; +@fa-var-shekel: "\f20b"; +@fa-var-sheqel: "\f20b"; +@fa-var-shield: "\f132"; +@fa-var-ship: "\f21a"; +@fa-var-shirtsinbulk: "\f214"; +@fa-var-shopping-bag: "\f290"; +@fa-var-shopping-basket: "\f291"; +@fa-var-shopping-cart: "\f07a"; +@fa-var-shower: "\f2cc"; +@fa-var-sign-in: "\f090"; +@fa-var-sign-language: "\f2a7"; +@fa-var-sign-out: "\f08b"; +@fa-var-signal: "\f012"; +@fa-var-signing: "\f2a7"; +@fa-var-simplybuilt: "\f215"; +@fa-var-sitemap: "\f0e8"; +@fa-var-skyatlas: "\f216"; +@fa-var-skype: "\f17e"; +@fa-var-slack: "\f198"; +@fa-var-sliders: "\f1de"; +@fa-var-slideshare: "\f1e7"; +@fa-var-smile-o: "\f118"; +@fa-var-snapchat: "\f2ab"; +@fa-var-snapchat-ghost: "\f2ac"; +@fa-var-snapchat-square: "\f2ad"; +@fa-var-snowflake-o: "\f2dc"; +@fa-var-soccer-ball-o: "\f1e3"; +@fa-var-sort: "\f0dc"; +@fa-var-sort-alpha-asc: "\f15d"; +@fa-var-sort-alpha-desc: "\f15e"; +@fa-var-sort-amount-asc: "\f160"; +@fa-var-sort-amount-desc: "\f161"; +@fa-var-sort-asc: "\f0de"; +@fa-var-sort-desc: "\f0dd"; +@fa-var-sort-down: "\f0dd"; +@fa-var-sort-numeric-asc: "\f162"; +@fa-var-sort-numeric-desc: "\f163"; +@fa-var-sort-up: "\f0de"; +@fa-var-soundcloud: "\f1be"; +@fa-var-space-shuttle: "\f197"; +@fa-var-spinner: "\f110"; +@fa-var-spoon: "\f1b1"; +@fa-var-spotify: "\f1bc"; +@fa-var-square: "\f0c8"; +@fa-var-square-o: "\f096"; +@fa-var-stack-exchange: "\f18d"; +@fa-var-stack-overflow: "\f16c"; +@fa-var-star: "\f005"; +@fa-var-star-half: "\f089"; +@fa-var-star-half-empty: "\f123"; +@fa-var-star-half-full: "\f123"; +@fa-var-star-half-o: "\f123"; +@fa-var-star-o: "\f006"; +@fa-var-steam: "\f1b6"; +@fa-var-steam-square: "\f1b7"; +@fa-var-step-backward: "\f048"; +@fa-var-step-forward: "\f051"; +@fa-var-stethoscope: "\f0f1"; +@fa-var-sticky-note: "\f249"; +@fa-var-sticky-note-o: "\f24a"; +@fa-var-stop: "\f04d"; +@fa-var-stop-circle: "\f28d"; +@fa-var-stop-circle-o: "\f28e"; +@fa-var-street-view: "\f21d"; +@fa-var-strikethrough: "\f0cc"; +@fa-var-stumbleupon: "\f1a4"; +@fa-var-stumbleupon-circle: "\f1a3"; +@fa-var-subscript: "\f12c"; +@fa-var-subway: "\f239"; +@fa-var-suitcase: "\f0f2"; +@fa-var-sun-o: "\f185"; +@fa-var-superpowers: "\f2dd"; +@fa-var-superscript: "\f12b"; +@fa-var-support: "\f1cd"; +@fa-var-table: "\f0ce"; +@fa-var-tablet: "\f10a"; +@fa-var-tachometer: "\f0e4"; +@fa-var-tag: "\f02b"; +@fa-var-tags: "\f02c"; +@fa-var-tasks: "\f0ae"; +@fa-var-taxi: "\f1ba"; +@fa-var-telegram: "\f2c6"; +@fa-var-television: "\f26c"; +@fa-var-tencent-weibo: "\f1d5"; +@fa-var-terminal: "\f120"; +@fa-var-text-height: "\f034"; +@fa-var-text-width: "\f035"; +@fa-var-th: "\f00a"; +@fa-var-th-large: "\f009"; +@fa-var-th-list: "\f00b"; +@fa-var-themeisle: "\f2b2"; +@fa-var-thermometer: "\f2c7"; +@fa-var-thermometer-0: "\f2cb"; +@fa-var-thermometer-1: "\f2ca"; +@fa-var-thermometer-2: "\f2c9"; +@fa-var-thermometer-3: "\f2c8"; +@fa-var-thermometer-4: "\f2c7"; +@fa-var-thermometer-empty: "\f2cb"; +@fa-var-thermometer-full: "\f2c7"; +@fa-var-thermometer-half: "\f2c9"; +@fa-var-thermometer-quarter: "\f2ca"; +@fa-var-thermometer-three-quarters: "\f2c8"; +@fa-var-thumb-tack: "\f08d"; +@fa-var-thumbs-down: "\f165"; +@fa-var-thumbs-o-down: "\f088"; +@fa-var-thumbs-o-up: "\f087"; +@fa-var-thumbs-up: "\f164"; +@fa-var-ticket: "\f145"; +@fa-var-times: "\f00d"; +@fa-var-times-circle: "\f057"; +@fa-var-times-circle-o: "\f05c"; +@fa-var-times-rectangle: "\f2d3"; +@fa-var-times-rectangle-o: "\f2d4"; +@fa-var-tint: "\f043"; +@fa-var-toggle-down: "\f150"; +@fa-var-toggle-left: "\f191"; +@fa-var-toggle-off: "\f204"; +@fa-var-toggle-on: "\f205"; +@fa-var-toggle-right: "\f152"; +@fa-var-toggle-up: "\f151"; +@fa-var-trademark: "\f25c"; +@fa-var-train: "\f238"; +@fa-var-transgender: "\f224"; +@fa-var-transgender-alt: "\f225"; +@fa-var-trash: "\f1f8"; +@fa-var-trash-o: "\f014"; +@fa-var-tree: "\f1bb"; +@fa-var-trello: "\f181"; +@fa-var-tripadvisor: "\f262"; +@fa-var-trophy: "\f091"; +@fa-var-truck: "\f0d1"; +@fa-var-try: "\f195"; +@fa-var-tty: "\f1e4"; +@fa-var-tumblr: "\f173"; +@fa-var-tumblr-square: "\f174"; +@fa-var-turkish-lira: "\f195"; +@fa-var-tv: "\f26c"; +@fa-var-twitch: "\f1e8"; +@fa-var-twitter: "\f099"; +@fa-var-twitter-square: "\f081"; +@fa-var-umbrella: "\f0e9"; +@fa-var-underline: "\f0cd"; +@fa-var-undo: "\f0e2"; +@fa-var-universal-access: "\f29a"; +@fa-var-university: "\f19c"; +@fa-var-unlink: "\f127"; +@fa-var-unlock: "\f09c"; +@fa-var-unlock-alt: "\f13e"; +@fa-var-unsorted: "\f0dc"; +@fa-var-upload: "\f093"; +@fa-var-usb: "\f287"; +@fa-var-usd: "\f155"; +@fa-var-user: "\f007"; +@fa-var-user-circle: "\f2bd"; +@fa-var-user-circle-o: "\f2be"; +@fa-var-user-md: "\f0f0"; +@fa-var-user-o: "\f2c0"; +@fa-var-user-plus: "\f234"; +@fa-var-user-secret: "\f21b"; +@fa-var-user-times: "\f235"; +@fa-var-users: "\f0c0"; +@fa-var-vcard: "\f2bb"; +@fa-var-vcard-o: "\f2bc"; +@fa-var-venus: "\f221"; +@fa-var-venus-double: "\f226"; +@fa-var-venus-mars: "\f228"; +@fa-var-viacoin: "\f237"; +@fa-var-viadeo: "\f2a9"; +@fa-var-viadeo-square: "\f2aa"; +@fa-var-video-camera: "\f03d"; +@fa-var-vimeo: "\f27d"; +@fa-var-vimeo-square: "\f194"; +@fa-var-vine: "\f1ca"; +@fa-var-vk: "\f189"; +@fa-var-volume-control-phone: "\f2a0"; +@fa-var-volume-down: "\f027"; +@fa-var-volume-off: "\f026"; +@fa-var-volume-up: "\f028"; +@fa-var-warning: "\f071"; +@fa-var-wechat: "\f1d7"; +@fa-var-weibo: "\f18a"; +@fa-var-weixin: "\f1d7"; +@fa-var-whatsapp: "\f232"; +@fa-var-wheelchair: "\f193"; +@fa-var-wheelchair-alt: "\f29b"; +@fa-var-wifi: "\f1eb"; +@fa-var-wikipedia-w: "\f266"; +@fa-var-window-close: "\f2d3"; +@fa-var-window-close-o: "\f2d4"; +@fa-var-window-maximize: "\f2d0"; +@fa-var-window-minimize: "\f2d1"; +@fa-var-window-restore: "\f2d2"; +@fa-var-windows: "\f17a"; +@fa-var-won: "\f159"; +@fa-var-wordpress: "\f19a"; +@fa-var-wpbeginner: "\f297"; +@fa-var-wpexplorer: "\f2de"; +@fa-var-wpforms: "\f298"; +@fa-var-wrench: "\f0ad"; +@fa-var-xing: "\f168"; +@fa-var-xing-square: "\f169"; +@fa-var-y-combinator: "\f23b"; +@fa-var-y-combinator-square: "\f1d4"; +@fa-var-yahoo: "\f19e"; +@fa-var-yc: "\f23b"; +@fa-var-yc-square: "\f1d4"; +@fa-var-yelp: "\f1e9"; +@fa-var-yen: "\f157"; +@fa-var-yoast: "\f2b1"; +@fa-var-youtube: "\f167"; +@fa-var-youtube-play: "\f16a"; +@fa-var-youtube-square: "\f166"; + diff --git a/src/assets/fa/scss/_animated.scss b/src/assets/fa/scss/_animated.scss new file mode 100644 index 0000000..8a020db --- /dev/null +++ b/src/assets/fa/scss/_animated.scss @@ -0,0 +1,34 @@ +// Spinning Icons +// -------------------------- + +.#{$fa-css-prefix}-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +.#{$fa-css-prefix}-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} diff --git a/src/assets/fa/scss/_bordered-pulled.scss b/src/assets/fa/scss/_bordered-pulled.scss new file mode 100644 index 0000000..d4b85a0 --- /dev/null +++ b/src/assets/fa/scss/_bordered-pulled.scss @@ -0,0 +1,25 @@ +// Bordered & Pulled +// ------------------------- + +.#{$fa-css-prefix}-border { + padding: .2em .25em .15em; + border: solid .08em $fa-border-color; + border-radius: .1em; +} + +.#{$fa-css-prefix}-pull-left { float: left; } +.#{$fa-css-prefix}-pull-right { float: right; } + +.#{$fa-css-prefix} { + &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } + &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } +} + +/* Deprecated as of 4.4.0 */ +.pull-right { float: right; } +.pull-left { float: left; } + +.#{$fa-css-prefix} { + &.pull-left { margin-right: .3em; } + &.pull-right { margin-left: .3em; } +} diff --git a/src/assets/fa/scss/_core.scss b/src/assets/fa/scss/_core.scss new file mode 100644 index 0000000..7425ef8 --- /dev/null +++ b/src/assets/fa/scss/_core.scss @@ -0,0 +1,12 @@ +// Base Class Definition +// ------------------------- + +.#{$fa-css-prefix} { + display: inline-block; + font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} diff --git a/src/assets/fa/scss/_fixed-width.scss b/src/assets/fa/scss/_fixed-width.scss new file mode 100644 index 0000000..b221c98 --- /dev/null +++ b/src/assets/fa/scss/_fixed-width.scss @@ -0,0 +1,6 @@ +// Fixed Width Icons +// ------------------------- +.#{$fa-css-prefix}-fw { + width: (18em / 14); + text-align: center; +} diff --git a/src/assets/fa/scss/_icons.scss b/src/assets/fa/scss/_icons.scss new file mode 100644 index 0000000..e63e702 --- /dev/null +++ b/src/assets/fa/scss/_icons.scss @@ -0,0 +1,789 @@ +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + +.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; } +.#{$fa-css-prefix}-music:before { content: $fa-var-music; } +.#{$fa-css-prefix}-search:before { content: $fa-var-search; } +.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; } +.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; } +.#{$fa-css-prefix}-star:before { content: $fa-var-star; } +.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; } +.#{$fa-css-prefix}-user:before { content: $fa-var-user; } +.#{$fa-css-prefix}-film:before { content: $fa-var-film; } +.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; } +.#{$fa-css-prefix}-th:before { content: $fa-var-th; } +.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; } +.#{$fa-css-prefix}-check:before { content: $fa-var-check; } +.#{$fa-css-prefix}-remove:before, +.#{$fa-css-prefix}-close:before, +.#{$fa-css-prefix}-times:before { content: $fa-var-times; } +.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; } +.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; } +.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; } +.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; } +.#{$fa-css-prefix}-gear:before, +.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; } +.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; } +.#{$fa-css-prefix}-home:before { content: $fa-var-home; } +.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; } +.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; } +.#{$fa-css-prefix}-road:before { content: $fa-var-road; } +.#{$fa-css-prefix}-download:before { content: $fa-var-download; } +.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; } +.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; } +.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; } +.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; } +.#{$fa-css-prefix}-rotate-right:before, +.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; } +.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; } +.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; } +.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; } +.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; } +.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; } +.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; } +.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; } +.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; } +.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; } +.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; } +.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; } +.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; } +.#{$fa-css-prefix}-book:before { content: $fa-var-book; } +.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; } +.#{$fa-css-prefix}-print:before { content: $fa-var-print; } +.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; } +.#{$fa-css-prefix}-font:before { content: $fa-var-font; } +.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; } +.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; } +.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; } +.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; } +.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; } +.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; } +.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; } +.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; } +.#{$fa-css-prefix}-list:before { content: $fa-var-list; } +.#{$fa-css-prefix}-dedent:before, +.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; } +.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; } +.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; } +.#{$fa-css-prefix}-photo:before, +.#{$fa-css-prefix}-image:before, +.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; } +.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; } +.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; } +.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; } +.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; } +.#{$fa-css-prefix}-edit:before, +.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; } +.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; } +.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; } +.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; } +.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; } +.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; } +.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; } +.#{$fa-css-prefix}-play:before { content: $fa-var-play; } +.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; } +.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; } +.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; } +.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; } +.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; } +.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; } +.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; } +.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; } +.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; } +.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; } +.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; } +.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; } +.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; } +.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; } +.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; } +.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; } +.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; } +.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; } +.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; } +.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; } +.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; } +.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; } +.#{$fa-css-prefix}-mail-forward:before, +.#{$fa-css-prefix}-share:before { content: $fa-var-share; } +.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; } +.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; } +.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; } +.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; } +.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; } +.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; } +.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; } +.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; } +.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; } +.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; } +.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; } +.#{$fa-css-prefix}-warning:before, +.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; } +.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; } +.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; } +.#{$fa-css-prefix}-random:before { content: $fa-var-random; } +.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; } +.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; } +.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; } +.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; } +.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; } +.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; } +.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; } +.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; } +.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; } +.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; } +.#{$fa-css-prefix}-bar-chart-o:before, +.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; } +.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; } +.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; } +.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; } +.#{$fa-css-prefix}-key:before { content: $fa-var-key; } +.#{$fa-css-prefix}-gears:before, +.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; } +.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; } +.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; } +.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; } +.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; } +.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; } +.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; } +.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; } +.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; } +.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; } +.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; } +.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; } +.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; } +.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; } +.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; } +.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; } +.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; } +.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; } +.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; } +.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; } +.#{$fa-css-prefix}-facebook-f:before, +.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; } +.#{$fa-css-prefix}-github:before { content: $fa-var-github; } +.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; } +.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; } +.#{$fa-css-prefix}-feed:before, +.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; } +.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; } +.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; } +.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; } +.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; } +.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; } +.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; } +.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; } +.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; } +.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; } +.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; } +.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; } +.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; } +.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; } +.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; } +.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; } +.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; } +.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; } +.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; } +.#{$fa-css-prefix}-group:before, +.#{$fa-css-prefix}-users:before { content: $fa-var-users; } +.#{$fa-css-prefix}-chain:before, +.#{$fa-css-prefix}-link:before { content: $fa-var-link; } +.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; } +.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; } +.#{$fa-css-prefix}-cut:before, +.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; } +.#{$fa-css-prefix}-copy:before, +.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; } +.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; } +.#{$fa-css-prefix}-save:before, +.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; } +.#{$fa-css-prefix}-square:before { content: $fa-var-square; } +.#{$fa-css-prefix}-navicon:before, +.#{$fa-css-prefix}-reorder:before, +.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; } +.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; } +.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; } +.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; } +.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; } +.#{$fa-css-prefix}-table:before { content: $fa-var-table; } +.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; } +.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; } +.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; } +.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; } +.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; } +.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; } +.#{$fa-css-prefix}-money:before { content: $fa-var-money; } +.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; } +.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; } +.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; } +.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; } +.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; } +.#{$fa-css-prefix}-unsorted:before, +.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; } +.#{$fa-css-prefix}-sort-down:before, +.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; } +.#{$fa-css-prefix}-sort-up:before, +.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; } +.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; } +.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; } +.#{$fa-css-prefix}-rotate-left:before, +.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; } +.#{$fa-css-prefix}-legal:before, +.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; } +.#{$fa-css-prefix}-dashboard:before, +.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; } +.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; } +.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; } +.#{$fa-css-prefix}-flash:before, +.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; } +.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; } +.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; } +.#{$fa-css-prefix}-paste:before, +.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; } +.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; } +.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; } +.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; } +.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; } +.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; } +.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; } +.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; } +.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; } +.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; } +.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; } +.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; } +.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; } +.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; } +.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; } +.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; } +.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; } +.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; } +.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; } +.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; } +.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; } +.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; } +.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; } +.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; } +.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; } +.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; } +.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; } +.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; } +.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; } +.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; } +.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; } +.#{$fa-css-prefix}-mobile-phone:before, +.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; } +.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; } +.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; } +.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; } +.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; } +.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; } +.#{$fa-css-prefix}-mail-reply:before, +.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; } +.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; } +.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; } +.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; } +.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; } +.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; } +.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; } +.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; } +.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; } +.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; } +.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; } +.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; } +.#{$fa-css-prefix}-code:before { content: $fa-var-code; } +.#{$fa-css-prefix}-mail-reply-all:before, +.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; } +.#{$fa-css-prefix}-star-half-empty:before, +.#{$fa-css-prefix}-star-half-full:before, +.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; } +.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; } +.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; } +.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; } +.#{$fa-css-prefix}-unlink:before, +.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; } +.#{$fa-css-prefix}-question:before { content: $fa-var-question; } +.#{$fa-css-prefix}-info:before { content: $fa-var-info; } +.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; } +.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; } +.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; } +.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; } +.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; } +.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; } +.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; } +.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; } +.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; } +.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; } +.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; } +.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; } +.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; } +.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; } +.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; } +.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; } +.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; } +.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; } +.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; } +.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; } +.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; } +.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; } +.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; } +.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; } +.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; } +.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; } +.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; } +.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; } +.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; } +.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; } +.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; } +.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; } +.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; } +.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; } +.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; } +.#{$fa-css-prefix}-toggle-down:before, +.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; } +.#{$fa-css-prefix}-toggle-up:before, +.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; } +.#{$fa-css-prefix}-toggle-right:before, +.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; } +.#{$fa-css-prefix}-euro:before, +.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; } +.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; } +.#{$fa-css-prefix}-dollar:before, +.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; } +.#{$fa-css-prefix}-rupee:before, +.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; } +.#{$fa-css-prefix}-cny:before, +.#{$fa-css-prefix}-rmb:before, +.#{$fa-css-prefix}-yen:before, +.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; } +.#{$fa-css-prefix}-ruble:before, +.#{$fa-css-prefix}-rouble:before, +.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; } +.#{$fa-css-prefix}-won:before, +.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; } +.#{$fa-css-prefix}-bitcoin:before, +.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; } +.#{$fa-css-prefix}-file:before { content: $fa-var-file; } +.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; } +.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; } +.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; } +.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; } +.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; } +.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; } +.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; } +.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; } +.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; } +.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; } +.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; } +.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; } +.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; } +.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; } +.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; } +.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; } +.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; } +.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; } +.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; } +.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; } +.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; } +.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; } +.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; } +.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; } +.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; } +.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; } +.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; } +.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; } +.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; } +.#{$fa-css-prefix}-android:before { content: $fa-var-android; } +.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; } +.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; } +.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; } +.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; } +.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; } +.#{$fa-css-prefix}-female:before { content: $fa-var-female; } +.#{$fa-css-prefix}-male:before { content: $fa-var-male; } +.#{$fa-css-prefix}-gittip:before, +.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; } +.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; } +.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; } +.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; } +.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; } +.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; } +.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; } +.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; } +.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; } +.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; } +.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; } +.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; } +.#{$fa-css-prefix}-toggle-left:before, +.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; } +.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; } +.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; } +.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; } +.#{$fa-css-prefix}-turkish-lira:before, +.#{$fa-css-prefix}-try:before { content: $fa-var-try; } +.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; } +.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; } +.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; } +.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; } +.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; } +.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; } +.#{$fa-css-prefix}-institution:before, +.#{$fa-css-prefix}-bank:before, +.#{$fa-css-prefix}-university:before { content: $fa-var-university; } +.#{$fa-css-prefix}-mortar-board:before, +.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; } +.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; } +.#{$fa-css-prefix}-google:before { content: $fa-var-google; } +.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; } +.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; } +.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; } +.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; } +.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; } +.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; } +.#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; } +.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; } +.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; } +.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; } +.#{$fa-css-prefix}-language:before { content: $fa-var-language; } +.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; } +.#{$fa-css-prefix}-building:before { content: $fa-var-building; } +.#{$fa-css-prefix}-child:before { content: $fa-var-child; } +.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; } +.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; } +.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; } +.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; } +.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; } +.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; } +.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; } +.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; } +.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; } +.#{$fa-css-prefix}-automobile:before, +.#{$fa-css-prefix}-car:before { content: $fa-var-car; } +.#{$fa-css-prefix}-cab:before, +.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; } +.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; } +.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; } +.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; } +.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; } +.#{$fa-css-prefix}-database:before { content: $fa-var-database; } +.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; } +.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; } +.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; } +.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; } +.#{$fa-css-prefix}-file-photo-o:before, +.#{$fa-css-prefix}-file-picture-o:before, +.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; } +.#{$fa-css-prefix}-file-zip-o:before, +.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; } +.#{$fa-css-prefix}-file-sound-o:before, +.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; } +.#{$fa-css-prefix}-file-movie-o:before, +.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; } +.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; } +.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; } +.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; } +.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; } +.#{$fa-css-prefix}-life-bouy:before, +.#{$fa-css-prefix}-life-buoy:before, +.#{$fa-css-prefix}-life-saver:before, +.#{$fa-css-prefix}-support:before, +.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; } +.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; } +.#{$fa-css-prefix}-ra:before, +.#{$fa-css-prefix}-resistance:before, +.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; } +.#{$fa-css-prefix}-ge:before, +.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; } +.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; } +.#{$fa-css-prefix}-git:before { content: $fa-var-git; } +.#{$fa-css-prefix}-y-combinator-square:before, +.#{$fa-css-prefix}-yc-square:before, +.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; } +.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; } +.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; } +.#{$fa-css-prefix}-wechat:before, +.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; } +.#{$fa-css-prefix}-send:before, +.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; } +.#{$fa-css-prefix}-send-o:before, +.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; } +.#{$fa-css-prefix}-history:before { content: $fa-var-history; } +.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; } +.#{$fa-css-prefix}-header:before { content: $fa-var-header; } +.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; } +.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; } +.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; } +.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; } +.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; } +.#{$fa-css-prefix}-soccer-ball-o:before, +.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; } +.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; } +.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; } +.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; } +.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; } +.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; } +.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; } +.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; } +.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; } +.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; } +.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; } +.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; } +.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; } +.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; } +.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; } +.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; } +.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; } +.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; } +.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; } +.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; } +.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; } +.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; } +.#{$fa-css-prefix}-at:before { content: $fa-var-at; } +.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; } +.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; } +.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; } +.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; } +.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; } +.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; } +.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; } +.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; } +.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; } +.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; } +.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; } +.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; } +.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; } +.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; } +.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; } +.#{$fa-css-prefix}-shekel:before, +.#{$fa-css-prefix}-sheqel:before, +.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; } +.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; } +.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; } +.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; } +.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; } +.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; } +.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; } +.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; } +.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; } +.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; } +.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; } +.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; } +.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; } +.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; } +.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; } +.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; } +.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; } +.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; } +.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; } +.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; } +.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; } +.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; } +.#{$fa-css-prefix}-intersex:before, +.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; } +.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; } +.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; } +.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; } +.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; } +.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; } +.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; } +.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; } +.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; } +.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; } +.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; } +.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; } +.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; } +.#{$fa-css-prefix}-server:before { content: $fa-var-server; } +.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; } +.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; } +.#{$fa-css-prefix}-hotel:before, +.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; } +.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; } +.#{$fa-css-prefix}-train:before { content: $fa-var-train; } +.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; } +.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; } +.#{$fa-css-prefix}-yc:before, +.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; } +.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; } +.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; } +.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; } +.#{$fa-css-prefix}-battery-4:before, +.#{$fa-css-prefix}-battery:before, +.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; } +.#{$fa-css-prefix}-battery-3:before, +.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; } +.#{$fa-css-prefix}-battery-2:before, +.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; } +.#{$fa-css-prefix}-battery-1:before, +.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; } +.#{$fa-css-prefix}-battery-0:before, +.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; } +.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; } +.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; } +.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; } +.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; } +.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; } +.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; } +.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; } +.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; } +.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; } +.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; } +.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; } +.#{$fa-css-prefix}-hourglass-1:before, +.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; } +.#{$fa-css-prefix}-hourglass-2:before, +.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; } +.#{$fa-css-prefix}-hourglass-3:before, +.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; } +.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; } +.#{$fa-css-prefix}-hand-grab-o:before, +.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; } +.#{$fa-css-prefix}-hand-stop-o:before, +.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; } +.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; } +.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; } +.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; } +.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; } +.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; } +.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; } +.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; } +.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; } +.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; } +.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; } +.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; } +.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; } +.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; } +.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; } +.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; } +.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; } +.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; } +.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; } +.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; } +.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; } +.#{$fa-css-prefix}-tv:before, +.#{$fa-css-prefix}-television:before { content: $fa-var-television; } +.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; } +.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; } +.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; } +.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; } +.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; } +.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; } +.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; } +.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; } +.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; } +.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; } +.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; } +.#{$fa-css-prefix}-map:before { content: $fa-var-map; } +.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; } +.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; } +.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; } +.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; } +.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; } +.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; } +.#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; } +.#{$fa-css-prefix}-edge:before { content: $fa-var-edge; } +.#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; } +.#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; } +.#{$fa-css-prefix}-modx:before { content: $fa-var-modx; } +.#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; } +.#{$fa-css-prefix}-usb:before { content: $fa-var-usb; } +.#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; } +.#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; } +.#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; } +.#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; } +.#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; } +.#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; } +.#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; } +.#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; } +.#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; } +.#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; } +.#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; } +.#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; } +.#{$fa-css-prefix}-percent:before { content: $fa-var-percent; } +.#{$fa-css-prefix}-gitlab:before { content: $fa-var-gitlab; } +.#{$fa-css-prefix}-wpbeginner:before { content: $fa-var-wpbeginner; } +.#{$fa-css-prefix}-wpforms:before { content: $fa-var-wpforms; } +.#{$fa-css-prefix}-envira:before { content: $fa-var-envira; } +.#{$fa-css-prefix}-universal-access:before { content: $fa-var-universal-access; } +.#{$fa-css-prefix}-wheelchair-alt:before { content: $fa-var-wheelchair-alt; } +.#{$fa-css-prefix}-question-circle-o:before { content: $fa-var-question-circle-o; } +.#{$fa-css-prefix}-blind:before { content: $fa-var-blind; } +.#{$fa-css-prefix}-audio-description:before { content: $fa-var-audio-description; } +.#{$fa-css-prefix}-volume-control-phone:before { content: $fa-var-volume-control-phone; } +.#{$fa-css-prefix}-braille:before { content: $fa-var-braille; } +.#{$fa-css-prefix}-assistive-listening-systems:before { content: $fa-var-assistive-listening-systems; } +.#{$fa-css-prefix}-asl-interpreting:before, +.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: $fa-var-american-sign-language-interpreting; } +.#{$fa-css-prefix}-deafness:before, +.#{$fa-css-prefix}-hard-of-hearing:before, +.#{$fa-css-prefix}-deaf:before { content: $fa-var-deaf; } +.#{$fa-css-prefix}-glide:before { content: $fa-var-glide; } +.#{$fa-css-prefix}-glide-g:before { content: $fa-var-glide-g; } +.#{$fa-css-prefix}-signing:before, +.#{$fa-css-prefix}-sign-language:before { content: $fa-var-sign-language; } +.#{$fa-css-prefix}-low-vision:before { content: $fa-var-low-vision; } +.#{$fa-css-prefix}-viadeo:before { content: $fa-var-viadeo; } +.#{$fa-css-prefix}-viadeo-square:before { content: $fa-var-viadeo-square; } +.#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; } +.#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; } +.#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; } +.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; } +.#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; } +.#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; } +.#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; } +.#{$fa-css-prefix}-google-plus-circle:before, +.#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; } +.#{$fa-css-prefix}-fa:before, +.#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; } +.#{$fa-css-prefix}-handshake-o:before { content: $fa-var-handshake-o; } +.#{$fa-css-prefix}-envelope-open:before { content: $fa-var-envelope-open; } +.#{$fa-css-prefix}-envelope-open-o:before { content: $fa-var-envelope-open-o; } +.#{$fa-css-prefix}-linode:before { content: $fa-var-linode; } +.#{$fa-css-prefix}-address-book:before { content: $fa-var-address-book; } +.#{$fa-css-prefix}-address-book-o:before { content: $fa-var-address-book-o; } +.#{$fa-css-prefix}-vcard:before, +.#{$fa-css-prefix}-address-card:before { content: $fa-var-address-card; } +.#{$fa-css-prefix}-vcard-o:before, +.#{$fa-css-prefix}-address-card-o:before { content: $fa-var-address-card-o; } +.#{$fa-css-prefix}-user-circle:before { content: $fa-var-user-circle; } +.#{$fa-css-prefix}-user-circle-o:before { content: $fa-var-user-circle-o; } +.#{$fa-css-prefix}-user-o:before { content: $fa-var-user-o; } +.#{$fa-css-prefix}-id-badge:before { content: $fa-var-id-badge; } +.#{$fa-css-prefix}-drivers-license:before, +.#{$fa-css-prefix}-id-card:before { content: $fa-var-id-card; } +.#{$fa-css-prefix}-drivers-license-o:before, +.#{$fa-css-prefix}-id-card-o:before { content: $fa-var-id-card-o; } +.#{$fa-css-prefix}-quora:before { content: $fa-var-quora; } +.#{$fa-css-prefix}-free-code-camp:before { content: $fa-var-free-code-camp; } +.#{$fa-css-prefix}-telegram:before { content: $fa-var-telegram; } +.#{$fa-css-prefix}-thermometer-4:before, +.#{$fa-css-prefix}-thermometer:before, +.#{$fa-css-prefix}-thermometer-full:before { content: $fa-var-thermometer-full; } +.#{$fa-css-prefix}-thermometer-3:before, +.#{$fa-css-prefix}-thermometer-three-quarters:before { content: $fa-var-thermometer-three-quarters; } +.#{$fa-css-prefix}-thermometer-2:before, +.#{$fa-css-prefix}-thermometer-half:before { content: $fa-var-thermometer-half; } +.#{$fa-css-prefix}-thermometer-1:before, +.#{$fa-css-prefix}-thermometer-quarter:before { content: $fa-var-thermometer-quarter; } +.#{$fa-css-prefix}-thermometer-0:before, +.#{$fa-css-prefix}-thermometer-empty:before { content: $fa-var-thermometer-empty; } +.#{$fa-css-prefix}-shower:before { content: $fa-var-shower; } +.#{$fa-css-prefix}-bathtub:before, +.#{$fa-css-prefix}-s15:before, +.#{$fa-css-prefix}-bath:before { content: $fa-var-bath; } +.#{$fa-css-prefix}-podcast:before { content: $fa-var-podcast; } +.#{$fa-css-prefix}-window-maximize:before { content: $fa-var-window-maximize; } +.#{$fa-css-prefix}-window-minimize:before { content: $fa-var-window-minimize; } +.#{$fa-css-prefix}-window-restore:before { content: $fa-var-window-restore; } +.#{$fa-css-prefix}-times-rectangle:before, +.#{$fa-css-prefix}-window-close:before { content: $fa-var-window-close; } +.#{$fa-css-prefix}-times-rectangle-o:before, +.#{$fa-css-prefix}-window-close-o:before { content: $fa-var-window-close-o; } +.#{$fa-css-prefix}-bandcamp:before { content: $fa-var-bandcamp; } +.#{$fa-css-prefix}-grav:before { content: $fa-var-grav; } +.#{$fa-css-prefix}-etsy:before { content: $fa-var-etsy; } +.#{$fa-css-prefix}-imdb:before { content: $fa-var-imdb; } +.#{$fa-css-prefix}-ravelry:before { content: $fa-var-ravelry; } +.#{$fa-css-prefix}-eercast:before { content: $fa-var-eercast; } +.#{$fa-css-prefix}-microchip:before { content: $fa-var-microchip; } +.#{$fa-css-prefix}-snowflake-o:before { content: $fa-var-snowflake-o; } +.#{$fa-css-prefix}-superpowers:before { content: $fa-var-superpowers; } +.#{$fa-css-prefix}-wpexplorer:before { content: $fa-var-wpexplorer; } +.#{$fa-css-prefix}-meetup:before { content: $fa-var-meetup; } diff --git a/src/assets/fa/scss/_larger.scss b/src/assets/fa/scss/_larger.scss new file mode 100644 index 0000000..41e9a81 --- /dev/null +++ b/src/assets/fa/scss/_larger.scss @@ -0,0 +1,13 @@ +// Icon Sizes +// ------------------------- + +/* makes the font 33% larger relative to the icon container */ +.#{$fa-css-prefix}-lg { + font-size: (4em / 3); + line-height: (3em / 4); + vertical-align: -15%; +} +.#{$fa-css-prefix}-2x { font-size: 2em; } +.#{$fa-css-prefix}-3x { font-size: 3em; } +.#{$fa-css-prefix}-4x { font-size: 4em; } +.#{$fa-css-prefix}-5x { font-size: 5em; } diff --git a/src/assets/fa/scss/_list.scss b/src/assets/fa/scss/_list.scss new file mode 100644 index 0000000..7d1e4d5 --- /dev/null +++ b/src/assets/fa/scss/_list.scss @@ -0,0 +1,19 @@ +// List Icons +// ------------------------- + +.#{$fa-css-prefix}-ul { + padding-left: 0; + margin-left: $fa-li-width; + list-style-type: none; + > li { position: relative; } +} +.#{$fa-css-prefix}-li { + position: absolute; + left: -$fa-li-width; + width: $fa-li-width; + top: (2em / 14); + text-align: center; + &.#{$fa-css-prefix}-lg { + left: -$fa-li-width + (4em / 14); + } +} diff --git a/src/assets/fa/scss/_mixins.scss b/src/assets/fa/scss/_mixins.scss new file mode 100644 index 0000000..c3bbd57 --- /dev/null +++ b/src/assets/fa/scss/_mixins.scss @@ -0,0 +1,60 @@ +// Mixins +// -------------------------- + +@mixin fa-icon() { + display: inline-block; + font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} + +@mixin fa-icon-rotate($degrees, $rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; + -webkit-transform: rotate($degrees); + -ms-transform: rotate($degrees); + transform: rotate($degrees); +} + +@mixin fa-icon-flip($horiz, $vert, $rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; + -webkit-transform: scale($horiz, $vert); + -ms-transform: scale($horiz, $vert); + transform: scale($horiz, $vert); +} + + +// Only display content to screen readers. A la Bootstrap 4. +// +// See: http://a11yproject.com/posts/how-to-hide-content/ + +@mixin sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; +} + +// Use in conjunction with .sr-only to only display content when it's focused. +// +// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// +// Credit: HTML5 Boilerplate + +@mixin sr-only-focusable { + &:active, + &:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; + } +} diff --git a/src/assets/fa/scss/_path.scss b/src/assets/fa/scss/_path.scss new file mode 100644 index 0000000..bb457c2 --- /dev/null +++ b/src/assets/fa/scss/_path.scss @@ -0,0 +1,15 @@ +/* FONT PATH + * -------------------------- */ + +@font-face { + font-family: 'FontAwesome'; + src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); + src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), + url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), + url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), + url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), + url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); +// src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} diff --git a/src/assets/fa/scss/_rotated-flipped.scss b/src/assets/fa/scss/_rotated-flipped.scss new file mode 100644 index 0000000..a3558fd --- /dev/null +++ b/src/assets/fa/scss/_rotated-flipped.scss @@ -0,0 +1,20 @@ +// Rotated & Flipped Icons +// ------------------------- + +.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } +.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } +.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } + +.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } +.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } + +// Hook for IE8-9 +// ------------------------- + +:root .#{$fa-css-prefix}-rotate-90, +:root .#{$fa-css-prefix}-rotate-180, +:root .#{$fa-css-prefix}-rotate-270, +:root .#{$fa-css-prefix}-flip-horizontal, +:root .#{$fa-css-prefix}-flip-vertical { + filter: none; +} diff --git a/src/assets/fa/scss/_screen-reader.scss b/src/assets/fa/scss/_screen-reader.scss new file mode 100644 index 0000000..637426f --- /dev/null +++ b/src/assets/fa/scss/_screen-reader.scss @@ -0,0 +1,5 @@ +// Screen Readers +// ------------------------- + +.sr-only { @include sr-only(); } +.sr-only-focusable { @include sr-only-focusable(); } diff --git a/src/assets/fa/scss/_stacked.scss b/src/assets/fa/scss/_stacked.scss new file mode 100644 index 0000000..aef7403 --- /dev/null +++ b/src/assets/fa/scss/_stacked.scss @@ -0,0 +1,20 @@ +// Stacked Icons +// ------------------------- + +.#{$fa-css-prefix}-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.#{$fa-css-prefix}-stack-1x { line-height: inherit; } +.#{$fa-css-prefix}-stack-2x { font-size: 2em; } +.#{$fa-css-prefix}-inverse { color: $fa-inverse; } diff --git a/src/assets/fa/scss/_variables.scss b/src/assets/fa/scss/_variables.scss new file mode 100644 index 0000000..498fc4a --- /dev/null +++ b/src/assets/fa/scss/_variables.scss @@ -0,0 +1,800 @@ +// Variables +// -------------------------- + +$fa-font-path: "../fonts" !default; +$fa-font-size-base: 14px !default; +$fa-line-height-base: 1 !default; +//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts" !default; // for referencing Bootstrap CDN font files directly +$fa-css-prefix: fa !default; +$fa-version: "4.7.0" !default; +$fa-border-color: #eee !default; +$fa-inverse: #fff !default; +$fa-li-width: (30em / 14) !default; + +$fa-var-500px: "\f26e"; +$fa-var-address-book: "\f2b9"; +$fa-var-address-book-o: "\f2ba"; +$fa-var-address-card: "\f2bb"; +$fa-var-address-card-o: "\f2bc"; +$fa-var-adjust: "\f042"; +$fa-var-adn: "\f170"; +$fa-var-align-center: "\f037"; +$fa-var-align-justify: "\f039"; +$fa-var-align-left: "\f036"; +$fa-var-align-right: "\f038"; +$fa-var-amazon: "\f270"; +$fa-var-ambulance: "\f0f9"; +$fa-var-american-sign-language-interpreting: "\f2a3"; +$fa-var-anchor: "\f13d"; +$fa-var-android: "\f17b"; +$fa-var-angellist: "\f209"; +$fa-var-angle-double-down: "\f103"; +$fa-var-angle-double-left: "\f100"; +$fa-var-angle-double-right: "\f101"; +$fa-var-angle-double-up: "\f102"; +$fa-var-angle-down: "\f107"; +$fa-var-angle-left: "\f104"; +$fa-var-angle-right: "\f105"; +$fa-var-angle-up: "\f106"; +$fa-var-apple: "\f179"; +$fa-var-archive: "\f187"; +$fa-var-area-chart: "\f1fe"; +$fa-var-arrow-circle-down: "\f0ab"; +$fa-var-arrow-circle-left: "\f0a8"; +$fa-var-arrow-circle-o-down: "\f01a"; +$fa-var-arrow-circle-o-left: "\f190"; +$fa-var-arrow-circle-o-right: "\f18e"; +$fa-var-arrow-circle-o-up: "\f01b"; +$fa-var-arrow-circle-right: "\f0a9"; +$fa-var-arrow-circle-up: "\f0aa"; +$fa-var-arrow-down: "\f063"; +$fa-var-arrow-left: "\f060"; +$fa-var-arrow-right: "\f061"; +$fa-var-arrow-up: "\f062"; +$fa-var-arrows: "\f047"; +$fa-var-arrows-alt: "\f0b2"; +$fa-var-arrows-h: "\f07e"; +$fa-var-arrows-v: "\f07d"; +$fa-var-asl-interpreting: "\f2a3"; +$fa-var-assistive-listening-systems: "\f2a2"; +$fa-var-asterisk: "\f069"; +$fa-var-at: "\f1fa"; +$fa-var-audio-description: "\f29e"; +$fa-var-automobile: "\f1b9"; +$fa-var-backward: "\f04a"; +$fa-var-balance-scale: "\f24e"; +$fa-var-ban: "\f05e"; +$fa-var-bandcamp: "\f2d5"; +$fa-var-bank: "\f19c"; +$fa-var-bar-chart: "\f080"; +$fa-var-bar-chart-o: "\f080"; +$fa-var-barcode: "\f02a"; +$fa-var-bars: "\f0c9"; +$fa-var-bath: "\f2cd"; +$fa-var-bathtub: "\f2cd"; +$fa-var-battery: "\f240"; +$fa-var-battery-0: "\f244"; +$fa-var-battery-1: "\f243"; +$fa-var-battery-2: "\f242"; +$fa-var-battery-3: "\f241"; +$fa-var-battery-4: "\f240"; +$fa-var-battery-empty: "\f244"; +$fa-var-battery-full: "\f240"; +$fa-var-battery-half: "\f242"; +$fa-var-battery-quarter: "\f243"; +$fa-var-battery-three-quarters: "\f241"; +$fa-var-bed: "\f236"; +$fa-var-beer: "\f0fc"; +$fa-var-behance: "\f1b4"; +$fa-var-behance-square: "\f1b5"; +$fa-var-bell: "\f0f3"; +$fa-var-bell-o: "\f0a2"; +$fa-var-bell-slash: "\f1f6"; +$fa-var-bell-slash-o: "\f1f7"; +$fa-var-bicycle: "\f206"; +$fa-var-binoculars: "\f1e5"; +$fa-var-birthday-cake: "\f1fd"; +$fa-var-bitbucket: "\f171"; +$fa-var-bitbucket-square: "\f172"; +$fa-var-bitcoin: "\f15a"; +$fa-var-black-tie: "\f27e"; +$fa-var-blind: "\f29d"; +$fa-var-bluetooth: "\f293"; +$fa-var-bluetooth-b: "\f294"; +$fa-var-bold: "\f032"; +$fa-var-bolt: "\f0e7"; +$fa-var-bomb: "\f1e2"; +$fa-var-book: "\f02d"; +$fa-var-bookmark: "\f02e"; +$fa-var-bookmark-o: "\f097"; +$fa-var-braille: "\f2a1"; +$fa-var-briefcase: "\f0b1"; +$fa-var-btc: "\f15a"; +$fa-var-bug: "\f188"; +$fa-var-building: "\f1ad"; +$fa-var-building-o: "\f0f7"; +$fa-var-bullhorn: "\f0a1"; +$fa-var-bullseye: "\f140"; +$fa-var-bus: "\f207"; +$fa-var-buysellads: "\f20d"; +$fa-var-cab: "\f1ba"; +$fa-var-calculator: "\f1ec"; +$fa-var-calendar: "\f073"; +$fa-var-calendar-check-o: "\f274"; +$fa-var-calendar-minus-o: "\f272"; +$fa-var-calendar-o: "\f133"; +$fa-var-calendar-plus-o: "\f271"; +$fa-var-calendar-times-o: "\f273"; +$fa-var-camera: "\f030"; +$fa-var-camera-retro: "\f083"; +$fa-var-car: "\f1b9"; +$fa-var-caret-down: "\f0d7"; +$fa-var-caret-left: "\f0d9"; +$fa-var-caret-right: "\f0da"; +$fa-var-caret-square-o-down: "\f150"; +$fa-var-caret-square-o-left: "\f191"; +$fa-var-caret-square-o-right: "\f152"; +$fa-var-caret-square-o-up: "\f151"; +$fa-var-caret-up: "\f0d8"; +$fa-var-cart-arrow-down: "\f218"; +$fa-var-cart-plus: "\f217"; +$fa-var-cc: "\f20a"; +$fa-var-cc-amex: "\f1f3"; +$fa-var-cc-diners-club: "\f24c"; +$fa-var-cc-discover: "\f1f2"; +$fa-var-cc-jcb: "\f24b"; +$fa-var-cc-mastercard: "\f1f1"; +$fa-var-cc-paypal: "\f1f4"; +$fa-var-cc-stripe: "\f1f5"; +$fa-var-cc-visa: "\f1f0"; +$fa-var-certificate: "\f0a3"; +$fa-var-chain: "\f0c1"; +$fa-var-chain-broken: "\f127"; +$fa-var-check: "\f00c"; +$fa-var-check-circle: "\f058"; +$fa-var-check-circle-o: "\f05d"; +$fa-var-check-square: "\f14a"; +$fa-var-check-square-o: "\f046"; +$fa-var-chevron-circle-down: "\f13a"; +$fa-var-chevron-circle-left: "\f137"; +$fa-var-chevron-circle-right: "\f138"; +$fa-var-chevron-circle-up: "\f139"; +$fa-var-chevron-down: "\f078"; +$fa-var-chevron-left: "\f053"; +$fa-var-chevron-right: "\f054"; +$fa-var-chevron-up: "\f077"; +$fa-var-child: "\f1ae"; +$fa-var-chrome: "\f268"; +$fa-var-circle: "\f111"; +$fa-var-circle-o: "\f10c"; +$fa-var-circle-o-notch: "\f1ce"; +$fa-var-circle-thin: "\f1db"; +$fa-var-clipboard: "\f0ea"; +$fa-var-clock-o: "\f017"; +$fa-var-clone: "\f24d"; +$fa-var-close: "\f00d"; +$fa-var-cloud: "\f0c2"; +$fa-var-cloud-download: "\f0ed"; +$fa-var-cloud-upload: "\f0ee"; +$fa-var-cny: "\f157"; +$fa-var-code: "\f121"; +$fa-var-code-fork: "\f126"; +$fa-var-codepen: "\f1cb"; +$fa-var-codiepie: "\f284"; +$fa-var-coffee: "\f0f4"; +$fa-var-cog: "\f013"; +$fa-var-cogs: "\f085"; +$fa-var-columns: "\f0db"; +$fa-var-comment: "\f075"; +$fa-var-comment-o: "\f0e5"; +$fa-var-commenting: "\f27a"; +$fa-var-commenting-o: "\f27b"; +$fa-var-comments: "\f086"; +$fa-var-comments-o: "\f0e6"; +$fa-var-compass: "\f14e"; +$fa-var-compress: "\f066"; +$fa-var-connectdevelop: "\f20e"; +$fa-var-contao: "\f26d"; +$fa-var-copy: "\f0c5"; +$fa-var-copyright: "\f1f9"; +$fa-var-creative-commons: "\f25e"; +$fa-var-credit-card: "\f09d"; +$fa-var-credit-card-alt: "\f283"; +$fa-var-crop: "\f125"; +$fa-var-crosshairs: "\f05b"; +$fa-var-css3: "\f13c"; +$fa-var-cube: "\f1b2"; +$fa-var-cubes: "\f1b3"; +$fa-var-cut: "\f0c4"; +$fa-var-cutlery: "\f0f5"; +$fa-var-dashboard: "\f0e4"; +$fa-var-dashcube: "\f210"; +$fa-var-database: "\f1c0"; +$fa-var-deaf: "\f2a4"; +$fa-var-deafness: "\f2a4"; +$fa-var-dedent: "\f03b"; +$fa-var-delicious: "\f1a5"; +$fa-var-desktop: "\f108"; +$fa-var-deviantart: "\f1bd"; +$fa-var-diamond: "\f219"; +$fa-var-digg: "\f1a6"; +$fa-var-dollar: "\f155"; +$fa-var-dot-circle-o: "\f192"; +$fa-var-download: "\f019"; +$fa-var-dribbble: "\f17d"; +$fa-var-drivers-license: "\f2c2"; +$fa-var-drivers-license-o: "\f2c3"; +$fa-var-dropbox: "\f16b"; +$fa-var-drupal: "\f1a9"; +$fa-var-edge: "\f282"; +$fa-var-edit: "\f044"; +$fa-var-eercast: "\f2da"; +$fa-var-eject: "\f052"; +$fa-var-ellipsis-h: "\f141"; +$fa-var-ellipsis-v: "\f142"; +$fa-var-empire: "\f1d1"; +$fa-var-envelope: "\f0e0"; +$fa-var-envelope-o: "\f003"; +$fa-var-envelope-open: "\f2b6"; +$fa-var-envelope-open-o: "\f2b7"; +$fa-var-envelope-square: "\f199"; +$fa-var-envira: "\f299"; +$fa-var-eraser: "\f12d"; +$fa-var-etsy: "\f2d7"; +$fa-var-eur: "\f153"; +$fa-var-euro: "\f153"; +$fa-var-exchange: "\f0ec"; +$fa-var-exclamation: "\f12a"; +$fa-var-exclamation-circle: "\f06a"; +$fa-var-exclamation-triangle: "\f071"; +$fa-var-expand: "\f065"; +$fa-var-expeditedssl: "\f23e"; +$fa-var-external-link: "\f08e"; +$fa-var-external-link-square: "\f14c"; +$fa-var-eye: "\f06e"; +$fa-var-eye-slash: "\f070"; +$fa-var-eyedropper: "\f1fb"; +$fa-var-fa: "\f2b4"; +$fa-var-facebook: "\f09a"; +$fa-var-facebook-f: "\f09a"; +$fa-var-facebook-official: "\f230"; +$fa-var-facebook-square: "\f082"; +$fa-var-fast-backward: "\f049"; +$fa-var-fast-forward: "\f050"; +$fa-var-fax: "\f1ac"; +$fa-var-feed: "\f09e"; +$fa-var-female: "\f182"; +$fa-var-fighter-jet: "\f0fb"; +$fa-var-file: "\f15b"; +$fa-var-file-archive-o: "\f1c6"; +$fa-var-file-audio-o: "\f1c7"; +$fa-var-file-code-o: "\f1c9"; +$fa-var-file-excel-o: "\f1c3"; +$fa-var-file-image-o: "\f1c5"; +$fa-var-file-movie-o: "\f1c8"; +$fa-var-file-o: "\f016"; +$fa-var-file-pdf-o: "\f1c1"; +$fa-var-file-photo-o: "\f1c5"; +$fa-var-file-picture-o: "\f1c5"; +$fa-var-file-powerpoint-o: "\f1c4"; +$fa-var-file-sound-o: "\f1c7"; +$fa-var-file-text: "\f15c"; +$fa-var-file-text-o: "\f0f6"; +$fa-var-file-video-o: "\f1c8"; +$fa-var-file-word-o: "\f1c2"; +$fa-var-file-zip-o: "\f1c6"; +$fa-var-files-o: "\f0c5"; +$fa-var-film: "\f008"; +$fa-var-filter: "\f0b0"; +$fa-var-fire: "\f06d"; +$fa-var-fire-extinguisher: "\f134"; +$fa-var-firefox: "\f269"; +$fa-var-first-order: "\f2b0"; +$fa-var-flag: "\f024"; +$fa-var-flag-checkered: "\f11e"; +$fa-var-flag-o: "\f11d"; +$fa-var-flash: "\f0e7"; +$fa-var-flask: "\f0c3"; +$fa-var-flickr: "\f16e"; +$fa-var-floppy-o: "\f0c7"; +$fa-var-folder: "\f07b"; +$fa-var-folder-o: "\f114"; +$fa-var-folder-open: "\f07c"; +$fa-var-folder-open-o: "\f115"; +$fa-var-font: "\f031"; +$fa-var-font-awesome: "\f2b4"; +$fa-var-fonticons: "\f280"; +$fa-var-fort-awesome: "\f286"; +$fa-var-forumbee: "\f211"; +$fa-var-forward: "\f04e"; +$fa-var-foursquare: "\f180"; +$fa-var-free-code-camp: "\f2c5"; +$fa-var-frown-o: "\f119"; +$fa-var-futbol-o: "\f1e3"; +$fa-var-gamepad: "\f11b"; +$fa-var-gavel: "\f0e3"; +$fa-var-gbp: "\f154"; +$fa-var-ge: "\f1d1"; +$fa-var-gear: "\f013"; +$fa-var-gears: "\f085"; +$fa-var-genderless: "\f22d"; +$fa-var-get-pocket: "\f265"; +$fa-var-gg: "\f260"; +$fa-var-gg-circle: "\f261"; +$fa-var-gift: "\f06b"; +$fa-var-git: "\f1d3"; +$fa-var-git-square: "\f1d2"; +$fa-var-github: "\f09b"; +$fa-var-github-alt: "\f113"; +$fa-var-github-square: "\f092"; +$fa-var-gitlab: "\f296"; +$fa-var-gittip: "\f184"; +$fa-var-glass: "\f000"; +$fa-var-glide: "\f2a5"; +$fa-var-glide-g: "\f2a6"; +$fa-var-globe: "\f0ac"; +$fa-var-google: "\f1a0"; +$fa-var-google-plus: "\f0d5"; +$fa-var-google-plus-circle: "\f2b3"; +$fa-var-google-plus-official: "\f2b3"; +$fa-var-google-plus-square: "\f0d4"; +$fa-var-google-wallet: "\f1ee"; +$fa-var-graduation-cap: "\f19d"; +$fa-var-gratipay: "\f184"; +$fa-var-grav: "\f2d6"; +$fa-var-group: "\f0c0"; +$fa-var-h-square: "\f0fd"; +$fa-var-hacker-news: "\f1d4"; +$fa-var-hand-grab-o: "\f255"; +$fa-var-hand-lizard-o: "\f258"; +$fa-var-hand-o-down: "\f0a7"; +$fa-var-hand-o-left: "\f0a5"; +$fa-var-hand-o-right: "\f0a4"; +$fa-var-hand-o-up: "\f0a6"; +$fa-var-hand-paper-o: "\f256"; +$fa-var-hand-peace-o: "\f25b"; +$fa-var-hand-pointer-o: "\f25a"; +$fa-var-hand-rock-o: "\f255"; +$fa-var-hand-scissors-o: "\f257"; +$fa-var-hand-spock-o: "\f259"; +$fa-var-hand-stop-o: "\f256"; +$fa-var-handshake-o: "\f2b5"; +$fa-var-hard-of-hearing: "\f2a4"; +$fa-var-hashtag: "\f292"; +$fa-var-hdd-o: "\f0a0"; +$fa-var-header: "\f1dc"; +$fa-var-headphones: "\f025"; +$fa-var-heart: "\f004"; +$fa-var-heart-o: "\f08a"; +$fa-var-heartbeat: "\f21e"; +$fa-var-history: "\f1da"; +$fa-var-home: "\f015"; +$fa-var-hospital-o: "\f0f8"; +$fa-var-hotel: "\f236"; +$fa-var-hourglass: "\f254"; +$fa-var-hourglass-1: "\f251"; +$fa-var-hourglass-2: "\f252"; +$fa-var-hourglass-3: "\f253"; +$fa-var-hourglass-end: "\f253"; +$fa-var-hourglass-half: "\f252"; +$fa-var-hourglass-o: "\f250"; +$fa-var-hourglass-start: "\f251"; +$fa-var-houzz: "\f27c"; +$fa-var-html5: "\f13b"; +$fa-var-i-cursor: "\f246"; +$fa-var-id-badge: "\f2c1"; +$fa-var-id-card: "\f2c2"; +$fa-var-id-card-o: "\f2c3"; +$fa-var-ils: "\f20b"; +$fa-var-image: "\f03e"; +$fa-var-imdb: "\f2d8"; +$fa-var-inbox: "\f01c"; +$fa-var-indent: "\f03c"; +$fa-var-industry: "\f275"; +$fa-var-info: "\f129"; +$fa-var-info-circle: "\f05a"; +$fa-var-inr: "\f156"; +$fa-var-instagram: "\f16d"; +$fa-var-institution: "\f19c"; +$fa-var-internet-explorer: "\f26b"; +$fa-var-intersex: "\f224"; +$fa-var-ioxhost: "\f208"; +$fa-var-italic: "\f033"; +$fa-var-joomla: "\f1aa"; +$fa-var-jpy: "\f157"; +$fa-var-jsfiddle: "\f1cc"; +$fa-var-key: "\f084"; +$fa-var-keyboard-o: "\f11c"; +$fa-var-krw: "\f159"; +$fa-var-language: "\f1ab"; +$fa-var-laptop: "\f109"; +$fa-var-lastfm: "\f202"; +$fa-var-lastfm-square: "\f203"; +$fa-var-leaf: "\f06c"; +$fa-var-leanpub: "\f212"; +$fa-var-legal: "\f0e3"; +$fa-var-lemon-o: "\f094"; +$fa-var-level-down: "\f149"; +$fa-var-level-up: "\f148"; +$fa-var-life-bouy: "\f1cd"; +$fa-var-life-buoy: "\f1cd"; +$fa-var-life-ring: "\f1cd"; +$fa-var-life-saver: "\f1cd"; +$fa-var-lightbulb-o: "\f0eb"; +$fa-var-line-chart: "\f201"; +$fa-var-link: "\f0c1"; +$fa-var-linkedin: "\f0e1"; +$fa-var-linkedin-square: "\f08c"; +$fa-var-linode: "\f2b8"; +$fa-var-linux: "\f17c"; +$fa-var-list: "\f03a"; +$fa-var-list-alt: "\f022"; +$fa-var-list-ol: "\f0cb"; +$fa-var-list-ul: "\f0ca"; +$fa-var-location-arrow: "\f124"; +$fa-var-lock: "\f023"; +$fa-var-long-arrow-down: "\f175"; +$fa-var-long-arrow-left: "\f177"; +$fa-var-long-arrow-right: "\f178"; +$fa-var-long-arrow-up: "\f176"; +$fa-var-low-vision: "\f2a8"; +$fa-var-magic: "\f0d0"; +$fa-var-magnet: "\f076"; +$fa-var-mail-forward: "\f064"; +$fa-var-mail-reply: "\f112"; +$fa-var-mail-reply-all: "\f122"; +$fa-var-male: "\f183"; +$fa-var-map: "\f279"; +$fa-var-map-marker: "\f041"; +$fa-var-map-o: "\f278"; +$fa-var-map-pin: "\f276"; +$fa-var-map-signs: "\f277"; +$fa-var-mars: "\f222"; +$fa-var-mars-double: "\f227"; +$fa-var-mars-stroke: "\f229"; +$fa-var-mars-stroke-h: "\f22b"; +$fa-var-mars-stroke-v: "\f22a"; +$fa-var-maxcdn: "\f136"; +$fa-var-meanpath: "\f20c"; +$fa-var-medium: "\f23a"; +$fa-var-medkit: "\f0fa"; +$fa-var-meetup: "\f2e0"; +$fa-var-meh-o: "\f11a"; +$fa-var-mercury: "\f223"; +$fa-var-microchip: "\f2db"; +$fa-var-microphone: "\f130"; +$fa-var-microphone-slash: "\f131"; +$fa-var-minus: "\f068"; +$fa-var-minus-circle: "\f056"; +$fa-var-minus-square: "\f146"; +$fa-var-minus-square-o: "\f147"; +$fa-var-mixcloud: "\f289"; +$fa-var-mobile: "\f10b"; +$fa-var-mobile-phone: "\f10b"; +$fa-var-modx: "\f285"; +$fa-var-money: "\f0d6"; +$fa-var-moon-o: "\f186"; +$fa-var-mortar-board: "\f19d"; +$fa-var-motorcycle: "\f21c"; +$fa-var-mouse-pointer: "\f245"; +$fa-var-music: "\f001"; +$fa-var-navicon: "\f0c9"; +$fa-var-neuter: "\f22c"; +$fa-var-newspaper-o: "\f1ea"; +$fa-var-object-group: "\f247"; +$fa-var-object-ungroup: "\f248"; +$fa-var-odnoklassniki: "\f263"; +$fa-var-odnoklassniki-square: "\f264"; +$fa-var-opencart: "\f23d"; +$fa-var-openid: "\f19b"; +$fa-var-opera: "\f26a"; +$fa-var-optin-monster: "\f23c"; +$fa-var-outdent: "\f03b"; +$fa-var-pagelines: "\f18c"; +$fa-var-paint-brush: "\f1fc"; +$fa-var-paper-plane: "\f1d8"; +$fa-var-paper-plane-o: "\f1d9"; +$fa-var-paperclip: "\f0c6"; +$fa-var-paragraph: "\f1dd"; +$fa-var-paste: "\f0ea"; +$fa-var-pause: "\f04c"; +$fa-var-pause-circle: "\f28b"; +$fa-var-pause-circle-o: "\f28c"; +$fa-var-paw: "\f1b0"; +$fa-var-paypal: "\f1ed"; +$fa-var-pencil: "\f040"; +$fa-var-pencil-square: "\f14b"; +$fa-var-pencil-square-o: "\f044"; +$fa-var-percent: "\f295"; +$fa-var-phone: "\f095"; +$fa-var-phone-square: "\f098"; +$fa-var-photo: "\f03e"; +$fa-var-picture-o: "\f03e"; +$fa-var-pie-chart: "\f200"; +$fa-var-pied-piper: "\f2ae"; +$fa-var-pied-piper-alt: "\f1a8"; +$fa-var-pied-piper-pp: "\f1a7"; +$fa-var-pinterest: "\f0d2"; +$fa-var-pinterest-p: "\f231"; +$fa-var-pinterest-square: "\f0d3"; +$fa-var-plane: "\f072"; +$fa-var-play: "\f04b"; +$fa-var-play-circle: "\f144"; +$fa-var-play-circle-o: "\f01d"; +$fa-var-plug: "\f1e6"; +$fa-var-plus: "\f067"; +$fa-var-plus-circle: "\f055"; +$fa-var-plus-square: "\f0fe"; +$fa-var-plus-square-o: "\f196"; +$fa-var-podcast: "\f2ce"; +$fa-var-power-off: "\f011"; +$fa-var-print: "\f02f"; +$fa-var-product-hunt: "\f288"; +$fa-var-puzzle-piece: "\f12e"; +$fa-var-qq: "\f1d6"; +$fa-var-qrcode: "\f029"; +$fa-var-question: "\f128"; +$fa-var-question-circle: "\f059"; +$fa-var-question-circle-o: "\f29c"; +$fa-var-quora: "\f2c4"; +$fa-var-quote-left: "\f10d"; +$fa-var-quote-right: "\f10e"; +$fa-var-ra: "\f1d0"; +$fa-var-random: "\f074"; +$fa-var-ravelry: "\f2d9"; +$fa-var-rebel: "\f1d0"; +$fa-var-recycle: "\f1b8"; +$fa-var-reddit: "\f1a1"; +$fa-var-reddit-alien: "\f281"; +$fa-var-reddit-square: "\f1a2"; +$fa-var-refresh: "\f021"; +$fa-var-registered: "\f25d"; +$fa-var-remove: "\f00d"; +$fa-var-renren: "\f18b"; +$fa-var-reorder: "\f0c9"; +$fa-var-repeat: "\f01e"; +$fa-var-reply: "\f112"; +$fa-var-reply-all: "\f122"; +$fa-var-resistance: "\f1d0"; +$fa-var-retweet: "\f079"; +$fa-var-rmb: "\f157"; +$fa-var-road: "\f018"; +$fa-var-rocket: "\f135"; +$fa-var-rotate-left: "\f0e2"; +$fa-var-rotate-right: "\f01e"; +$fa-var-rouble: "\f158"; +$fa-var-rss: "\f09e"; +$fa-var-rss-square: "\f143"; +$fa-var-rub: "\f158"; +$fa-var-ruble: "\f158"; +$fa-var-rupee: "\f156"; +$fa-var-s15: "\f2cd"; +$fa-var-safari: "\f267"; +$fa-var-save: "\f0c7"; +$fa-var-scissors: "\f0c4"; +$fa-var-scribd: "\f28a"; +$fa-var-search: "\f002"; +$fa-var-search-minus: "\f010"; +$fa-var-search-plus: "\f00e"; +$fa-var-sellsy: "\f213"; +$fa-var-send: "\f1d8"; +$fa-var-send-o: "\f1d9"; +$fa-var-server: "\f233"; +$fa-var-share: "\f064"; +$fa-var-share-alt: "\f1e0"; +$fa-var-share-alt-square: "\f1e1"; +$fa-var-share-square: "\f14d"; +$fa-var-share-square-o: "\f045"; +$fa-var-shekel: "\f20b"; +$fa-var-sheqel: "\f20b"; +$fa-var-shield: "\f132"; +$fa-var-ship: "\f21a"; +$fa-var-shirtsinbulk: "\f214"; +$fa-var-shopping-bag: "\f290"; +$fa-var-shopping-basket: "\f291"; +$fa-var-shopping-cart: "\f07a"; +$fa-var-shower: "\f2cc"; +$fa-var-sign-in: "\f090"; +$fa-var-sign-language: "\f2a7"; +$fa-var-sign-out: "\f08b"; +$fa-var-signal: "\f012"; +$fa-var-signing: "\f2a7"; +$fa-var-simplybuilt: "\f215"; +$fa-var-sitemap: "\f0e8"; +$fa-var-skyatlas: "\f216"; +$fa-var-skype: "\f17e"; +$fa-var-slack: "\f198"; +$fa-var-sliders: "\f1de"; +$fa-var-slideshare: "\f1e7"; +$fa-var-smile-o: "\f118"; +$fa-var-snapchat: "\f2ab"; +$fa-var-snapchat-ghost: "\f2ac"; +$fa-var-snapchat-square: "\f2ad"; +$fa-var-snowflake-o: "\f2dc"; +$fa-var-soccer-ball-o: "\f1e3"; +$fa-var-sort: "\f0dc"; +$fa-var-sort-alpha-asc: "\f15d"; +$fa-var-sort-alpha-desc: "\f15e"; +$fa-var-sort-amount-asc: "\f160"; +$fa-var-sort-amount-desc: "\f161"; +$fa-var-sort-asc: "\f0de"; +$fa-var-sort-desc: "\f0dd"; +$fa-var-sort-down: "\f0dd"; +$fa-var-sort-numeric-asc: "\f162"; +$fa-var-sort-numeric-desc: "\f163"; +$fa-var-sort-up: "\f0de"; +$fa-var-soundcloud: "\f1be"; +$fa-var-space-shuttle: "\f197"; +$fa-var-spinner: "\f110"; +$fa-var-spoon: "\f1b1"; +$fa-var-spotify: "\f1bc"; +$fa-var-square: "\f0c8"; +$fa-var-square-o: "\f096"; +$fa-var-stack-exchange: "\f18d"; +$fa-var-stack-overflow: "\f16c"; +$fa-var-star: "\f005"; +$fa-var-star-half: "\f089"; +$fa-var-star-half-empty: "\f123"; +$fa-var-star-half-full: "\f123"; +$fa-var-star-half-o: "\f123"; +$fa-var-star-o: "\f006"; +$fa-var-steam: "\f1b6"; +$fa-var-steam-square: "\f1b7"; +$fa-var-step-backward: "\f048"; +$fa-var-step-forward: "\f051"; +$fa-var-stethoscope: "\f0f1"; +$fa-var-sticky-note: "\f249"; +$fa-var-sticky-note-o: "\f24a"; +$fa-var-stop: "\f04d"; +$fa-var-stop-circle: "\f28d"; +$fa-var-stop-circle-o: "\f28e"; +$fa-var-street-view: "\f21d"; +$fa-var-strikethrough: "\f0cc"; +$fa-var-stumbleupon: "\f1a4"; +$fa-var-stumbleupon-circle: "\f1a3"; +$fa-var-subscript: "\f12c"; +$fa-var-subway: "\f239"; +$fa-var-suitcase: "\f0f2"; +$fa-var-sun-o: "\f185"; +$fa-var-superpowers: "\f2dd"; +$fa-var-superscript: "\f12b"; +$fa-var-support: "\f1cd"; +$fa-var-table: "\f0ce"; +$fa-var-tablet: "\f10a"; +$fa-var-tachometer: "\f0e4"; +$fa-var-tag: "\f02b"; +$fa-var-tags: "\f02c"; +$fa-var-tasks: "\f0ae"; +$fa-var-taxi: "\f1ba"; +$fa-var-telegram: "\f2c6"; +$fa-var-television: "\f26c"; +$fa-var-tencent-weibo: "\f1d5"; +$fa-var-terminal: "\f120"; +$fa-var-text-height: "\f034"; +$fa-var-text-width: "\f035"; +$fa-var-th: "\f00a"; +$fa-var-th-large: "\f009"; +$fa-var-th-list: "\f00b"; +$fa-var-themeisle: "\f2b2"; +$fa-var-thermometer: "\f2c7"; +$fa-var-thermometer-0: "\f2cb"; +$fa-var-thermometer-1: "\f2ca"; +$fa-var-thermometer-2: "\f2c9"; +$fa-var-thermometer-3: "\f2c8"; +$fa-var-thermometer-4: "\f2c7"; +$fa-var-thermometer-empty: "\f2cb"; +$fa-var-thermometer-full: "\f2c7"; +$fa-var-thermometer-half: "\f2c9"; +$fa-var-thermometer-quarter: "\f2ca"; +$fa-var-thermometer-three-quarters: "\f2c8"; +$fa-var-thumb-tack: "\f08d"; +$fa-var-thumbs-down: "\f165"; +$fa-var-thumbs-o-down: "\f088"; +$fa-var-thumbs-o-up: "\f087"; +$fa-var-thumbs-up: "\f164"; +$fa-var-ticket: "\f145"; +$fa-var-times: "\f00d"; +$fa-var-times-circle: "\f057"; +$fa-var-times-circle-o: "\f05c"; +$fa-var-times-rectangle: "\f2d3"; +$fa-var-times-rectangle-o: "\f2d4"; +$fa-var-tint: "\f043"; +$fa-var-toggle-down: "\f150"; +$fa-var-toggle-left: "\f191"; +$fa-var-toggle-off: "\f204"; +$fa-var-toggle-on: "\f205"; +$fa-var-toggle-right: "\f152"; +$fa-var-toggle-up: "\f151"; +$fa-var-trademark: "\f25c"; +$fa-var-train: "\f238"; +$fa-var-transgender: "\f224"; +$fa-var-transgender-alt: "\f225"; +$fa-var-trash: "\f1f8"; +$fa-var-trash-o: "\f014"; +$fa-var-tree: "\f1bb"; +$fa-var-trello: "\f181"; +$fa-var-tripadvisor: "\f262"; +$fa-var-trophy: "\f091"; +$fa-var-truck: "\f0d1"; +$fa-var-try: "\f195"; +$fa-var-tty: "\f1e4"; +$fa-var-tumblr: "\f173"; +$fa-var-tumblr-square: "\f174"; +$fa-var-turkish-lira: "\f195"; +$fa-var-tv: "\f26c"; +$fa-var-twitch: "\f1e8"; +$fa-var-twitter: "\f099"; +$fa-var-twitter-square: "\f081"; +$fa-var-umbrella: "\f0e9"; +$fa-var-underline: "\f0cd"; +$fa-var-undo: "\f0e2"; +$fa-var-universal-access: "\f29a"; +$fa-var-university: "\f19c"; +$fa-var-unlink: "\f127"; +$fa-var-unlock: "\f09c"; +$fa-var-unlock-alt: "\f13e"; +$fa-var-unsorted: "\f0dc"; +$fa-var-upload: "\f093"; +$fa-var-usb: "\f287"; +$fa-var-usd: "\f155"; +$fa-var-user: "\f007"; +$fa-var-user-circle: "\f2bd"; +$fa-var-user-circle-o: "\f2be"; +$fa-var-user-md: "\f0f0"; +$fa-var-user-o: "\f2c0"; +$fa-var-user-plus: "\f234"; +$fa-var-user-secret: "\f21b"; +$fa-var-user-times: "\f235"; +$fa-var-users: "\f0c0"; +$fa-var-vcard: "\f2bb"; +$fa-var-vcard-o: "\f2bc"; +$fa-var-venus: "\f221"; +$fa-var-venus-double: "\f226"; +$fa-var-venus-mars: "\f228"; +$fa-var-viacoin: "\f237"; +$fa-var-viadeo: "\f2a9"; +$fa-var-viadeo-square: "\f2aa"; +$fa-var-video-camera: "\f03d"; +$fa-var-vimeo: "\f27d"; +$fa-var-vimeo-square: "\f194"; +$fa-var-vine: "\f1ca"; +$fa-var-vk: "\f189"; +$fa-var-volume-control-phone: "\f2a0"; +$fa-var-volume-down: "\f027"; +$fa-var-volume-off: "\f026"; +$fa-var-volume-up: "\f028"; +$fa-var-warning: "\f071"; +$fa-var-wechat: "\f1d7"; +$fa-var-weibo: "\f18a"; +$fa-var-weixin: "\f1d7"; +$fa-var-whatsapp: "\f232"; +$fa-var-wheelchair: "\f193"; +$fa-var-wheelchair-alt: "\f29b"; +$fa-var-wifi: "\f1eb"; +$fa-var-wikipedia-w: "\f266"; +$fa-var-window-close: "\f2d3"; +$fa-var-window-close-o: "\f2d4"; +$fa-var-window-maximize: "\f2d0"; +$fa-var-window-minimize: "\f2d1"; +$fa-var-window-restore: "\f2d2"; +$fa-var-windows: "\f17a"; +$fa-var-won: "\f159"; +$fa-var-wordpress: "\f19a"; +$fa-var-wpbeginner: "\f297"; +$fa-var-wpexplorer: "\f2de"; +$fa-var-wpforms: "\f298"; +$fa-var-wrench: "\f0ad"; +$fa-var-xing: "\f168"; +$fa-var-xing-square: "\f169"; +$fa-var-y-combinator: "\f23b"; +$fa-var-y-combinator-square: "\f1d4"; +$fa-var-yahoo: "\f19e"; +$fa-var-yc: "\f23b"; +$fa-var-yc-square: "\f1d4"; +$fa-var-yelp: "\f1e9"; +$fa-var-yen: "\f157"; +$fa-var-yoast: "\f2b1"; +$fa-var-youtube: "\f167"; +$fa-var-youtube-play: "\f16a"; +$fa-var-youtube-square: "\f166"; + diff --git a/src/assets/fa/scss/font-awesome.scss b/src/assets/fa/scss/font-awesome.scss new file mode 100644 index 0000000..f1c83aa --- /dev/null +++ b/src/assets/fa/scss/font-awesome.scss @@ -0,0 +1,18 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables"; +@import "mixins"; +@import "path"; +@import "core"; +@import "larger"; +@import "fixed-width"; +@import "list"; +@import "bordered-pulled"; +@import "animated"; +@import "rotated-flipped"; +@import "stacked"; +@import "icons"; +@import "screen-reader"; diff --git a/src/assets/img/icon.png b/src/assets/img/icon.png new file mode 100644 index 0000000..54453ea Binary files /dev/null and b/src/assets/img/icon.png differ diff --git a/src/assets/img/logo-drenax-b.png b/src/assets/img/logo-drenax-b.png new file mode 100644 index 0000000..abeecde Binary files /dev/null and b/src/assets/img/logo-drenax-b.png differ diff --git a/src/assets/img/logo-drenax.svg b/src/assets/img/logo-drenax.svg new file mode 100644 index 0000000..50120cf --- /dev/null +++ b/src/assets/img/logo-drenax.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/img/personaje.png b/src/assets/img/personaje.png new file mode 100644 index 0000000..5632182 Binary files /dev/null and b/src/assets/img/personaje.png differ diff --git a/src/assets/img/user.png b/src/assets/img/user.png new file mode 100644 index 0000000..4f5cafe Binary files /dev/null and b/src/assets/img/user.png differ diff --git a/src/assets/img/x-red.svg b/src/assets/img/x-red.svg new file mode 100644 index 0000000..d91069f --- /dev/null +++ b/src/assets/img/x-red.svg @@ -0,0 +1 @@ +x \ No newline at end of file diff --git a/src/assets/js/global/components/base/avatar.js b/src/assets/js/global/components/base/avatar.js new file mode 100644 index 0000000..8ab1b8c --- /dev/null +++ b/src/assets/js/global/components/base/avatar.js @@ -0,0 +1,156 @@ +// plugin setup +var KTAvatar = function(elementId, options) { + // Main object + var the = this; + var init = false; + + // Get element object + var element = KTUtil.get(elementId); + var body = KTUtil.get('body'); + + if (!element) { + return; + } + + // Default options + var defaultOptions = { + }; + + //////////////////////////// + // ** Private Methods ** // + //////////////////////////// + + var Plugin = { + /** + * Construct + */ + + construct: function(options) { + if (KTUtil.data(element).has('avatar')) { + the = KTUtil.data(element).get('avatar'); + } else { + // reset menu + Plugin.init(options); + + // build menu + Plugin.build(); + + KTUtil.data(element).set('avatar', the); + } + + return the; + }, + + /** + * Init avatar + */ + init: function(options) { + the.element = element; + the.events = []; + + the.input = KTUtil.find(element, 'input[type="file"]'); + the.holder = KTUtil.find(element, '.kt-avatar__holder'); + the.cancel = KTUtil.find(element, '.kt-avatar__cancel'); + the.src = KTUtil.css(the.holder, 'backgroundImage'); + + // merge default and user defined options + the.options = KTUtil.deepExtend({}, defaultOptions, options); + }, + + /** + * Build Form Wizard + */ + build: function() { + // Handle avatar change + KTUtil.addEvent(the.input, 'change', function(e) { + e.preventDefault(); + + if (the.input && the.input.files && the.input.files[0]) { + var reader = new FileReader(); + reader.onload = function(e) { + KTUtil.css(the.holder, 'background-image', 'url('+e.target.result +')'); + } + reader.readAsDataURL(the.input.files[0]); + + KTUtil.addClass(the.element, 'kt-avatar--changed'); + } + }); + + // Handle avatar cancel + KTUtil.addEvent(the.cancel, 'click', function(e) { + e.preventDefault(); + + KTUtil.removeClass(the.element, 'kt-avatar--changed'); + KTUtil.css(the.holder, 'background-image', the.src); + the.input.value = ""; + }); + }, + + /** + * Trigger events + */ + eventTrigger: function(name) { + //KTUtil.triggerCustomEvent(name); + for (var i = 0; i < the.events.length; i++) { + var event = the.events[i]; + if (event.name == name) { + if (event.one == true) { + if (event.fired == false) { + the.events[i].fired = true; + return event.handler.call(this, the); + } + } else { + return event.handler.call(this, the); + } + } + } + }, + + addEvent: function(name, handler, one) { + the.events.push({ + name: name, + handler: handler, + one: one, + fired: false + }); + + return the; + } + }; + + ////////////////////////// + // ** Public Methods ** // + ////////////////////////// + + /** + * Set default options + */ + + the.setDefaults = function(options) { + defaultOptions = options; + }; + + /** + * Attach event + */ + the.on = function(name, handler) { + return Plugin.addEvent(name, handler); + }; + + /** + * Attach event that will be fired once + */ + the.one = function(name, handler) { + return Plugin.addEvent(name, handler, true); + }; + + // Construct plugin + Plugin.construct.apply(the, [options]); + + return the; +}; + +// webpack support +if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { + module.exports = KTAvatar; +} diff --git a/src/assets/js/global/components/base/dialog.js b/src/assets/js/global/components/base/dialog.js new file mode 100644 index 0000000..83d2e0b --- /dev/null +++ b/src/assets/js/global/components/base/dialog.js @@ -0,0 +1,187 @@ +"use strict"; + +// plugin setup +var KTDialog = function(options) { + // Main object + var the = this; + + // Get element object + var element; + var body = KTUtil.get('body'); + + // Default options + var defaultOptions = { + 'placement' : 'top center', + 'type' : 'loader', + 'width' : 100, + 'state' : 'default', + 'message' : 'Loading...' + }; + + //////////////////////////// + // ** Private Methods ** // + //////////////////////////// + + var Plugin = { + /** + * Construct + */ + + construct: function(options) { + Plugin.init(options); + + return the; + }, + + /** + * Handles subtoggle click toggle + */ + init: function(options) { + the.events = []; + + // merge default and user defined options + the.options = KTUtil.deepExtend({}, defaultOptions, options); + + the.state = false; + }, + + /** + * Show dialog + */ + show: function() { + Plugin.eventTrigger('show'); + + element = document.createElement("DIV"); + KTUtil.setHTML(element, the.options.message); + + KTUtil.addClass(element, 'kt-dialog kt-dialog--shown'); + KTUtil.addClass(element, 'kt-dialog--' + the.options.state); + KTUtil.addClass(element, 'kt-dialog--' + the.options.type); + + if (the.options.placement == 'top center') { + KTUtil.addClass(element, 'kt-dialog--top-center'); + } + + body.appendChild(element); + + the.state = 'shown'; + + Plugin.eventTrigger('shown'); + + return the; + }, + + /** + * Hide dialog + */ + hide: function() { + if (element) { + Plugin.eventTrigger('hide'); + + element.remove(); + the.state = 'hidden'; + + Plugin.eventTrigger('hidden'); + } + + return the; + }, + + /** + * Trigger events + */ + eventTrigger: function(name) { + for (var i = 0; i < the.events.length; i++) { + var event = the.events[i]; + + if (event.name == name) { + if (event.one == true) { + if (event.fired == false) { + the.events[i].fired = true; + return event.handler.call(this, the); + } + } else { + return event.handler.call(this, the); + } + } + } + }, + + addEvent: function(name, handler, one) { + the.events.push({ + name: name, + handler: handler, + one: one, + fired: false + }); + + return the; + } + }; + + ////////////////////////// + // ** Public Methods ** // + ////////////////////////// + + /** + * Set default options + */ + + the.setDefaults = function(options) { + defaultOptions = options; + }; + + /** + * Check shown state + */ + the.shown = function() { + return the.state == 'shown'; + }; + + /** + * Check hidden state + */ + the.hidden = function() { + return the.state == 'hidden'; + }; + + /** + * Show dialog + */ + the.show = function() { + return Plugin.show(); + }; + + /** + * Hide dialog + */ + the.hide = function() { + return Plugin.hide(); + }; + + /** + * Attach event + * @returns {KTToggle} + */ + the.on = function(name, handler) { + return Plugin.addEvent(name, handler); + }; + + /** + * Attach event that will be fired once + * @returns {KTToggle} + */ + the.one = function(name, handler) { + return Plugin.addEvent(name, handler, true); + }; + + // Construct plugin + Plugin.construct.apply(the, [options]); + + return the; +}; + +// webpack support +if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { + module.exports = KTDialog; +} \ No newline at end of file diff --git a/src/assets/js/global/components/base/header.js b/src/assets/js/global/components/base/header.js new file mode 100644 index 0000000..a03c375 --- /dev/null +++ b/src/assets/js/global/components/base/header.js @@ -0,0 +1,203 @@ +"use strict"; +var KTHeader = function(elementId, options) { + // Main object + var the = this; + var init = false; + + // Get element object + var element = KTUtil.get(elementId); + var body = KTUtil.get('body'); + + if (element === undefined) { + return; + } + + // Default options + var defaultOptions = { + classic: false, + offset: { + mobile: 150, + desktop: 200 + }, + minimize: { + mobile: false, + desktop: false + } + }; + + //////////////////////////// + // ** Private Methods ** // + //////////////////////////// + + var Plugin = { + /** + * Run plugin + * @returns {KTHeader} + */ + construct: function(options) { + if (KTUtil.data(element).has('header')) { + the = KTUtil.data(element).get('header'); + } else { + // reset header + Plugin.init(options); + + // build header + Plugin.build(); + + KTUtil.data(element).set('header', the); + } + + return the; + }, + + /** + * Handles subheader click toggle + * @returns {KTHeader} + */ + init: function(options) { + the.events = []; + + // merge default and user defined options + the.options = KTUtil.deepExtend({}, defaultOptions, options); + }, + + /** + * Reset header + * @returns {KTHeader} + */ + build: function() { + var lastScrollTop = 0; + var eventTriggerState = true; + var viewportHeight = KTUtil.getViewPort().height; + var documentHeight = KTUtil.getDocumentHeight(); + + if (the.options.minimize.mobile === false && the.options.minimize.desktop === false) { + return; + } + + window.addEventListener('scroll', function() { + var offset = 0, on, off, st; + + if (KTUtil.isInResponsiveRange('desktop')) { + offset = the.options.offset.desktop; + on = the.options.minimize.desktop.on; + off = the.options.minimize.desktop.off; + } else if (KTUtil.isInResponsiveRange('tablet-and-mobile')) { + offset = the.options.offset.mobile; + on = the.options.minimize.mobile.on; + off = the.options.minimize.mobile.off; + } + + st = KTUtil.getScrollTop(); + + if ( + (KTUtil.isInResponsiveRange('tablet-and-mobile') && the.options.classic && the.options.classic.mobile) || + (KTUtil.isInResponsiveRange('desktop') && the.options.classic && the.options.classic.desktop) + ) { + if (st > offset) { // down scroll mode + KTUtil.addClass(body, on); + KTUtil.removeClass(body, off); + + if (eventTriggerState) { + Plugin.eventTrigger('minimizeOn', the); + eventTriggerState = false; + } + } else { // back scroll mode + KTUtil.addClass(body, off); + KTUtil.removeClass(body, on); + + if (eventTriggerState == false) { + Plugin.eventTrigger('minimizeOff', the); + eventTriggerState = true; + } + } + } else { + if (st > offset && lastScrollTop < st) { // down scroll mode + KTUtil.addClass(body, on); + KTUtil.removeClass(body, off); + + if (eventTriggerState) { + Plugin.eventTrigger('minimizeOn', the); + eventTriggerState = false; + } + } else { // back scroll mode + KTUtil.addClass(body, off); + KTUtil.removeClass(body, on); + + if (eventTriggerState == false) { + Plugin.eventTrigger('minimizeOff', the); + eventTriggerState = true; + } + } + + lastScrollTop = st; + } + }); + }, + + /** + * Trigger events + */ + eventTrigger: function(name, args) { + for (var i = 0; i < the.events.length; i++) { + var event = the.events[i]; + if (event.name == name) { + if (event.one == true) { + if (event.fired == false) { + the.events[i].fired = true; + return event.handler.call(this, the, args); + } + } else { + return event.handler.call(this, the, args); + } + } + } + }, + + addEvent: function(name, handler, one) { + the.events.push({ + name: name, + handler: handler, + one: one, + fired: false + }); + } + }; + + ////////////////////////// + // ** Public Methods ** // + ////////////////////////// + + /** + * Set default options + */ + + the.setDefaults = function(options) { + defaultOptions = options; + }; + + /** + * Register event + */ + the.on = function(name, handler) { + return Plugin.addEvent(name, handler); + }; + + /////////////////////////////// + // ** Plugin Construction ** // + /////////////////////////////// + + // Run plugin + Plugin.construct.apply(the, [options]); + + // Init done + init = true; + + // Return plugin instance + return the; +}; + +// webpack support +if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { + module.exports = KTHeader; +} diff --git a/src/assets/js/global/components/base/menu.js b/src/assets/js/global/components/base/menu.js new file mode 100644 index 0000000..d9fde3d --- /dev/null +++ b/src/assets/js/global/components/base/menu.js @@ -0,0 +1,850 @@ +"use strict"; +var KTMenu = function(elementId, options) { + // Main object + var the = this; + var init = false; + + // Get element object + var element = KTUtil.get(elementId); + var body = KTUtil.get('body'); + + if (!element) { + return; + } + + // Default options + var defaultOptions = { + // scrollable area with Perfect Scroll + scroll: { + rememberPosition: false + }, + + // accordion submenu mode + accordion: { + slideSpeed: 200, // accordion toggle slide speed in milliseconds + autoScroll: false, // enable auto scrolling(focus) to the clicked menu item + autoScrollSpeed: 1200, + expandAll: true // allow having multiple expanded accordions in the menu + }, + + // dropdown submenu mode + dropdown: { + timeout: 500 // timeout in milliseconds to show and hide the hoverable submenu dropdown + } + }; + + //////////////////////////// + // ** Private Methods ** // + //////////////////////////// + + var Plugin = { + /** + * Run plugin + * @returns {KTMenu} + */ + construct: function(options) { + if (KTUtil.data(element).has('menu')) { + the = KTUtil.data(element).get('menu'); + } else { + // reset menu + Plugin.init(options); + + // reset menu + Plugin.reset(); + + // build menu + Plugin.build(); + + KTUtil.data(element).set('menu', the); + } + + return the; + }, + + /** + * Handles submenu click toggle + * @returns {KTMenu} + */ + init: function(options) { + the.events = []; + + the.eventHandlers = {}; + + // merge default and user defined options + the.options = KTUtil.deepExtend({}, defaultOptions, options); + + // pause menu + the.pauseDropdownHoverTime = 0; + + the.uid = KTUtil.getUniqueID(); + }, + + update: function(options) { + // merge default and user defined options + the.options = KTUtil.deepExtend({}, defaultOptions, options); + + // pause menu + the.pauseDropdownHoverTime = 0; + + // reset menu + Plugin.reset(); + + the.eventHandlers = {}; + + // build menu + Plugin.build(); + + KTUtil.data(element).set('menu', the); + }, + + reload: function() { + // reset menu + Plugin.reset(); + + // build menu + Plugin.build(); + + // reset submenu props + Plugin.resetSubmenuProps(); + }, + + /** + * Reset menu + * @returns {KTMenu} + */ + build: function() { + // General accordion submenu toggle + the.eventHandlers['event_1'] = KTUtil.on( element, '.kt-menu__toggle', 'click', Plugin.handleSubmenuAccordion); + + // Dropdown mode(hoverable) + if (Plugin.getSubmenuMode() === 'dropdown' || Plugin.isConditionalSubmenuDropdown()) { + // dropdown submenu - hover toggle + the.eventHandlers['event_2'] = KTUtil.on( element, '[data-ktmenu-submenu-toggle="hover"]', 'mouseover', Plugin.handleSubmenuDrodownHoverEnter); + the.eventHandlers['event_3'] = KTUtil.on( element, '[data-ktmenu-submenu-toggle="hover"]', 'mouseout', Plugin.handleSubmenuDrodownHoverExit); + + // dropdown submenu - click toggle + the.eventHandlers['event_4'] = KTUtil.on( element, '[data-ktmenu-submenu-toggle="click"] > .kt-menu__toggle, [data-ktmenu-submenu-toggle="click"] > .kt-menu__link .kt-menu__toggle', 'click', Plugin.handleSubmenuDropdownClick); + the.eventHandlers['event_5'] = KTUtil.on( element, '[data-ktmenu-submenu-toggle="tab"] > .kt-menu__toggle, [data-ktmenu-submenu-toggle="tab"] > .kt-menu__link .kt-menu__toggle', 'click', Plugin.handleSubmenuDropdownTabClick); + } + + // handle link click + the.eventHandlers['event_6'] = KTUtil.on(element, '.kt-menu__item > .kt-menu__link:not(.kt-menu__toggle):not(.kt-menu__link--toggle-skip)', 'click', Plugin.handleLinkClick); + + // Init scrollable menu + if (the.options.scroll && the.options.scroll.height) { + Plugin.scrollInit(); + } + }, + + /** + * Reset menu + * @returns {KTMenu} + */ + reset: function() { + KTUtil.off( element, 'click', the.eventHandlers['event_1']); + + // dropdown submenu - hover toggle + KTUtil.off( element, 'mouseover', the.eventHandlers['event_2']); + KTUtil.off( element, 'mouseout', the.eventHandlers['event_3']); + + // dropdown submenu - click toggle + KTUtil.off( element, 'click', the.eventHandlers['event_4']); + KTUtil.off( element, 'click', the.eventHandlers['event_5']); + + // handle link click + KTUtil.off(element, 'click', the.eventHandlers['event_6']); + }, + + /** + * Init scroll menu + * + */ + scrollInit: function() { + if ( the.options.scroll && the.options.scroll.height ) { + KTUtil.scrollDestroy(element); + KTUtil.scrollInit(element, {mobileNativeScroll: true, windowScroll: false, resetHeightOnDestroy: true, handleWindowResize: true, height: the.options.scroll.height, rememberPosition: the.options.scroll.rememberPosition}); + } else { + KTUtil.scrollDestroy(element); + } + }, + + /** + * Update scroll menu + */ + scrollUpdate: function() { + if ( the.options.scroll && the.options.scroll.height ) { + KTUtil.scrollUpdate(element); + } + }, + + /** + * Scroll top + */ + scrollTop: function() { + if ( the.options.scroll && the.options.scroll.height ) { + KTUtil.scrollTop(element); + } + }, + + /** + * Get submenu mode for current breakpoint and menu state + * @returns {KTMenu} + */ + getSubmenuMode: function(el) { + if ( KTUtil.isInResponsiveRange('desktop') ) { + if (el && KTUtil.hasAttr(el, 'data-ktmenu-submenu-toggle') && KTUtil.attr(el, 'data-ktmenu-submenu-toggle') == 'hover') { + return 'dropdown'; + } + + if ( KTUtil.isset(the.options.submenu, 'desktop.state.body') ) { + if ( KTUtil.hasClasses(body, the.options.submenu.desktop.state.body) ) { + return the.options.submenu.desktop.state.mode; + } else { + return the.options.submenu.desktop.default; + } + } else if ( KTUtil.isset(the.options.submenu, 'desktop') ) { + return the.options.submenu.desktop; + } + } else if ( KTUtil.isInResponsiveRange('tablet') && KTUtil.isset(the.options.submenu, 'tablet') ) { + return the.options.submenu.tablet; + } else if ( KTUtil.isInResponsiveRange('mobile') && KTUtil.isset(the.options.submenu, 'mobile') ) { + return the.options.submenu.mobile; + } else { + return false; + } + }, + + /** + * Get submenu mode for current breakpoint and menu state + * @returns {KTMenu} + */ + isConditionalSubmenuDropdown: function() { + if ( KTUtil.isInResponsiveRange('desktop') && KTUtil.isset(the.options.submenu, 'desktop.state.body') ) { + return true; + } else { + return false; + } + }, + + + /** + * Reset submenu attributes + * @returns {KTMenu} + */ + resetSubmenuProps: function(e) { + var submenus = KTUtil.findAll(element, '.kt-menu__submenu'); + if ( submenus ) { + for (var i = 0, len = submenus.length; i < len; i++) { + KTUtil.css(submenus[0], 'display', ''); + KTUtil.css(submenus[0], 'overflow', ''); + } + } + }, + + /** + * Handles submenu hover toggle + * @returns {KTMenu} + */ + handleSubmenuDrodownHoverEnter: function(e) { + if ( Plugin.getSubmenuMode(this) === 'accordion' ) { + return; + } + + if ( the.resumeDropdownHover() === false ) { + return; + } + + var item = this; + + if ( item.getAttribute('data-hover') == '1' ) { + item.removeAttribute('data-hover'); + clearTimeout( item.getAttribute('data-timeout') ); + item.removeAttribute('data-timeout'); + } + + Plugin.showSubmenuDropdown(item); + }, + + /** + * Handles submenu hover toggle + * @returns {KTMenu} + */ + handleSubmenuDrodownHoverExit: function(e) { + if ( the.resumeDropdownHover() === false ) { + return; + } + + if ( Plugin.getSubmenuMode(this) === 'accordion' ) { + return; + } + + var item = this; + var time = the.options.dropdown.timeout; + + var timeout = setTimeout(function() { + if ( item.getAttribute('data-hover') == '1' ) { + Plugin.hideSubmenuDropdown(item, true); + } + }, time); + + item.setAttribute('data-hover', '1'); + item.setAttribute('data-timeout', timeout); + }, + + /** + * Handles submenu click toggle + * @returns {KTMenu} + */ + handleSubmenuDropdownClick: function(e) { + if ( Plugin.getSubmenuMode(this) === 'accordion' ) { + return; + } + + var item = this.closest('.kt-menu__item'); + + if ( item.getAttribute('data-ktmenu-submenu-mode') == 'accordion' ) { + return; + } + + if ( KTUtil.hasClass(item, 'kt-menu__item--hover') === false ) { + KTUtil.addClass(item, 'kt-menu__item--open-dropdown'); + Plugin.showSubmenuDropdown(item); + } else { + KTUtil.removeClass(item, 'kt-menu__item--open-dropdown' ); + Plugin.hideSubmenuDropdown(item, true); + } + + e.preventDefault(); + }, + + /** + * Handles tab click toggle + * @returns {KTMenu} + */ + handleSubmenuDropdownTabClick: function(e) { + if (Plugin.getSubmenuMode(this) === 'accordion') { + return; + } + + var item = this.closest('.kt-menu__item'); + + if (item.getAttribute('data-ktmenu-submenu-mode') == 'accordion') { + return; + } + + if (KTUtil.hasClass(item, 'kt-menu__item--hover') == false) { + KTUtil.addClass(item, 'kt-menu__item--open-dropdown'); + Plugin.showSubmenuDropdown(item); + } + + e.preventDefault(); + }, + + /** + * Handles link click + * @returns {KTMenu} + */ + handleLinkClick: function(e) { + var submenu = this.closest('.kt-menu__item.kt-menu__item--submenu'); // + + var result = Plugin.eventTrigger('linkClick', this, e); + if (result === false) { + return; + } + + if ( submenu && Plugin.getSubmenuMode(submenu) === 'dropdown' ) { + Plugin.hideSubmenuDropdowns(); + } + }, + + /** + * Handles submenu dropdown close on link click + * @returns {KTMenu} + */ + handleSubmenuDropdownClose: function(e, el) { + // exit if its not submenu dropdown mode + if (Plugin.getSubmenuMode(el) === 'accordion') { + return; + } + + var shown = element.querySelectorAll('.kt-menu__item.kt-menu__item--submenu.kt-menu__item--hover:not(.kt-menu__item--tabs)'); + + // check if currently clicked link's parent item ha + if (shown.length > 0 && KTUtil.hasClass(el, 'kt-menu__toggle') === false && el.querySelectorAll('.kt-menu__toggle').length === 0) { + // close opened dropdown menus + for (var i = 0, len = shown.length; i < len; i++) { + Plugin.hideSubmenuDropdown(shown[0], true); + } + } + }, + + /** + * helper functions + * @returns {KTMenu} + */ + handleSubmenuAccordion: function(e, el) { + var query; + var item = el ? el : this; + + if ( Plugin.getSubmenuMode(el) === 'dropdown' && (query = item.closest('.kt-menu__item') ) ) { + if (query.getAttribute('data-ktmenu-submenu-mode') != 'accordion' ) { + e.preventDefault(); + return; + } + } + + var li = item.closest('.kt-menu__item'); + var submenu = KTUtil.child(li, '.kt-menu__submenu, .kt-menu__inner'); + + if (KTUtil.hasClass(item.closest('.kt-menu__item'), 'kt-menu__item--open-always')) { + return; + } + + if ( li && submenu ) { + e.preventDefault(); + var speed = the.options.accordion.slideSpeed; + var hasClosables = false; + + if ( KTUtil.hasClass(li, 'kt-menu__item--open') === false ) { + // hide other accordions + if ( the.options.accordion.expandAll === false ) { + var subnav = item.closest('.kt-menu__nav, .kt-menu__subnav'); + var closables = KTUtil.children(subnav, '.kt-menu__item.kt-menu__item--open.kt-menu__item--submenu:not(.kt-menu__item--here):not(.kt-menu__item--open-always)'); + + if ( subnav && closables ) { + for (var i = 0, len = closables.length; i < len; i++) { + var el_ = closables[0]; + var submenu_ = KTUtil.child(el_, '.kt-menu__submenu'); + if ( submenu_ ) { + KTUtil.slideUp(submenu_, speed, function() { + Plugin.scrollUpdate(); + KTUtil.removeClass(el_, 'kt-menu__item--open'); + }); + } + } + } + } + + KTUtil.slideDown(submenu, speed, function() { + Plugin.scrollToItem(item); + Plugin.scrollUpdate(); + + Plugin.eventTrigger('submenuToggle', submenu, e); + }); + + KTUtil.addClass(li, 'kt-menu__item--open'); + + } else { + KTUtil.slideUp(submenu, speed, function() { + Plugin.scrollToItem(item); + Plugin.eventTrigger('submenuToggle', submenu, e); + }); + + KTUtil.removeClass(li, 'kt-menu__item--open'); + } + } + }, + + /** + * scroll to item function + * @returns {KTMenu} + */ + scrollToItem: function(item) { + // handle auto scroll for accordion submenus + if ( KTUtil.isInResponsiveRange('desktop') && the.options.accordion.autoScroll && element.getAttribute('data-ktmenu-scroll') !== '1' ) { + KTUtil.scrollTo(item, the.options.accordion.autoScrollSpeed); + } + }, + + /** + * Hide submenu dropdown + * @returns {KTMenu} + */ + hideSubmenuDropdown: function(item, classAlso) { + // remove submenu activation class + if ( classAlso ) { + KTUtil.removeClass(item, 'kt-menu__item--hover'); + KTUtil.removeClass(item, 'kt-menu__item--active-tab'); + } + + // clear timeout + item.removeAttribute('data-hover'); + + if ( item.getAttribute('data-ktmenu-dropdown-toggle-class') ) { + KTUtil.removeClass(body, item.getAttribute('data-ktmenu-dropdown-toggle-class')); + } + + var timeout = item.getAttribute('data-timeout'); + item.removeAttribute('data-timeout'); + clearTimeout(timeout); + }, + + /** + * Hide submenu dropdowns + * @returns {KTMenu} + */ + hideSubmenuDropdowns: function() { + var items; + if ( items = element.querySelectorAll('.kt-menu__item--submenu.kt-menu__item--hover:not(.kt-menu__item--tabs):not([data-ktmenu-submenu-toggle="tab"])') ) { + for (var j = 0, cnt = items.length; j < cnt; j++) { + Plugin.hideSubmenuDropdown(items[j], true); + } + } + }, + + /** + * helper functions + * @returns {KTMenu} + */ + showSubmenuDropdown: function(item) { + // close active submenus + var list = element.querySelectorAll('.kt-menu__item--submenu.kt-menu__item--hover, .kt-menu__item--submenu.kt-menu__item--active-tab'); + + if ( list ) { + for (var i = 0, len = list.length; i < len; i++) { + var el = list[i]; + if ( item !== el && el.contains(item) === false && item.contains(el) === false ) { + Plugin.hideSubmenuDropdown(el, true); + } + } + } + + // add submenu activation class + KTUtil.addClass(item, 'kt-menu__item--hover'); + + if ( item.getAttribute('data-ktmenu-dropdown-toggle-class') ) { + KTUtil.addClass(body, item.getAttribute('data-ktmenu-dropdown-toggle-class')); + } + }, + + /** + * Handles submenu slide toggle + * @returns {KTMenu} + */ + createSubmenuDropdownClickDropoff: function(el) { + var query; + var zIndex = (query = KTUtil.child(el, '.kt-menu__submenu') ? KTUtil.css(query, 'z-index') : 0) - 1; + + var dropoff = document.createElement('
    '); + + body.appendChild(dropoff); + + KTUtil.addEvent(dropoff, 'click', function(e) { + e.stopPropagation(); + e.preventDefault(); + KTUtil.remove(this); + Plugin.hideSubmenuDropdown(el, true); + }); + }, + + /** + * Handles submenu hover toggle + * @returns {KTMenu} + */ + pauseDropdownHover: function(time) { + var date = new Date(); + + the.pauseDropdownHoverTime = date.getTime() + time; + }, + + /** + * Handles submenu hover toggle + * @returns {KTMenu} + */ + resumeDropdownHover: function() { + var date = new Date(); + + return (date.getTime() > the.pauseDropdownHoverTime ? true : false); + }, + + /** + * Reset menu's current active item + * @returns {KTMenu} + */ + resetActiveItem: function(item) { + var list; + var parents; + + list = element.querySelectorAll('.kt-menu__item--active'); + + for (var i = 0, len = list.length; i < len; i++) { + var el = list[0]; + KTUtil.removeClass(el, 'kt-menu__item--active'); + KTUtil.hide( KTUtil.child(el, '.kt-menu__submenu') ); + parents = KTUtil.parents(el, '.kt-menu__item--submenu') || []; + + for (var i_ = 0, len_ = parents.length; i_ < len_; i_++) { + var el_ = parents[i]; + KTUtil.removeClass(el_, 'kt-menu__item--open'); + KTUtil.hide( KTUtil.child(el_, '.kt-menu__submenu') ); + } + } + + // close open submenus + if ( the.options.accordion.expandAll === false ) { + if ( list = element.querySelectorAll('.kt-menu__item--open') ) { + for (var i = 0, len = list.length; i < len; i++) { + KTUtil.removeClass(parents[0], 'kt-menu__item--open'); + } + } + } + }, + + /** + * Sets menu's active item + * @returns {KTMenu} + */ + setActiveItem: function(item) { + // reset current active item + Plugin.resetActiveItem(); + + var parents = KTUtil.parents(item, '.kt-menu__item--submenu') || []; + for (var i = 0, len = parents.length; i < len; i++) { + KTUtil.addClass(KTUtil.get(parents[i]), 'kt-menu__item--open'); + } + + KTUtil.addClass(KTUtil.get(item), 'kt-menu__item--active'); + }, + + /** + * Returns page breadcrumbs for the menu's active item + * @returns {KTMenu} + */ + getBreadcrumbs: function(item) { + var query; + var breadcrumbs = []; + var link = KTUtil.child(item, '.kt-menu__link'); + + breadcrumbs.push({ + text: (query = KTUtil.child(link, '.kt-menu__link-text') ? query.innerHTML : ''), + title: link.getAttribute('title'), + href: link.getAttribute('href') + }); + + var parents = KTUtil.parents(item, '.kt-menu__item--submenu'); + for (var i = 0, len = parents.length; i < len; i++) { + var submenuLink = KTUtil.child(parents[i], '.kt-menu__link'); + + breadcrumbs.push({ + text: (query = KTUtil.child(submenuLink, '.kt-menu__link-text') ? query.innerHTML : ''), + title: submenuLink.getAttribute('title'), + href: submenuLink.getAttribute('href') + }); + } + + return breadcrumbs.reverse(); + }, + + /** + * Returns page title for the menu's active item + * @returns {KTMenu} + */ + getPageTitle: function(item) { + var query; + + return (query = KTUtil.child(item, '.kt-menu__link-text') ? query.innerHTML : ''); + }, + + /** + * Trigger events + */ + eventTrigger: function(name, target, e) { + for (var i = 0; i < the.events.length; i++ ) { + var event = the.events[i]; + if ( event.name == name ) { + if ( event.one == true ) { + if ( event.fired == false ) { + the.events[i].fired = true; + return event.handler.call(this, target, e); + } + } else { + return event.handler.call(this, target, e); + } + } + } + }, + + addEvent: function(name, handler, one) { + the.events.push({ + name: name, + handler: handler, + one: one, + fired: false + }); + }, + + removeEvent: function(name) { + if (the.events[name]) { + delete the.events[name]; + } + } + }; + + ////////////////////////// + // ** Public Methods ** // + ////////////////////////// + + /** + * Set default options + */ + + the.setDefaults = function(options) { + defaultOptions = options; + }; + + /** + * Update scroll + */ + the.scrollUpdate = function() { + return Plugin.scrollUpdate(); + }; + + /** + * Re-init scroll + */ + the.scrollReInit = function() { + return Plugin.scrollInit(); + }; + + /** + * Scroll top + */ + the.scrollTop = function() { + return Plugin.scrollTop(); + }; + + /** + * Set active menu item + */ + the.setActiveItem = function(item) { + return Plugin.setActiveItem(item); + }; + + the.reload = function() { + return Plugin.reload(); + }; + + the.update = function(options) { + return Plugin.update(options); + }; + + /** + * Set breadcrumb for menu item + */ + the.getBreadcrumbs = function(item) { + return Plugin.getBreadcrumbs(item); + }; + + /** + * Set page title for menu item + */ + the.getPageTitle = function(item) { + return Plugin.getPageTitle(item); + }; + + /** + * Get submenu mode + */ + the.getSubmenuMode = function(el) { + return Plugin.getSubmenuMode(el); + }; + + /** + * Hide dropdown + * @returns {Object} + */ + the.hideDropdown = function(item) { + Plugin.hideSubmenuDropdown(item, true); + }; + + /** + * Hide dropdowns + * @returns {Object} + */ + the.hideDropdowns = function() { + Plugin.hideSubmenuDropdowns(); + }; + + /** + * Disable menu for given time + * @returns {Object} + */ + the.pauseDropdownHover = function(time) { + Plugin.pauseDropdownHover(time); + }; + + /** + * Disable menu for given time + * @returns {Object} + */ + the.resumeDropdownHover = function() { + return Plugin.resumeDropdownHover(); + }; + + /** + * Register event + */ + the.on = function(name, handler) { + return Plugin.addEvent(name, handler); + }; + + the.off = function(name) { + return Plugin.removeEvent(name); + }; + + the.one = function(name, handler) { + return Plugin.addEvent(name, handler, true); + }; + + /////////////////////////////// + // ** Plugin Construction ** // + /////////////////////////////// + + // Run plugin + Plugin.construct.apply(the, [options]); + + // Handle plugin on window resize + KTUtil.addResizeHandler(function() { + if (init) { + the.reload(); + } + }); + + // Init done + init = true; + + // Return plugin instance + return the; +}; + +// webpack support +if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { + module.exports = KTMenu; +} + +// Plugin global lazy initialization +document.addEventListener("click", function (e) { + var body = KTUtil.get('body'); + var query; + if ( query = body.querySelectorAll('.kt-menu__nav .kt-menu__item.kt-menu__item--submenu.kt-menu__item--hover:not(.kt-menu__item--tabs)[data-ktmenu-submenu-toggle="click"]') ) { + for (var i = 0, len = query.length; i < len; i++) { + var element = query[i].closest('.kt-menu__nav').parentNode; + + if ( element ) { + var the = KTUtil.data(element).get('menu'); + + if ( !the ) { + break; + } + + if ( !the || the.getSubmenuMode() !== 'dropdown' ) { + break; + } + + if ( e.target !== element && element.contains(e.target) === false ) { + the.hideDropdowns(); + } + } + } + } +}); diff --git a/src/assets/js/global/components/base/offcanvas.js b/src/assets/js/global/components/base/offcanvas.js new file mode 100644 index 0000000..2e17213 --- /dev/null +++ b/src/assets/js/global/components/base/offcanvas.js @@ -0,0 +1,273 @@ +"use strict"; +var KTOffcanvas = function(elementId, options) { + // Main object + var the = this; + var init = false; + + // Get element object + var element = KTUtil.get(elementId); + var body = KTUtil.get('body'); + + if (!element) { + return; + } + + // Default options + var defaultOptions = {}; + + //////////////////////////// + // ** Private Methods ** // + //////////////////////////// + + var Plugin = { + construct: function(options) { + if (KTUtil.data(element).has('offcanvas')) { + the = KTUtil.data(element).get('offcanvas'); + } else { + // reset offcanvas + Plugin.init(options); + + // build offcanvas + Plugin.build(); + + KTUtil.data(element).set('offcanvas', the); + } + + return the; + }, + + init: function(options) { + the.events = []; + + // merge default and user defined options + the.options = KTUtil.deepExtend({}, defaultOptions, options); + the.overlay; + + the.classBase = the.options.baseClass; + the.classShown = the.classBase + '--on'; + the.classOverlay = the.classBase + '-overlay'; + + the.state = KTUtil.hasClass(element, the.classShown) ? 'shown' : 'hidden'; + }, + + build: function() { + // offcanvas toggle + if (the.options.toggleBy) { + if (typeof the.options.toggleBy === 'string') { + KTUtil.addEvent( the.options.toggleBy, 'click', function(e) { + e.preventDefault(); + Plugin.toggle(); + }); + } else if (the.options.toggleBy && the.options.toggleBy[0]) { + if (the.options.toggleBy[0].target) { + for (var i in the.options.toggleBy) { + KTUtil.addEvent( the.options.toggleBy[i].target, 'click', function(e) { + e.preventDefault(); + Plugin.toggle(); + }); + } + } else { + for (var i in the.options.toggleBy) { + KTUtil.addEvent( the.options.toggleBy[i], 'click', function(e) { + e.preventDefault(); + Plugin.toggle(); + }); + } + } + + } else if (the.options.toggleBy && the.options.toggleBy.target) { + KTUtil.addEvent( the.options.toggleBy.target, 'click', function(e) { + e.preventDefault(); + Plugin.toggle(); + }); + } + } + + // offcanvas close + var closeBy = KTUtil.get(the.options.closeBy); + if (closeBy) { + KTUtil.addEvent(closeBy, 'click', function(e) { + e.preventDefault(); + Plugin.hide(); + }); + } + + // Window resize + /* + KTUtil.addResizeHandler(function() { + if (parseInt(KTUtil.css(element, 'left')) >= 0 || parseInt(KTUtil.css(element, 'right') >= 0) || KTUtil.css(element, 'position') != 'fixed') { + KTUtil.css(element, 'opacity', '1'); + } + }); + */ + }, + + isShown: function(target) { + return (the.state == 'shown' ? true : false); + }, + + toggle: function() {; + Plugin.eventTrigger('toggle'); + + if (the.state == 'shown') { + Plugin.hide(this); + } else { + Plugin.show(this); + } + }, + + show: function(target) { + if (the.state == 'shown') { + return; + } + + Plugin.eventTrigger('beforeShow'); + + Plugin.togglerClass(target, 'show'); + + // Offcanvas panel + KTUtil.addClass(body, the.classShown); + KTUtil.addClass(element, the.classShown); + //KTUtil.css(element, 'opacity', '1'); + + the.state = 'shown'; + + if (the.options.overlay) { + the.overlay = KTUtil.insertAfter(document.createElement('DIV') , element ); + KTUtil.addClass(the.overlay, the.classOverlay); + KTUtil.addEvent(the.overlay, 'click', function(e) { + e.stopPropagation(); + e.preventDefault(); + Plugin.hide(target); + }); + } + + Plugin.eventTrigger('afterShow'); + }, + + hide: function(target) { + if (the.state == 'hidden') { + return; + } + + Plugin.eventTrigger('beforeHide'); + + Plugin.togglerClass(target, 'hide'); + + KTUtil.removeClass(body, the.classShown); + KTUtil.removeClass(element, the.classShown); + + the.state = 'hidden'; + + if (the.options.overlay && the.overlay) { + KTUtil.remove(the.overlay); + } + + /* + KTUtil.transitionEnd(element, function() { + KTUtil.css(element, 'opacity', '0'); + }); + */ + + Plugin.eventTrigger('afterHide'); + }, + + togglerClass: function(target, mode) { + // Toggler + var id = KTUtil.attr(target, 'id'); + var toggleBy; + + if (the.options.toggleBy && the.options.toggleBy[0] && the.options.toggleBy[0].target) { + for (var i in the.options.toggleBy) { + if (the.options.toggleBy[i].target === id) { + toggleBy = the.options.toggleBy[i]; + } + } + } else if (the.options.toggleBy && the.options.toggleBy.target) { + toggleBy = the.options.toggleBy; + } + + if (toggleBy) { + var el = KTUtil.get(toggleBy.target); + + if (mode === 'show') { + KTUtil.addClass(el, toggleBy.state); + } + + if (mode === 'hide') { + KTUtil.removeClass(el, toggleBy.state); + } + } + }, + + eventTrigger: function(name, args) { + for (var i = 0; i < the.events.length; i++) { + var event = the.events[i]; + if (event.name == name) { + if (event.one == true) { + if (event.fired == false) { + the.events[i].fired = true; + return event.handler.call(this, the, args); + } + } else { + return event.handler.call(this, the, args); + } + } + } + }, + + addEvent: function(name, handler, one) { + the.events.push({ + name: name, + handler: handler, + one: one, + fired: false + }); + } + }; + + ////////////////////////// + // ** Public Methods ** // + ////////////////////////// + the.setDefaults = function(options) { + defaultOptions = options; + }; + + the.isShown = function() { + return Plugin.isShown(); + }; + + the.hide = function() { + return Plugin.hide(); + }; + + the.show = function() { + return Plugin.show(); + }; + + the.on = function(name, handler) { + return Plugin.addEvent(name, handler); + }; + + the.one = function(name, handler) { + return Plugin.addEvent(name, handler, true); + }; + + /////////////////////////////// + // ** Plugin Construction ** // + /////////////////////////////// + + // Run plugin + Plugin.construct.apply(the, [options]); + + // Init done + init = true; + + // Return plugin instance + return the; +}; + +// webpack support +if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { + module.exports = KTOffcanvas; +} diff --git a/src/assets/js/global/components/base/portlet.js b/src/assets/js/global/components/base/portlet.js new file mode 100644 index 0000000..15af314 --- /dev/null +++ b/src/assets/js/global/components/base/portlet.js @@ -0,0 +1,652 @@ +"use strict"; +// plugin setup +var KTPortlet = function(elementId, options) { + // Main object + var the = this; + var init = false; + + // Get element object + var element = KTUtil.get(elementId); + var body = KTUtil.get('body'); + + if (!element) { + return; + } + + // Default options + var defaultOptions = { + bodyToggleSpeed: 400, + tooltips: true, + tools: { + toggle: { + collapse: 'Collapse', + expand: 'Expand' + }, + reload: 'Reload', + remove: 'Remove', + fullscreen: { + on: 'Fullscreen', + off: 'Exit Fullscreen' + } + }, + sticky: { + offset: 300, + zIndex: 101 + } + }; + + //////////////////////////// + // ** Private Methods ** // + //////////////////////////// + + var Plugin = { + /** + * Construct + */ + + construct: function(options) { + if (KTUtil.data(element).has('portlet')) { + the = KTUtil.data(element).get('portlet'); + } else { + // reset menu + Plugin.init(options); + + // build menu + Plugin.build(); + + KTUtil.data(element).set('portlet', the); + } + + return the; + }, + + /** + * Init portlet + */ + init: function(options) { + the.element = element; + the.events = []; + + // merge default and user defined options + the.options = KTUtil.deepExtend({}, defaultOptions, options); + the.head = KTUtil.child(element, '.kt-portlet__head'); + the.foot = KTUtil.child(element, '.kt-portlet__foot'); + + if (KTUtil.child(element, '.kt-portlet__body')) { + the.body = KTUtil.child(element, '.kt-portlet__body'); + } else if (KTUtil.child(element, '.kt-form')) { + the.body = KTUtil.child(element, '.kt-form'); + } + }, + + /** + * Build Form Wizard + */ + build: function() { + // Remove + var remove = KTUtil.find(the.head, '[data-ktportlet-tool=remove]'); + if (remove) { + KTUtil.addEvent(remove, 'click', function(e) { + e.preventDefault(); + Plugin.remove(); + }); + } + + // Reload + var reload = KTUtil.find(the.head, '[data-ktportlet-tool=reload]'); + if (reload) { + KTUtil.addEvent(reload, 'click', function(e) { + e.preventDefault(); + Plugin.reload(); + }); + } + + // Toggle + var toggle = KTUtil.find(the.head, '[data-ktportlet-tool=toggle]'); + if (toggle) { + KTUtil.addEvent(toggle, 'click', function(e) { + e.preventDefault(); + Plugin.toggle(); + }); + } + + //== Fullscreen + var fullscreen = KTUtil.find(the.head, '[data-ktportlet-tool=fullscreen]'); + if (fullscreen) { + KTUtil.addEvent(fullscreen, 'click', function(e) { + e.preventDefault(); + Plugin.fullscreen(); + }); + } + + Plugin.setupTooltips(); + }, + + /** + * Enable stickt mode + */ + initSticky: function() { + var lastScrollTop = 0; + var offset = the.options.sticky.offset; + + if (!the.head) { + return; + } + + window.addEventListener('scroll', Plugin.onScrollSticky); + }, + + /** + * Window scroll handle event for sticky portlet + */ + onScrollSticky: function(e) { + var offset = the.options.sticky.offset; + + if(isNaN(offset)) return; + + var st = KTUtil.getScrollTop(); + + if (st >= offset && KTUtil.hasClass(body, 'kt-portlet--sticky') === false) { + Plugin.eventTrigger('stickyOn'); + + KTUtil.addClass(body, 'kt-portlet--sticky'); + KTUtil.addClass(element, 'kt-portlet--sticky'); + + Plugin.updateSticky(); + + } else if ((st*1.5) <= offset && KTUtil.hasClass(body, 'kt-portlet--sticky')) { + // back scroll mode + Plugin.eventTrigger('stickyOff'); + + KTUtil.removeClass(body, 'kt-portlet--sticky'); + KTUtil.removeClass(element, 'kt-portlet--sticky'); + + Plugin.resetSticky(); + } + }, + + updateSticky: function() { + if (!the.head) { + return; + } + + var top; + + if (KTUtil.hasClass(body, 'kt-portlet--sticky')) { + if (the.options.sticky.position.top instanceof Function) { + top = parseInt(the.options.sticky.position.top.call(this, the)); + } else { + top = parseInt(the.options.sticky.position.top); + } + + var left; + if (the.options.sticky.position.left instanceof Function) { + left = parseInt(the.options.sticky.position.left.call(this, the)); + } else { + left = parseInt(the.options.sticky.position.left); + } + + var right; + if (the.options.sticky.position.right instanceof Function) { + right = parseInt(the.options.sticky.position.right.call(this, the)); + } else { + right = parseInt(the.options.sticky.position.right); + } + + KTUtil.css(the.head, 'z-index', the.options.sticky.zIndex); + KTUtil.css(the.head, 'top', top + 'px'); + KTUtil.css(the.head, 'left', left + 'px'); + KTUtil.css(the.head, 'right', right + 'px'); + } + }, + + resetSticky: function() { + if (!the.head) { + return; + } + + if (KTUtil.hasClass(body, 'kt-portlet--sticky') === false) { + KTUtil.css(the.head, 'z-index', ''); + KTUtil.css(the.head, 'top', ''); + KTUtil.css(the.head, 'left', ''); + KTUtil.css(the.head, 'right', ''); + } + }, + + /** + * Remove portlet + */ + remove: function() { + if (Plugin.eventTrigger('beforeRemove') === false) { + return; + } + + if (KTUtil.hasClass(body, 'kt-portlet--fullscreen') && KTUtil.hasClass(element, 'kt-portlet--fullscreen')) { + Plugin.fullscreen('off'); + } + + Plugin.removeTooltips(); + + KTUtil.remove(element); + + Plugin.eventTrigger('afterRemove'); + }, + + /** + * Set content + */ + setContent: function(html) { + if (html) { + the.body.innerHTML = html; + } + }, + + /** + * Get body + */ + getBody: function() { + return the.body; + }, + + /** + * Get self + */ + getSelf: function() { + return element; + }, + + /** + * Setup tooltips + */ + setupTooltips: function() { + if (the.options.tooltips) { + var collapsed = KTUtil.hasClass(element, 'kt-portlet--collapse') || KTUtil.hasClass(element, 'kt-portlet--collapsed'); + var fullscreenOn = KTUtil.hasClass(body, 'kt-portlet--fullscreen') && KTUtil.hasClass(element, 'kt-portlet--fullscreen'); + + //== Remove + var remove = KTUtil.find(the.head, '[data-ktportlet-tool=remove]'); + if (remove) { + var placement = (fullscreenOn ? 'bottom' : 'top'); + var tip = new Tooltip(remove, { + title: the.options.tools.remove, + placement: placement, + offset: (fullscreenOn ? '0,10px,0,0' : '0,5px'), + trigger: 'hover', + template: '' + }); + + KTUtil.data(remove).set('tooltip', tip); + } + + //== Reload + var reload = KTUtil.find(the.head, '[data-ktportlet-tool=reload]'); + if (reload) { + var placement = (fullscreenOn ? 'bottom' : 'top'); + var tip = new Tooltip(reload, { + title: the.options.tools.reload, + placement: placement, + offset: (fullscreenOn ? '0,10px,0,0' : '0,5px'), + trigger: 'hover', + template: '' + }); + + KTUtil.data(reload).set('tooltip', tip); + } + + //== Toggle + var toggle = KTUtil.find(the.head, '[data-ktportlet-tool=toggle]'); + if (toggle) { + var placement = (fullscreenOn ? 'bottom' : 'top'); + var tip = new Tooltip(toggle, { + title: (collapsed ? the.options.tools.toggle.expand : the.options.tools.toggle.collapse), + placement: placement, + offset: (fullscreenOn ? '0,10px,0,0' : '0,5px'), + trigger: 'hover', + template: '' + }); + + KTUtil.data(toggle).set('tooltip', tip); + } + + //== Fullscreen + var fullscreen = KTUtil.find(the.head, '[data-ktportlet-tool=fullscreen]'); + if (fullscreen) { + var placement = (fullscreenOn ? 'bottom' : 'top'); + var tip = new Tooltip(fullscreen, { + title: (fullscreenOn ? the.options.tools.fullscreen.off : the.options.tools.fullscreen.on), + placement: placement, + offset: (fullscreenOn ? '0,10px,0,0' : '0,5px'), + trigger: 'hover', + template: '' + }); + + KTUtil.data(fullscreen).set('tooltip', tip); + } + } + }, + + /** + * Setup tooltips + */ + removeTooltips: function() { + if (the.options.tooltips) { + //== Remove + var remove = KTUtil.find(the.head, '[data-ktportlet-tool=remove]'); + if (remove && KTUtil.data(remove).has('tooltip')) { + KTUtil.data(remove).get('tooltip').dispose(); + } + + //== Reload + var reload = KTUtil.find(the.head, '[data-ktportlet-tool=reload]'); + if (reload && KTUtil.data(reload).has('tooltip')) { + KTUtil.data(reload).get('tooltip').dispose(); + } + + //== Toggle + var toggle = KTUtil.find(the.head, '[data-ktportlet-tool=toggle]'); + if (toggle && KTUtil.data(toggle).has('tooltip')) { + KTUtil.data(toggle).get('tooltip').dispose(); + } + + //== Fullscreen + var fullscreen = KTUtil.find(the.head, '[data-ktportlet-tool=fullscreen]'); + if (fullscreen && KTUtil.data(fullscreen).has('tooltip')) { + KTUtil.data(fullscreen).get('tooltip').dispose(); + } + } + }, + + /** + * Reload + */ + reload: function() { + Plugin.eventTrigger('reload'); + }, + + /** + * Toggle + */ + toggle: function() { + if (KTUtil.hasClass(element, 'kt-portlet--collapse') || KTUtil.hasClass(element, 'kt-portlet--collapsed')) { + Plugin.expand(); + } else { + Plugin.collapse(); + } + }, + + /** + * Collapse + */ + collapse: function() { + if (Plugin.eventTrigger('beforeCollapse') === false) { + return; + } + + KTUtil.slideUp(the.body, the.options.bodyToggleSpeed, function() { + Plugin.eventTrigger('afterCollapse'); + }); + + KTUtil.addClass(element, 'kt-portlet--collapse'); + + var toggle = KTUtil.find(the.head, '[data-ktportlet-tool=toggle]'); + if (toggle && KTUtil.data(toggle).has('tooltip')) { + KTUtil.data(toggle).get('tooltip').updateTitleContent(the.options.tools.toggle.expand); + } + }, + + /** + * Expand + */ + expand: function() { + if (Plugin.eventTrigger('beforeExpand') === false) { + return; + } + + KTUtil.slideDown(the.body, the.options.bodyToggleSpeed, function() { + Plugin.eventTrigger('afterExpand'); + }); + + KTUtil.removeClass(element, 'kt-portlet--collapse'); + KTUtil.removeClass(element, 'kt-portlet--collapsed'); + + var toggle = KTUtil.find(the.head, '[data-ktportlet-tool=toggle]'); + if (toggle && KTUtil.data(toggle).has('tooltip')) { + KTUtil.data(toggle).get('tooltip').updateTitleContent(the.options.tools.toggle.collapse); + } + }, + + /** + * fullscreen + */ + fullscreen: function(mode) { + var d = {}; + var speed = 300; + + if (mode === 'off' || (KTUtil.hasClass(body, 'kt-portlet--fullscreen') && KTUtil.hasClass(element, 'kt-portlet--fullscreen'))) { + Plugin.eventTrigger('beforeFullscreenOff'); + + KTUtil.removeClass(body, 'kt-portlet--fullscreen'); + KTUtil.removeClass(element, 'kt-portlet--fullscreen'); + + Plugin.removeTooltips(); + Plugin.setupTooltips(); + + if (the.foot) { + KTUtil.css(the.body, 'margin-bottom', ''); + KTUtil.css(the.foot, 'margin-top', ''); + } + + Plugin.eventTrigger('afterFullscreenOff'); + } else { + Plugin.eventTrigger('beforeFullscreenOn'); + + KTUtil.addClass(element, 'kt-portlet--fullscreen'); + KTUtil.addClass(body, 'kt-portlet--fullscreen'); + + Plugin.removeTooltips(); + Plugin.setupTooltips(); + + + if (the.foot) { + var height1 = parseInt(KTUtil.css(the.foot, 'height')); + var height2 = parseInt(KTUtil.css(the.foot, 'height')) + parseInt(KTUtil.css(the.head, 'height')); + KTUtil.css(the.body, 'margin-bottom', height1 + 'px'); + KTUtil.css(the.foot, 'margin-top', '-' + height2 + 'px'); + } + + Plugin.eventTrigger('afterFullscreenOn'); + } + }, + + /** + * Trigger events + */ + eventTrigger: function(name) { + //KTUtil.triggerCustomEvent(name); + for (var i = 0; i < the.events.length; i++) { + var event = the.events[i]; + if (event.name == name) { + if (event.one == true) { + if (event.fired == false) { + the.events[i].fired = true; + return event.handler.call(this, the); + } + } else { + return event.handler.call(this, the); + } + } + } + }, + + addEvent: function(name, handler, one) { + the.events.push({ + name: name, + handler: handler, + one: one, + fired: false + }); + + return the; + } + }; + + ////////////////////////// + // ** Public Methods ** // + ////////////////////////// + + /** + * Set default options + */ + + the.setDefaults = function(options) { + defaultOptions = options; + }; + + /** + * Remove portlet + * @returns {KTPortlet} + */ + the.remove = function() { + return Plugin.remove(html); + }; + + /** + * Remove portlet + * @returns {KTPortlet} + */ + the.initSticky = function() { + return Plugin.initSticky(); + }; + + /** + * Remove portlet + * @returns {KTPortlet} + */ + the.updateSticky = function() { + return Plugin.updateSticky(); + }; + + /** + * Remove portlet + * @returns {KTPortlet} + */ + the.resetSticky = function() { + return Plugin.resetSticky(); + }; + + /** + * Destroy sticky portlet + */ + the.destroySticky = function() { + Plugin.resetSticky(); + window.removeEventListener('scroll', Plugin.onScrollSticky); + }; + + /** + * Reload portlet + * @returns {KTPortlet} + */ + the.reload = function() { + return Plugin.reload(); + }; + + /** + * Set portlet content + * @returns {KTPortlet} + */ + the.setContent = function(html) { + return Plugin.setContent(html); + }; + + /** + * Toggle portlet + * @returns {KTPortlet} + */ + the.toggle = function() { + return Plugin.toggle(); + }; + + /** + * Collapse portlet + * @returns {KTPortlet} + */ + the.collapse = function() { + return Plugin.collapse(); + }; + + /** + * Expand portlet + * @returns {KTPortlet} + */ + the.expand = function() { + return Plugin.expand(); + }; + + /** + * Fullscreen portlet + * @returns {MPortlet} + */ + the.fullscreen = function() { + return Plugin.fullscreen('on'); + }; + + /** + * Fullscreen portlet + * @returns {MPortlet} + */ + the.unFullscreen = function() { + return Plugin.fullscreen('off'); + }; + + /** + * Get portletbody + * @returns {jQuery} + */ + the.getBody = function() { + return Plugin.getBody(); + }; + + /** + * Get portletbody + * @returns {jQuery} + */ + the.getSelf = function() { + return Plugin.getSelf(); + }; + + /** + * Attach event + */ + the.on = function(name, handler) { + return Plugin.addEvent(name, handler); + }; + + /** + * Attach event that will be fired once + */ + the.one = function(name, handler) { + return Plugin.addEvent(name, handler, true); + }; + + // Construct plugin + Plugin.construct.apply(the, [options]); + + return the; +}; + +// webpack support +if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { + module.exports = KTPortlet; +} diff --git a/src/assets/js/global/components/base/scrolltop.js b/src/assets/js/global/components/base/scrolltop.js new file mode 100644 index 0000000..7586b16 --- /dev/null +++ b/src/assets/js/global/components/base/scrolltop.js @@ -0,0 +1,177 @@ +"use strict"; +var KTScrolltop = function(elementId, options) { + // Main object + var the = this; + var init = false; + + // Get element object + var element = KTUtil.get(elementId); + var body = KTUtil.get('body'); + + if (!element) { + return; + } + + // Default options + var defaultOptions = { + offset: 300, + speed: 600, + toggleClass: 'kt-scrolltop--on' + }; + + //////////////////////////// + // ** Private Methods ** // + //////////////////////////// + + var Plugin = { + /** + * Run plugin + * @returns {mscrolltop} + */ + construct: function(options) { + if (KTUtil.data(element).has('scrolltop')) { + the = KTUtil.data(element).get('scrolltop'); + } else { + // reset scrolltop + Plugin.init(options); + + // build scrolltop + Plugin.build(); + + KTUtil.data(element).set('scrolltop', the); + } + + return the; + }, + + /** + * Handles subscrolltop click toggle + * @returns {mscrolltop} + */ + init: function(options) { + the.events = []; + + // merge default and user defined options + the.options = KTUtil.deepExtend({}, defaultOptions, options); + }, + + build: function() { + // handle window scroll + if (navigator.userAgent.match(/iPhone|iPad|iPod/i)) { + window.addEventListener('touchend', function() { + Plugin.handle(); + }); + + window.addEventListener('touchcancel', function() { + Plugin.handle(); + }); + + window.addEventListener('touchleave', function() { + Plugin.handle(); + }); + } else { + window.addEventListener('scroll', function() { + Plugin.handle(); + }); + } + + // handle button click + KTUtil.addEvent(element, 'click', Plugin.scroll); + }, + + /** + * Handles scrolltop click scrollTop + */ + handle: function() { + var pos = window.pageYOffset; // current vertical position + if (pos > the.options.offset) { + KTUtil.addClass(body, the.options.toggleClass); + } else { + KTUtil.removeClass(body, the.options.toggleClass); + } + }, + + /** + * Handles scrolltop click scrollTop + */ + scroll: function(e) { + e.preventDefault(); + + KTUtil.scrollTop(0, the.options.speed); + }, + + + /** + * Trigger events + */ + eventTrigger: function(name, args) { + for (var i = 0; i < the.events.length; i++) { + var event = the.events[i]; + if (event.name == name) { + if (event.one == true) { + if (event.fired == false) { + the.events[i].fired = true; + return event.handler.call(this, the, args); + } + } else { + return event.handler.call(this, the, args); + } + } + } + }, + + addEvent: function(name, handler, one) { + the.events.push({ + name: name, + handler: handler, + one: one, + fired: false + }); + } + }; + + ////////////////////////// + // ** Public Methods ** // + ////////////////////////// + + /** + * Set default options + */ + + the.setDefaults = function(options) { + defaultOptions = options; + }; + + /** + * Get subscrolltop mode + */ + the.on = function(name, handler) { + return Plugin.addEvent(name, handler); + }; + + /** + * Set scrolltop content + * @returns {mscrolltop} + */ + the.one = function(name, handler) { + return Plugin.addEvent(name, handler, true); + }; + + /////////////////////////////// + // ** Plugin Construction ** // + /////////////////////////////// + + // Run plugin + Plugin.construct.apply(the, [options]); + + // Init done + init = true; + + // Return plugin instance + return the; +}; + +// webpack support +if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { + module.exports = KTScrolltop; +} \ No newline at end of file diff --git a/src/assets/js/global/components/base/toggle.js b/src/assets/js/global/components/base/toggle.js new file mode 100644 index 0000000..e999946 --- /dev/null +++ b/src/assets/js/global/components/base/toggle.js @@ -0,0 +1,230 @@ +"use strict"; + +// plugin setup +var KTToggle = function(elementId, options) { + // Main object + var the = this; + var init = false; + + // Get element object + var element = KTUtil.get(elementId); + var body = KTUtil.get('body'); + + if (!element) { + return; + } + + // Default options + var defaultOptions = { + togglerState: '', + targetState: '' + }; + + //////////////////////////// + // ** Private Methods ** // + //////////////////////////// + + var Plugin = { + /** + * Construct + */ + + construct: function(options) { + if (KTUtil.data(element).has('toggle')) { + the = KTUtil.data(element).get('toggle'); + } else { + // reset menu + Plugin.init(options); + + // build menu + Plugin.build(); + + KTUtil.data(element).set('toggle', the); + } + + return the; + }, + + /** + * Handles subtoggle click toggle + */ + init: function(options) { + the.element = element; + the.events = []; + + // merge default and user defined options + the.options = KTUtil.deepExtend({}, defaultOptions, options); + + the.target = KTUtil.get(the.options.target); + the.targetState = the.options.targetState; + the.togglerState = the.options.togglerState; + + the.state = KTUtil.hasClasses(the.target, the.targetState) ? 'on' : 'off'; + }, + + /** + * Setup toggle + */ + build: function() { + KTUtil.addEvent(element, 'mouseup', Plugin.toggle); + }, + + /** + * Handles offcanvas click toggle + */ + toggle: function(e) { + Plugin.eventTrigger('beforeToggle'); + + if (the.state == 'off') { + Plugin.toggleOn(); + } else { + Plugin.toggleOff(); + } + + Plugin.eventTrigger('afterToggle'); + + e.preventDefault(); + + return the; + }, + + /** + * Handles toggle click toggle + */ + toggleOn: function() { + Plugin.eventTrigger('beforeOn'); + + KTUtil.addClass(the.target, the.targetState); + + if (the.togglerState) { + KTUtil.addClass(element, the.togglerState); + } + + the.state = 'on'; + + Plugin.eventTrigger('afterOn'); + + Plugin.eventTrigger('toggle'); + + return the; + }, + + /** + * Handles toggle click toggle + */ + toggleOff: function() { + Plugin.eventTrigger('beforeOff'); + + KTUtil.removeClass(the.target, the.targetState); + + if (the.togglerState) { + KTUtil.removeClass(element, the.togglerState); + } + + the.state = 'off'; + + Plugin.eventTrigger('afterOff'); + + Plugin.eventTrigger('toggle'); + + return the; + }, + + /** + * Trigger events + */ + eventTrigger: function(name) { + for (var i = 0; i < the.events.length; i++) { + var event = the.events[i]; + + if (event.name == name) { + if (event.one == true) { + if (event.fired == false) { + the.events[i].fired = true; + return event.handler.call(this, the); + } + } else { + return event.handler.call(this, the); + } + } + } + }, + + addEvent: function(name, handler, one) { + the.events.push({ + name: name, + handler: handler, + one: one, + fired: false + }); + + return the; + } + }; + + ////////////////////////// + // ** Public Methods ** // + ////////////////////////// + + /** + * Set default options + */ + + the.setDefaults = function(options) { + defaultOptions = options; + }; + + /** + * Get toggle state + */ + the.getState = function() { + return the.state; + }; + + /** + * Toggle + */ + the.toggle = function() { + return Plugin.toggle(); + }; + + /** + * Toggle on + */ + the.toggleOn = function() { + return Plugin.toggleOn(); + }; + + /** + * Toggle off + */ + the.toggleOff = function() { + return Plugin.toggleOff(); + }; + + /** + * Attach event + * @returns {KTToggle} + */ + the.on = function(name, handler) { + return Plugin.addEvent(name, handler); + }; + + /** + * Attach event that will be fired once + * @returns {KTToggle} + */ + the.one = function(name, handler) { + return Plugin.addEvent(name, handler, true); + }; + + // Construct plugin + Plugin.construct.apply(the, [options]); + + return the; +}; + +// webpack support +if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { + module.exports = KTToggle; +} \ No newline at end of file diff --git a/src/assets/js/global/components/base/util.js b/src/assets/js/global/components/base/util.js new file mode 100644 index 0000000..0fd532f --- /dev/null +++ b/src/assets/js/global/components/base/util.js @@ -0,0 +1,1583 @@ +"use strict"; +/** + * @class KTUtil base utilize class that privides helper functions + */ + +// Polyfills +/** + * Element.matches() polyfill (simple version) + * https://developer.mozilla.org/en-US/docs/Web/API/Element/matches#Polyfill + */ +if (!Element.prototype.matches) { + Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector; +} + +/** + * Element.closest() polyfill + * https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill + */ +if (!Element.prototype.closest) { + if (!Element.prototype.matches) { + Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector; + } + Element.prototype.closest = function (s) { + var el = this; + var ancestor = this; + if (!document.documentElement.contains(el)) return null; + do { + if (ancestor.matches(s)) return ancestor; + ancestor = ancestor.parentElement; + } while (ancestor !== null); + return null; + }; +} + +/** + * ChildNode.remove() polyfill + * https://gomakethings.com/removing-an-element-from-the-dom-the-es6-way/ + * @author Chris Ferdinandi + * @license MIT + */ +(function (elem) { + for (var i = 0; i < elem.length; i++) { + if (!window[elem[i]] || 'remove' in window[elem[i]].prototype) continue; + window[elem[i]].prototype.remove = function () { + this.parentNode.removeChild(this); + }; + } +})(['Element', 'CharacterData', 'DocumentType']); + +// +// requestAnimationFrame polyfill by Erik Möller. +// With fixes from Paul Irish and Tino Zijdel +// +// http://paulirish.com/2011/requestanimationframe-for-smart-animating/ +// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating +// +// MIT license +// +(function() { + var lastTime = 0; + var vendors = ['webkit', 'moz']; + for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { + window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame']; + window.cancelAnimationFrame = + window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame']; + } + + if (!window.requestAnimationFrame) + window.requestAnimationFrame = function(callback) { + var currTime = new Date().getTime(); + var timeToCall = Math.max(0, 16 - (currTime - lastTime)); + var id = window.setTimeout(function() { + callback(currTime + timeToCall); + }, timeToCall); + lastTime = currTime + timeToCall; + return id; + }; + + if (!window.cancelAnimationFrame) + window.cancelAnimationFrame = function(id) { + clearTimeout(id); + }; +}()); + +// Source: https://github.com/jserz/js_piece/blob/master/DOM/ParentNode/prepend()/prepend().md +(function(arr) { + arr.forEach(function(item) { + if (item.hasOwnProperty('prepend')) { + return; + } + Object.defineProperty(item, 'prepend', { + configurable: true, + enumerable: true, + writable: true, + value: function prepend() { + var argArr = Array.prototype.slice.call(arguments), + docFrag = document.createDocumentFragment(); + + argArr.forEach(function(argItem) { + var isNode = argItem instanceof Node; + docFrag.appendChild(isNode ? argItem : document.createTextNode(String(argItem))); + }); + + this.insertBefore(docFrag, this.firstChild); + } + }); + }); +})([Element.prototype, Document.prototype, DocumentFragment.prototype]); + +// Global variables +window.KTUtilElementDataStore = {}; +window.KTUtilElementDataStoreID = 0; +window.KTUtilDelegatedEventHandlers = {}; + +var KTUtil = function() { + var resizeHandlers = []; + + /** @type {object} breakpoints The device width breakpoints **/ + var breakpoints = { + sm: 544, // Small screen / phone + md: 768, // Medium screen / tablet + lg: 1024, // Large screen / desktop + xl: 1200 // Extra large screen / wide desktop + }; + + /** + * Handle window resize event with some + * delay to attach event handlers upon resize complete + */ + var _windowResizeHandler = function() { + var _runResizeHandlers = function() { + // reinitialize other subscribed elements + for (var i = 0; i < resizeHandlers.length; i++) { + var each = resizeHandlers[i]; + each.call(); + } + }; + + var timeout = false; // holder for timeout id + var delay = 250; // delay after event is "complete" to run callback + + window.addEventListener('resize', function() { + clearTimeout(timeout); + timeout = setTimeout(function() { + _runResizeHandlers(); + }, delay); // wait 50ms until window resize finishes. + }); + }; + + return { + /** + * Class main initializer. + * @param {object} options. + * @returns null + */ + //main function to initiate the theme + init: function(options) { + if (options && options.breakpoints) { + breakpoints = options.breakpoints; + } + + _windowResizeHandler(); + }, + + /** + * Adds window resize event handler. + * @param {function} callback function. + */ + addResizeHandler: function(callback) { + resizeHandlers.push(callback); + }, + + /** + * Removes window resize event handler. + * @param {function} callback function. + */ + removeResizeHandler: function(callback) { + for (var i = 0; i < resizeHandlers.length; i++) { + if (callback === resizeHandlers[i]) { + delete resizeHandlers[i]; + } + } + }, + + /** + * Trigger window resize handlers. + */ + runResizeHandlers: function() { + _runResizeHandlers(); + }, + + resize: function() { + if (typeof(Event) === 'function') { + // modern browsers + window.dispatchEvent(new Event('resize')); + } else { + // for IE and other old browsers + // causes deprecation warning on modern browsers + var evt = window.document.createEvent('UIEvents'); + evt.initUIEvent('resize', true, false, window, 0); + window.dispatchEvent(evt); + } + }, + + /** + * Get GET parameter value from URL. + * @param {string} paramName Parameter name. + * @returns {string} + */ + getURLParam: function(paramName) { + var searchString = window.location.search.substring(1), + i, val, params = searchString.split("&"); + + for (i = 0; i < params.length; i++) { + val = params[i].split("="); + if (val[0] == paramName) { + return unescape(val[1]); + } + } + + return null; + }, + + /** + * Checks whether current device is mobile touch. + * @returns {boolean} + */ + isMobileDevice: function() { + return (this.getViewPort().width < this.getBreakpoint('lg') ? true : false); + }, + + /** + * Checks whether current device is desktop. + * @returns {boolean} + */ + isDesktopDevice: function() { + return KTUtil.isMobileDevice() ? false : true; + }, + + /** + * Gets browser window viewport size. Ref: + * http://andylangton.co.uk/articles/javascript/get-viewport-size-javascript/ + * @returns {object} + */ + getViewPort: function() { + var e = window, + a = 'inner'; + if (!('innerWidth' in window)) { + a = 'client'; + e = document.documentElement || document.body; + } + + return { + width: e[a + 'Width'], + height: e[a + 'Height'] + }; + }, + + /** + * Checks whether given device mode is currently activated. + * @param {string} mode Responsive mode name(e.g: desktop, + * desktop-and-tablet, tablet, tablet-and-mobile, mobile) + * @returns {boolean} + */ + isInResponsiveRange: function(mode) { + var breakpoint = this.getViewPort().width; + + if (mode == 'general') { + return true; + } else if (mode == 'desktop' && breakpoint >= (this.getBreakpoint('lg') + 1)) { + return true; + } else if (mode == 'tablet' && (breakpoint >= (this.getBreakpoint('md') + 1) && breakpoint < this.getBreakpoint('lg'))) { + return true; + } else if (mode == 'mobile' && breakpoint <= this.getBreakpoint('md')) { + return true; + } else if (mode == 'desktop-and-tablet' && breakpoint >= (this.getBreakpoint('md') + 1)) { + return true; + } else if (mode == 'tablet-and-mobile' && breakpoint <= this.getBreakpoint('lg')) { + return true; + } else if (mode == 'minimal-desktop-and-below' && breakpoint <= this.getBreakpoint('xl')) { + return true; + } + + return false; + }, + + /** + * Generates unique ID for give prefix. + * @param {string} prefix Prefix for generated ID + * @returns {boolean} + */ + getUniqueID: function(prefix) { + return prefix + Math.floor(Math.random() * (new Date()).getTime()); + }, + + /** + * Gets window width for give breakpoint mode. + * @param {string} mode Responsive mode name(e.g: xl, lg, md, sm) + * @returns {number} + */ + getBreakpoint: function(mode) { + return breakpoints[mode]; + }, + + /** + * Checks whether object has property matchs given key path. + * @param {object} obj Object contains values paired with given key path + * @param {string} keys Keys path seperated with dots + * @returns {object} + */ + isset: function(obj, keys) { + var stone; + + keys = keys || ''; + + if (keys.indexOf('[') !== -1) { + throw new Error('Unsupported object path notation.'); + } + + keys = keys.split('.'); + + do { + if (obj === undefined) { + return false; + } + + stone = keys.shift(); + + if (!obj.hasOwnProperty(stone)) { + return false; + } + + obj = obj[stone]; + + } while (keys.length); + + return true; + }, + + /** + * Gets highest z-index of the given element parents + * @param {object} el jQuery element object + * @returns {number} + */ + getHighestZindex: function(el) { + var elem = KTUtil.get(el), + position, value; + + while (elem && elem !== document) { + // Ignore z-index if position is set to a value where z-index is ignored by the browser + // This makes behavior of this function consistent across browsers + // WebKit always returns auto if the element is positioned + position = KTUtil.css(elem, 'position'); + + if (position === "absolute" || position === "relative" || position === "fixed") { + // IE returns 0 when zIndex is not specified + // other browsers return a string + // we ignore the case of nested elements with an explicit value of 0 + //
    + value = parseInt(KTUtil.css(elem, 'z-index')); + + if (!isNaN(value) && value !== 0) { + return value; + } + } + + elem = elem.parentNode; + } + + return null; + }, + + /** + * Checks whether the element has any parent with fixed positionfreg + * @param {object} el jQuery element object + * @returns {boolean} + */ + hasFixedPositionedParent: function(el) { + var position; + + while (el && el !== document) { + position = KTUtil.css(el, 'position'); + + if (position === "fixed") { + return true; + } + + el = el.parentNode; + } + + return false; + }, + + /** + * Simulates delay + */ + sleep: function(milliseconds) { + var start = new Date().getTime(); + for (var i = 0; i < 1e7; i++) { + if ((new Date().getTime() - start) > milliseconds) { + break; + } + } + }, + + /** + * Gets randomly generated integer value within given min and max range + * @param {number} min Range start value + * @param {number} max Range end value + * @returns {number} + */ + getRandomInt: function(min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; + }, + + /** + * Checks whether Angular library is included + * @returns {boolean} + */ + isAngularVersion: function() { + return window.Zone !== undefined ? true : false; + }, + + // jQuery Workarounds + + // Deep extend: $.extend(true, {}, objA, objB); + deepExtend: function(out) { + out = out || {}; + + for (var i = 1; i < arguments.length; i++) { + var obj = arguments[i]; + + if (!obj) + continue; + + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + if (typeof obj[key] === 'object') + out[key] = KTUtil.deepExtend(out[key], obj[key]); + else + out[key] = obj[key]; + } + } + } + + return out; + }, + + // extend: $.extend({}, objA, objB); + extend: function(out) { + out = out || {}; + + for (var i = 1; i < arguments.length; i++) { + if (!arguments[i]) + continue; + + for (var key in arguments[i]) { + if (arguments[i].hasOwnProperty(key)) + out[key] = arguments[i][key]; + } + } + + return out; + }, + + get: function(query) { + var el; + + if (query === document) { + return document; + } + + if (!!(query && query.nodeType === 1)) { + return query; + } + + if (el = document.getElementById(query)) { + return el; + } else if (el = document.getElementsByTagName(query), el.length > 0) { + return el[0]; + } else if (el = document.getElementsByClassName(query), el.length > 0) { + return el[0]; + } else { + return null; + } + }, + + getByID: function(query) { + if (!!(query && query.nodeType === 1)) { + return query; + } + + return document.getElementById(query); + }, + + getByTag: function(query) { + var el; + + if (el = document.getElementsByTagName(query)) { + return el[0]; + } else { + return null; + } + }, + + getByClass: function(query) { + var el; + + if (el = document.getElementsByClassName(query)) { + return el[0]; + } else { + return null; + } + }, + + /** + * Checks whether the element has given classes + * @param {object} el jQuery element object + * @param {string} Classes string + * @returns {boolean} + */ + hasClasses: function(el, classes) { + if (!el) { + return; + } + + var classesArr = classes.split(" "); + + for (var i = 0; i < classesArr.length; i++) { + if (KTUtil.hasClass(el, KTUtil.trim(classesArr[i])) == false) { + return false; + } + } + + return true; + }, + + hasClass: function(el, className) { + if (!el) { + return; + } + + return el.classList ? el.classList.contains(className) : new RegExp('\\b' + className + '\\b').test(el.className); + }, + + addClass: function(el, className) { + if (!el || typeof className === 'undefined') { + return; + } + + var classNames = className.split(' '); + + if (el.classList) { + for (var i = 0; i < classNames.length; i++) { + if (classNames[i] && classNames[i].length > 0) { + el.classList.add(KTUtil.trim(classNames[i])); + } + } + } else if (!KTUtil.hasClass(el, className)) { + for (var x = 0; x < classNames.length; x++) { + el.className += ' ' + KTUtil.trim(classNames[x]); + } + } + }, + + removeClass: function(el, className) { + if (!el || typeof className === 'undefined') { + return; + } + + var classNames = className.split(' '); + + if (el.classList) { + for (var i = 0; i < classNames.length; i++) { + el.classList.remove(KTUtil.trim(classNames[i])); + } + } else if (KTUtil.hasClass(el, className)) { + for (var x = 0; x < classNames.length; x++) { + el.className = el.className.replace(new RegExp('\\b' + KTUtil.trim(classNames[x]) + '\\b', 'g'), ''); + } + } + }, + + triggerCustomEvent: function(el, eventName, data) { + var event; + if (window.CustomEvent) { + event = new CustomEvent(eventName, { + detail: data + }); + } else { + event = document.createEvent('CustomEvent'); + event.initCustomEvent(eventName, true, true, data); + } + + el.dispatchEvent(event); + }, + + triggerEvent: function(node, eventName) { + // Make sure we use the ownerDocument from the provided node to avoid cross-window problems + var doc; + if (node.ownerDocument) { + doc = node.ownerDocument; + } else if (node.nodeType == 9) { + // the node may be the document itself, nodeType 9 = DOCUMENT_NODE + doc = node; + } else { + throw new Error("Invalid node passed to fireEvent: " + node.id); + } + + if (node.dispatchEvent) { + // Gecko-style approach (now the standard) takes more work + var eventClass = ""; + + // Different events have different event classes. + // If this switch statement can't map an eventName to an eventClass, + // the event firing is going to fail. + switch (eventName) { + case "click": // Dispatching of 'click' appears to not work correctly in Safari. Use 'mousedown' or 'mouseup' instead. + case "mouseenter": + case "mouseleave": + case "mousedown": + case "mouseup": + eventClass = "MouseEvents"; + break; + + case "focus": + case "change": + case "blur": + case "select": + eventClass = "HTMLEvents"; + break; + + default: + throw "fireEvent: Couldn't find an event class for event '" + eventName + "'."; + break; + } + var event = doc.createEvent(eventClass); + + var bubbles = eventName == "change" ? false : true; + event.initEvent(eventName, bubbles, true); // All events created as bubbling and cancelable. + + event.synthetic = true; // allow detection of synthetic events + // The second parameter says go ahead with the default action + node.dispatchEvent(event, true); + } else if (node.fireEvent) { + // IE-old school style + var event = doc.createEventObject(); + event.synthetic = true; // allow detection of synthetic events + node.fireEvent("on" + eventName, event); + } + }, + + index: function( elm ){ + elm = KTUtil.get(elm); + var c = elm.parentNode.children, i = 0; + for(; i < c.length; i++ ) + if( c[i] == elm ) return i; + }, + + trim: function(string) { + return string.trim(); + }, + + eventTriggered: function(e) { + if (e.currentTarget.dataset.triggered) { + return true; + } else { + e.currentTarget.dataset.triggered = true; + + return false; + } + }, + + remove: function(el) { + if (el && el.parentNode) { + el.parentNode.removeChild(el); + } + }, + + find: function(parent, query) { + parent = KTUtil.get(parent); + if (parent) { + return parent.querySelector(query); + } + }, + + findAll: function(parent, query) { + parent = KTUtil.get(parent); + if (parent) { + return parent.querySelectorAll(query); + } + }, + + insertAfter: function(el, referenceNode) { + return referenceNode.parentNode.insertBefore(el, referenceNode.nextSibling); + }, + + parents: function(elem, selector) { + // Element.matches() polyfill + if (!Element.prototype.matches) { + Element.prototype.matches = + Element.prototype.matchesSelector || + Element.prototype.mozMatchesSelector || + Element.prototype.msMatchesSelector || + Element.prototype.oMatchesSelector || + Element.prototype.webkitMatchesSelector || + function(s) { + var matches = (this.document || this.ownerDocument).querySelectorAll(s), + i = matches.length; + while (--i >= 0 && matches.item(i) !== this) {} + return i > -1; + }; + } + + // Set up a parent array + var parents = []; + + // Push each parent element to the array + for ( ; elem && elem !== document; elem = elem.parentNode ) { + if (selector) { + if (elem.matches(selector)) { + parents.push(elem); + } + continue; + } + parents.push(elem); + } + + // Return our parent array + return parents; + }, + + children: function(el, selector, log) { + if (!el || !el.childNodes) { + return; + } + + var result = [], + i = 0, + l = el.childNodes.length; + + for (var i; i < l; ++i) { + if (el.childNodes[i].nodeType == 1 && KTUtil.matches(el.childNodes[i], selector, log)) { + result.push(el.childNodes[i]); + } + } + + return result; + }, + + child: function(el, selector, log) { + var children = KTUtil.children(el, selector, log); + + return children ? children[0] : null; + }, + + matches: function(el, selector, log) { + var p = Element.prototype; + var f = p.matches || p.webkitMatchesSelector || p.mozMatchesSelector || p.msMatchesSelector || function(s) { + return [].indexOf.call(document.querySelectorAll(s), this) !== -1; + }; + + if (el && el.tagName) { + return f.call(el, selector); + } else { + return false; + } + }, + + data: function(element) { + element = KTUtil.get(element); + + return { + set: function(name, data) { + if (element == null || element === undefined) { + return; + } + + if (element.customDataTag === undefined) { + window.KTUtilElementDataStoreID++; + element.customDataTag = window.KTUtilElementDataStoreID; + } + + if (window.KTUtilElementDataStore[element.customDataTag] === undefined) { + window.KTUtilElementDataStore[element.customDataTag] = {}; + } + + window.KTUtilElementDataStore[element.customDataTag][name] = data; + }, + + get: function(name) { + if (element === undefined) { + return; + } + + if (element == null || element.customDataTag === undefined) { + return null; + } + + return this.has(name) ? window.KTUtilElementDataStore[element.customDataTag][name] : null; + }, + + has: function(name) { + if (element === undefined) { + return false; + } + + if (element == null || element.customDataTag === undefined) { + return false; + } + + return (window.KTUtilElementDataStore[element.customDataTag] && window.KTUtilElementDataStore[element.customDataTag][name]) ? true : false; + }, + + remove: function(name) { + if (element && this.has(name)) { + delete window.KTUtilElementDataStore[element.customDataTag][name]; + } + } + }; + }, + + outerWidth: function(el, margin) { + var width; + + if (margin === true) { + width = parseFloat(el.offsetWidth); + width += parseFloat(KTUtil.css(el, 'margin-left')) + parseFloat(KTUtil.css(el, 'margin-right')); + + return parseFloat(width); + } else { + width = parseFloat(el.offsetWidth); + + return width; + } + }, + + offset: function(elem) { + var rect, win; + elem = KTUtil.get(elem); + + if ( !elem ) { + return; + } + + // Return zeros for disconnected and hidden (display: none) elements (gh-2310) + // Support: IE <=11 only + // Running getBoundingClientRect on a + // disconnected node in IE throws an error + + if ( !elem.getClientRects().length ) { + return { top: 0, left: 0 }; + } + + // Get document-relative position by adding viewport scroll to viewport-relative gBCR + rect = elem.getBoundingClientRect(); + win = elem.ownerDocument.defaultView; + + return { + top: rect.top + win.pageYOffset, + left: rect.left + win.pageXOffset + }; + }, + + height: function(el) { + return KTUtil.css(el, 'height'); + }, + + visible: function(el) { + return !(el.offsetWidth === 0 && el.offsetHeight === 0); + }, + + attr: function(el, name, value) { + el = KTUtil.get(el); + + if (el == undefined) { + return; + } + + if (value !== undefined) { + el.setAttribute(name, value); + } else { + return el.getAttribute(name); + } + }, + + hasAttr: function(el, name) { + el = KTUtil.get(el); + + if (el == undefined) { + return; + } + + return el.getAttribute(name) ? true : false; + }, + + removeAttr: function(el, name) { + el = KTUtil.get(el); + + if (el == undefined) { + return; + } + + el.removeAttribute(name); + }, + + animate: function(from, to, duration, update, easing, done) { + /** + * TinyAnimate.easings + * Adapted from jQuery Easing + */ + var easings = {}; + var easing; + + easings.linear = function(t, b, c, d) { + return c * t / d + b; + }; + + easing = easings.linear; + + // Early bail out if called incorrectly + if (typeof from !== 'number' || + typeof to !== 'number' || + typeof duration !== 'number' || + typeof update !== 'function') { + return; + } + + // Create mock done() function if necessary + if (typeof done !== 'function') { + done = function() {}; + } + + // Pick implementation (requestAnimationFrame | setTimeout) + var rAF = window.requestAnimationFrame || function(callback) { + window.setTimeout(callback, 1000 / 50); + }; + + // Animation loop + var canceled = false; + var change = to - from; + + function loop(timestamp) { + var time = (timestamp || +new Date()) - start; + + if (time >= 0) { + update(easing(time, from, change, duration)); + } + if (time >= 0 && time >= duration) { + update(to); + done(); + } else { + rAF(loop); + } + } + + update(from); + + // Start animation loop + var start = window.performance && window.performance.now ? window.performance.now() : +new Date(); + + rAF(loop); + }, + + actualCss: function(el, prop, cache) { + el = KTUtil.get(el); + var css = ''; + + if (el instanceof HTMLElement === false) { + return; + } + + if (!el.getAttribute('kt-hidden-' + prop) || cache === false) { + var value; + + // the element is hidden so: + // making the el block so we can meassure its height but still be hidden + css = el.style.cssText; + el.style.cssText = 'position: absolute; visibility: hidden; display: block;'; + + if (prop == 'width') { + value = el.offsetWidth; + } else if (prop == 'height') { + value = el.offsetHeight; + } + + el.style.cssText = css; + + // store it in cache + el.setAttribute('kt-hidden-' + prop, value); + + return parseFloat(value); + } else { + // store it in cache + return parseFloat(el.getAttribute('kt-hidden-' + prop)); + } + }, + + actualHeight: function(el, cache) { + return KTUtil.actualCss(el, 'height', cache); + }, + + actualWidth: function(el, cache) { + return KTUtil.actualCss(el, 'width', cache); + }, + + getScroll: function(element, method) { + // The passed in `method` value should be 'Top' or 'Left' + method = 'scroll' + method; + return (element == window || element == document) ? ( + self[(method == 'scrollTop') ? 'pageYOffset' : 'pageXOffset'] || + (browserSupportsBoxModel && document.documentElement[method]) || + document.body[method] + ) : element[method]; + }, + + css: function(el, styleProp, value) { + el = KTUtil.get(el); + + if (!el) { + return; + } + + if (value !== undefined) { + el.style[styleProp] = value; + } else { + var defaultView = (el.ownerDocument || document).defaultView; + // W3C standard way: + if (defaultView && defaultView.getComputedStyle) { + // sanitize property name to css notation + // (hyphen separated words eg. font-Size) + styleProp = styleProp.replace(/([A-Z])/g, "-$1").toLowerCase(); + return defaultView.getComputedStyle(el, null).getPropertyValue(styleProp); + } else if (el.currentStyle) { // IE + // sanitize property name to camelCase + styleProp = styleProp.replace(/\-(\w)/g, function(str, letter) { + return letter.toUpperCase(); + }); + value = el.currentStyle[styleProp]; + // convert other units to pixels on IE + if (/^\d+(em|pt|%|ex)?$/i.test(value)) { + return (function(value) { + var oldLeft = el.style.left, + oldRsLeft = el.runtimeStyle.left; + el.runtimeStyle.left = el.currentStyle.left; + el.style.left = value || 0; + value = el.style.pixelLeft + "px"; + el.style.left = oldLeft; + el.runtimeStyle.left = oldRsLeft; + return value; + })(value); + } + return value; + } + } + }, + + slide: function(el, dir, speed, callback, recalcMaxHeight) { + if (!el || (dir == 'up' && KTUtil.visible(el) === false) || (dir == 'down' && KTUtil.visible(el) === true)) { + return; + } + + speed = (speed ? speed : 600); + var calcHeight = KTUtil.actualHeight(el); + var calcPaddingTop = false; + var calcPaddingBottom = false; + + if (KTUtil.css(el, 'padding-top') && KTUtil.data(el).has('slide-padding-top') !== true) { + KTUtil.data(el).set('slide-padding-top', KTUtil.css(el, 'padding-top')); + } + + if (KTUtil.css(el, 'padding-bottom') && KTUtil.data(el).has('slide-padding-bottom') !== true) { + KTUtil.data(el).set('slide-padding-bottom', KTUtil.css(el, 'padding-bottom')); + } + + if (KTUtil.data(el).has('slide-padding-top')) { + calcPaddingTop = parseInt(KTUtil.data(el).get('slide-padding-top')); + } + + if (KTUtil.data(el).has('slide-padding-bottom')) { + calcPaddingBottom = parseInt(KTUtil.data(el).get('slide-padding-bottom')); + } + + if (dir == 'up') { // up + el.style.cssText = 'display: block; overflow: hidden;'; + + if (calcPaddingTop) { + KTUtil.animate(0, calcPaddingTop, speed, function(value) { + el.style.paddingTop = (calcPaddingTop - value) + 'px'; + }, 'linear'); + } + + if (calcPaddingBottom) { + KTUtil.animate(0, calcPaddingBottom, speed, function(value) { + el.style.paddingBottom = (calcPaddingBottom - value) + 'px'; + }, 'linear'); + } + + KTUtil.animate(0, calcHeight, speed, function(value) { + el.style.height = (calcHeight - value) + 'px'; + }, 'linear', function() { + callback(); + el.style.height = ''; + el.style.display = 'none'; + }); + + + } else if (dir == 'down') { // down + el.style.cssText = 'display: block; overflow: hidden;'; + + if (calcPaddingTop) { + KTUtil.animate(0, calcPaddingTop, speed, function(value) { + el.style.paddingTop = value + 'px'; + }, 'linear', function() { + el.style.paddingTop = ''; + }); + } + + if (calcPaddingBottom) { + KTUtil.animate(0, calcPaddingBottom, speed, function(value) { + el.style.paddingBottom = value + 'px'; + }, 'linear', function() { + el.style.paddingBottom = ''; + }); + } + + KTUtil.animate(0, calcHeight, speed, function(value) { + el.style.height = value + 'px'; + }, 'linear', function() { + callback(); + el.style.height = ''; + el.style.display = ''; + el.style.overflow = ''; + }); + } + }, + + slideUp: function(el, speed, callback) { + KTUtil.slide(el, 'up', speed, callback); + }, + + slideDown: function(el, speed, callback) { + KTUtil.slide(el, 'down', speed, callback); + }, + + show: function(el, display) { + if (typeof el !== 'undefined') { + el.style.display = (display ? display : 'block'); + } + }, + + hide: function(el) { + if (typeof el !== 'undefined') { + el.style.display = 'none'; + } + }, + + addEvent: function(el, type, handler, one) { + el = KTUtil.get(el); + + if (typeof el !== 'undefined' && el !== null) { + el.addEventListener(type, handler); + } + }, + + removeEvent: function(el, type, handler) { + el = KTUtil.get(el); + + if (el !== null) { + el.removeEventListener(type, handler); + } + }, + + on: function(element, selector, event, handler) { + if (!selector) { + return; + } + + var eventId = KTUtil.getUniqueID('event'); + + window.KTUtilDelegatedEventHandlers[eventId] = function(e) { + var targets = element.querySelectorAll(selector); + var target = e.target; + + while (target && target !== element) { + for (var i = 0, j = targets.length; i < j; i++) { + if (target === targets[i]) { + handler.call(target, e); + } + } + + target = target.parentNode; + } + } + + KTUtil.addEvent(element, event, window.KTUtilDelegatedEventHandlers[eventId]); + + return eventId; + }, + + off: function(element, event, eventId) { + if (!element || !window.KTUtilDelegatedEventHandlers[eventId]) { + return; + } + + KTUtil.removeEvent(element, event, window.KTUtilDelegatedEventHandlers[eventId]); + + delete window.KTUtilDelegatedEventHandlers[eventId]; + }, + + one: function onetime(el, type, callback) { + el = KTUtil.get(el); + + el.addEventListener(type, function callee(e) { + // remove event + if (e.target && e.target.removeEventListener) { + e.target.removeEventListener(e.type, callee); + } + + // call handler + return callback(e); + }); + }, + + hash: function(str) { + var hash = 0, + i, chr; + + if (str.length === 0) return hash; + for (i = 0; i < str.length; i++) { + chr = str.charCodeAt(i); + hash = ((hash << 5) - hash) + chr; + hash |= 0; // Convert to 32bit integer + } + + return hash; + }, + + animateClass: function(el, animationName, callback) { + var animation; + var animations = { + animation: 'animationend', + OAnimation: 'oAnimationEnd', + MozAnimation: 'mozAnimationEnd', + WebkitAnimation: 'webkitAnimationEnd', + msAnimation: 'msAnimationEnd', + }; + + for (var t in animations) { + if (el.style[t] !== undefined) { + animation = animations[t]; + } + } + + KTUtil.addClass(el, 'animated ' + animationName); + + KTUtil.one(el, animation, function() { + KTUtil.removeClass(el, 'animated ' + animationName); + }); + + if (callback) { + KTUtil.one(el, animation, callback); + } + }, + + transitionEnd: function(el, callback) { + var transition; + var transitions = { + transition: 'transitionend', + OTransition: 'oTransitionEnd', + MozTransition: 'mozTransitionEnd', + WebkitTransition: 'webkitTransitionEnd', + msTransition: 'msTransitionEnd' + }; + + for (var t in transitions) { + if (el.style[t] !== undefined) { + transition = transitions[t]; + } + } + + KTUtil.one(el, transition, callback); + }, + + animationEnd: function(el, callback) { + var animation; + var animations = { + animation: 'animationend', + OAnimation: 'oAnimationEnd', + MozAnimation: 'mozAnimationEnd', + WebkitAnimation: 'webkitAnimationEnd', + msAnimation: 'msAnimationEnd' + }; + + for (var t in animations) { + if (el.style[t] !== undefined) { + animation = animations[t]; + } + } + + KTUtil.one(el, animation, callback); + }, + + animateDelay: function(el, value) { + var vendors = ['webkit-', 'moz-', 'ms-', 'o-', '']; + for (var i = 0; i < vendors.length; i++) { + KTUtil.css(el, vendors[i] + 'animation-delay', value); + } + }, + + animateDuration: function(el, value) { + var vendors = ['webkit-', 'moz-', 'ms-', 'o-', '']; + for (var i = 0; i < vendors.length; i++) { + KTUtil.css(el, vendors[i] + 'animation-duration', value); + } + }, + + scrollTo: function(target, offset, duration) { + var duration = duration ? duration : 500; + var target = KTUtil.get(target); + var targetPos = target ? KTUtil.offset(target).top : 0; + var scrollPos = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; + var from, to; + + if (targetPos > scrollPos) { + from = targetPos; + to = scrollPos; + } else { + from = scrollPos; + to = targetPos; + } + + if (offset) { + to += offset; + } + + KTUtil.animate(from, to, duration, function(value) { + document.documentElement.scrollTop = value; + document.body.parentNode.scrollTop = value; + document.body.scrollTop = value; + }); //, easing, done + }, + + scrollTop: function(offset, duration) { + KTUtil.scrollTo(null, offset, duration); + }, + + isArray: function(obj) { + return obj && Array.isArray(obj); + }, + + ready: function(callback) { + if (document.attachEvent ? document.readyState === "complete" : document.readyState !== "loading") { + callback(); + } else { + document.addEventListener('DOMContentLoaded', callback); + } + }, + + isEmpty: function(obj) { + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) { + return false; + } + } + + return true; + }, + + numberString: function(nStr) { + nStr += ''; + var x = nStr.split('.'); + var x1 = x[0]; + var x2 = x.length > 1 ? '.' + x[1] : ''; + var rgx = /(\d+)(\d{3})/; + while (rgx.test(x1)) { + x1 = x1.replace(rgx, '$1' + ',' + '$2'); + } + return x1 + x2; + }, + + detectIE: function() { + var ua = window.navigator.userAgent; + + // Test values; Uncomment to check result … + + // IE 10 + // ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)'; + + // IE 11 + // ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko'; + + // Edge 12 (Spartan) + // ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0'; + + // Edge 13 + // ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586'; + + var msie = ua.indexOf('MSIE '); + if (msie > 0) { + // IE 10 or older => return version number + return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10); + } + + var trident = ua.indexOf('Trident/'); + if (trident > 0) { + // IE 11 => return version number + var rv = ua.indexOf('rv:'); + return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10); + } + + var edge = ua.indexOf('Edge/'); + if (edge > 0) { + // Edge (IE 12+) => return version number + return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10); + } + + // other browser + return false; + }, + + isRTL: function() { + return (KTUtil.attr(KTUtil.get('html'), 'direction') == 'rtl'); + }, + + // + + // Scroller + scrollInit: function(element, options) { + if(!element) return; + // Define init function + function init() { + var ps; + var height; + + if (options.height instanceof Function) { + height = parseInt(options.height.call()); + } else { + height = parseInt(options.height); + } + + // Destroy scroll on table and mobile modes + if ((options.mobileNativeScroll || options.disableForMobile) && KTUtil.isInResponsiveRange('tablet-and-mobile')) { + ps = KTUtil.data(element).get('ps'); + if (ps) { + if (options.resetHeightOnDestroy) { + KTUtil.css(element, 'height', 'auto'); + } else { + KTUtil.css(element, 'overflow', 'auto'); + if (height > 0) { + KTUtil.css(element, 'height', height + 'px'); + } + } + + ps.destroy(); + ps = KTUtil.data(element).remove('ps'); + } else if (height > 0){ + KTUtil.css(element, 'overflow', 'auto'); + KTUtil.css(element, 'height', height + 'px'); + } + + return; + } + + if (height > 0) { + KTUtil.css(element, 'height', height + 'px'); + } + + if (options.desktopNativeScroll) { + KTUtil.css(element, 'overflow', 'auto'); + return; + } + + // Init scroll + KTUtil.css(element, 'overflow', 'hidden'); + + ps = KTUtil.data(element).get('ps'); + if (ps) { + ps.update(); + } else { + KTUtil.addClass(element, 'kt-scroll'); + ps = new PerfectScrollbar(element, { + wheelSpeed: 0.5, + swipeEasing: true, + wheelPropagation: (options.windowScroll === false ? false : true), + minScrollbarLength: 40, + maxScrollbarLength: 300, + suppressScrollX: KTUtil.attr(element, 'data-scroll-x') != 'true' ? true : false + }); + + KTUtil.data(element).set('ps', ps); + } + + // Remember scroll position in cookie + var uid = KTUtil.attr(element, 'id'); + + if (options.rememberPosition === true && Cookies && uid) { + if (Cookies.get(uid)) { + var pos = parseInt(Cookies.get(uid)); + + if (pos > 0) { + element.scrollTop = pos; + } + } + + element.addEventListener('ps-scroll-y', function() { + Cookies.set(uid, element.scrollTop); + }); + } + } + + // Init + init(); + + // Handle window resize + if (options.handleWindowResize) { + KTUtil.addResizeHandler(function() { + init(); + }); + } + }, + + scrollUpdate: function(element) { + var ps = KTUtil.data(element).get('ps'); + if (ps) { + ps.update(); + } + }, + + scrollUpdateAll: function(parent) { + var scrollers = KTUtil.findAll(parent, '.ps'); + for (var i = 0, len = scrollers.length; i < len; i++) { + KTUtil.scrollUpdate(scrollers[i]); + } + }, + + scrollDestroy: function(element) { + var ps = KTUtil.data(element).get('ps'); + if (ps) { + ps.destroy(); + ps = KTUtil.data(element).remove('ps'); + } + }, + + setHTML: function(el, html) { + if (KTUtil.get(el)) { + KTUtil.get(el).innerHTML = html; + } + }, + + getHTML: function(el) { + if (KTUtil.get(el)) { + return KTUtil.get(el).innerHTML; + } + }, + + getDocumentHeight: function() { + var body = document.body; + var html = document.documentElement; + + return Math.max( body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight ); + }, + + getScrollTop: function() { + return (document.scrollingElement || document.documentElement).scrollTop; + } + } +}(); + +// webpack support +if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { + module.exports = KTUtil; +} + +// Initialize KTUtil class on document ready +KTUtil.ready(function() { + KTUtil.init(); +}); + +// CSS3 Transitions only after page load(.kt-page-loading class added to body tag and remove with JS on page load) +window.onload = function() { + KTUtil.removeClass(KTUtil.get('body'), 'kt-page--loading'); +} diff --git a/src/assets/js/global/components/base/wizard.js b/src/assets/js/global/components/base/wizard.js new file mode 100644 index 0000000..d6581b5 --- /dev/null +++ b/src/assets/js/global/components/base/wizard.js @@ -0,0 +1,437 @@ +// plugin setup +var KTWizard = function(elementId, options) { + // Main object + var the = this; + var init = false; + + // Get element object + var element = KTUtil.get(elementId); + var body = KTUtil.get('body'); + + if (!element) { + return; + } + + // Default options + var defaultOptions = { + startStep: 1, + clickableSteps: true + }; + + //////////////////////////// + // ** Private Methods ** // + //////////////////////////// + + var Plugin = { + /** + * Construct + */ + + construct: function(options) { + if (KTUtil.data(element).has('wizard')) { + the = KTUtil.data(element).get('wizard'); + } else { + // reset menu + Plugin.init(options); + + // build menu + Plugin.build(); + + KTUtil.data(element).set('wizard', the); + } + + return the; + }, + + /** + * Init wizard + */ + init: function(options) { + the.element = element; + the.events = []; + + // merge default and user defined options + the.options = KTUtil.deepExtend({}, defaultOptions, options); + + // Elements + the.steps = KTUtil.findAll(element, '[data-ktwizard-type="step"]'); + + the.btnSubmit = KTUtil.find(element, '[data-ktwizard-type="action-submit"]'); + the.btnNext = KTUtil.find(element, '[data-ktwizard-type="action-next"]'); + the.btnPrev = KTUtil.find(element, '[data-ktwizard-type="action-prev"]'); + the.btnLast = KTUtil.find(element, '[data-ktwizard-type="action-last"]'); + the.btnFirst = KTUtil.find(element, '[data-ktwizard-type="action-first"]'); + + // Variables + the.events = []; + the.currentStep = 1; + the.stopped = false; + the.totalSteps = the.steps.length; + + // Init current step + if (the.options.startStep > 1) { + Plugin.goTo(the.options.startStep); + } + + // Init UI + Plugin.updateUI(); + }, + + /** + * Build Form Wizard + */ + build: function() { + // Next button event handler + KTUtil.addEvent(the.btnNext, 'click', function(e) { + e.preventDefault(); + Plugin.goTo(Plugin.getNextStep(), true); + }); + + // Prev button event handler + KTUtil.addEvent(the.btnPrev, 'click', function(e) { + e.preventDefault(); + Plugin.goTo(Plugin.getPrevStep(), true); + }); + + // First button event handler + KTUtil.addEvent(the.btnFirst, 'click', function(e) { + e.preventDefault(); + Plugin.goTo(1, true); + }); + + // Last button event handler + KTUtil.addEvent(the.btnLast, 'click', function(e) { + e.preventDefault(); + Plugin.goTo(the.totalSteps, true); + }); + + if (the.options.clickableSteps === true) { + KTUtil.on(element, '[data-ktwizard-type="step"]', 'click', function() { + var index = Array.prototype.indexOf.call(the.steps, this) + 1; + if (index !== the.currentStep) { + Plugin.goTo(index, true); + } + }); + } + }, + + /** + * Handles wizard click wizard + */ + goTo: function(number, eventHandle) { + // Skip if this step is already shown + if (number === the.currentStep || number > the.totalSteps || number < 0) { + return; + } + + // Validate step number + if (number) { + number = parseInt(number); + } else { + number = Plugin.getNextStep(); + } + + // Before next and prev events + var callback; + + if (eventHandle === true) { + if (number > the.currentStep) { + callback = Plugin.eventTrigger('beforeNext'); + } else { + callback = Plugin.eventTrigger('beforePrev'); + } + } + + // Skip if stopped + if (the.stopped === true) { + the.stopped = false; + return; + } + + // Continue if no exit + if (callback !== false) { + // Before change + if (eventHandle === true) { + Plugin.eventTrigger('beforeChange'); + } + + // Set current step + the.currentStep = number; + + Plugin.updateUI(); + + // Trigger change event + if (eventHandle === true) { + Plugin.eventTrigger('change'); + } + } + + // After next and prev events + if (eventHandle === true) { + if (number > the.startStep) { + Plugin.eventTrigger('afterNext'); + } else { + Plugin.eventTrigger('afterPrev'); + } + } else { + // this function called by method, stop for the next call + the.stopped = true; + } + + return the; + }, + + /** + * Cancel + */ + stop: function() { + the.stopped = true; + }, + + /** + * Resume + */ + start: function() { + the.stopped = false; + }, + + /** + * Check last step + */ + isLastStep: function() { + return the.currentStep === the.totalSteps; + }, + + /** + * Check first step + */ + isFirstStep: function() { + return the.currentStep === 1; + }, + + /** + * Check between step + */ + isBetweenStep: function() { + return Plugin.isLastStep() === false && Plugin.isFirstStep() === false; + }, + + /** + * Go to the first step + */ + updateUI: function() { + var stepType = ''; + var index = the.currentStep - 1; + + if (Plugin.isLastStep()) { + stepType = 'last'; + } else if (Plugin.isFirstStep()) { + stepType = 'first'; + } else { + stepType = 'between'; + } + + KTUtil.attr(the.element, 'data-ktwizard-state', stepType); + + // Steps + var steps = KTUtil.findAll(the.element, '[data-ktwizard-type="step"]'); + + if (steps && steps.length > 0) { + for (var i = 0, len = steps.length; i < len; i++) { + if (i == index) { + KTUtil.attr(steps[i], 'data-ktwizard-state', 'current'); + } else { + if (i < index) { + KTUtil.attr(steps[i], 'data-ktwizard-state', 'done'); + } else { + KTUtil.attr(steps[i], 'data-ktwizard-state', 'pending'); + } + } + } + } + + // Steps Info + var stepsInfo = KTUtil.findAll(the.element, '[data-ktwizard-type="step-info"]'); + if (stepsInfo &&stepsInfo.length > 0) { + for (var i = 0, len = stepsInfo.length; i < len; i++) { + if (i == index) { + KTUtil.attr(stepsInfo[i], 'data-ktwizard-state', 'current'); + } else { + KTUtil.removeAttr(stepsInfo[i], 'data-ktwizard-state'); + } + } + } + + // Steps Content + var stepsContent = KTUtil.findAll(the.element, '[data-ktwizard-type="step-content"]'); + if (stepsContent&& stepsContent.length > 0) { + for (var i = 0, len = stepsContent.length; i < len; i++) { + if (i == index) { + KTUtil.attr(stepsContent[i], 'data-ktwizard-state', 'current'); + } else { + KTUtil.removeAttr(stepsContent[i], 'data-ktwizard-state'); + } + } + } + }, + + /** + * Get next step + */ + getNextStep: function() { + if (the.totalSteps >= (the.currentStep + 1)) { + return the.currentStep + 1; + } else { + return the.totalSteps; + } + }, + + /** + * Get prev step + */ + getPrevStep: function() { + if ((the.currentStep - 1) >= 1) { + return the.currentStep - 1; + } else { + return 1; + } + }, + + /** + * Trigger events + */ + eventTrigger: function(name, nested) { + //KTUtil.triggerCustomEvent(name); + for (var i = 0; i < the.events.length; i++) { + var event = the.events[i]; + if (event.name == name) { + if (event.one == true) { + if (event.fired == false) { + the.events[i].fired = true; + return event.handler.call(this, the); + } + } else { + return event.handler.call(this, the); + } + } + } + }, + + addEvent: function(name, handler, one) { + the.events.push({ + name: name, + handler: handler, + one: one, + fired: false + }); + + return the; + } + }; + + ////////////////////////// + // ** Public Methods ** // + ////////////////////////// + + /** + * Set default options + */ + + the.setDefaults = function(options) { + defaultOptions = options; + }; + + /** + * Go to the next step + */ + the.goNext = function(eventHandle) { + return Plugin.goTo(Plugin.getNextStep(), eventHandle); + }; + + /** + * Go to the prev step + */ + the.goPrev = function(eventHandle) { + return Plugin.goTo(Plugin.getPrevStep(),eventHandle); + }; + + /** + * Go to the last step + */ + the.goLast = function(eventHandle) { + return Plugin.goTo(the.totalSteps, eventHandle); + }; + + /** + * Go to the first step + */ + the.goFirst = function(eventHandle) { + return Plugin.goTo(1, eventHandle); + }; + + /** + * Go to a step + */ + the.goTo = function(number, eventHandle) { + return Plugin.goTo(number, eventHandle); + }; + + /** + * Cancel step + */ + the.stop = function() { + return Plugin.stop(); + }; + + /** + * Resume step + */ + the.start = function() { + return Plugin.start(); + }; + + /** + * Get current step number + */ + the.getStep = function() { + return the.currentStep; + }; + + /** + * Check last step + */ + the.isLastStep = function() { + return Plugin.isLastStep(); + }; + + /** + * Check first step + */ + the.isFirstStep = function() { + return Plugin.isFirstStep(); + }; + + /** + * Attach event + */ + the.on = function(name, handler) { + return Plugin.addEvent(name, handler); + }; + + /** + * Attach event that will be fired once + */ + the.one = function(name, handler) { + return Plugin.addEvent(name, handler, true); + }; + + // Construct plugin + Plugin.construct.apply(the, [options]); + + return the; +}; + +// webpack support +if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { + module.exports = KTWizard; +} diff --git a/src/assets/js/global/integration/plugins/bootstrap-datepicker.init.js b/src/assets/js/global/integration/plugins/bootstrap-datepicker.init.js new file mode 100644 index 0000000..a5ef338 --- /dev/null +++ b/src/assets/js/global/integration/plugins/bootstrap-datepicker.init.js @@ -0,0 +1,2 @@ +"use strict"; +$.fn.datepicker.defaults.zIndexOffset = 10; \ No newline at end of file diff --git a/src/assets/js/global/integration/plugins/bootstrap-markdown.init.js b/src/assets/js/global/integration/plugins/bootstrap-markdown.init.js new file mode 100644 index 0000000..53bcf41 --- /dev/null +++ b/src/assets/js/global/integration/plugins/bootstrap-markdown.init.js @@ -0,0 +1,5 @@ +"use strict"; +$.fn.markdown.defaults.iconlibrary = 'fa'; +$.fn.markdown.defaults.buttons[0][0]['data'][2]['icon']['fa'] = 'fa fa-heading'; +$.fn.markdown.defaults.buttons[0][1]['data'][1]['icon']['fa'] = 'fa fa-image'; +$.fn.markdown.defaults.buttons[0][2]['data'][1]['icon']['fa'] = 'fa fa-list-ol'; diff --git a/src/assets/js/global/integration/plugins/bootstrap-notify.init.js b/src/assets/js/global/integration/plugins/bootstrap-notify.init.js new file mode 100644 index 0000000..5a93c60 --- /dev/null +++ b/src/assets/js/global/integration/plugins/bootstrap-notify.init.js @@ -0,0 +1,15 @@ +//== Set defaults + +$.notifyDefaults({ + template: '' + + '' +}); \ No newline at end of file diff --git a/src/assets/js/global/integration/plugins/bootstrap-switch.init.js b/src/assets/js/global/integration/plugins/bootstrap-switch.init.js new file mode 100644 index 0000000..88a1e55 --- /dev/null +++ b/src/assets/js/global/integration/plugins/bootstrap-switch.init.js @@ -0,0 +1,2 @@ +//$.fn.bootstrapSwitch.defaults.size = 'large'; +//$.fn.bootstrapSwitch.defaults.onColor = 'success'; \ No newline at end of file diff --git a/src/assets/js/global/integration/plugins/bootstrap-timepicker.init.js b/src/assets/js/global/integration/plugins/bootstrap-timepicker.init.js new file mode 100644 index 0000000..b130b50 --- /dev/null +++ b/src/assets/js/global/integration/plugins/bootstrap-timepicker.init.js @@ -0,0 +1,7 @@ +"use strict"; +$.fn.timepicker.defaults = $.extend(true, {}, $.fn.timepicker.defaults, { + icons: { + up: 'la la-angle-up', + down: 'la la-angle-down' + } +}); \ No newline at end of file diff --git a/src/assets/js/global/integration/plugins/datatables.init.js b/src/assets/js/global/integration/plugins/datatables.init.js new file mode 100644 index 0000000..cc9f0cf --- /dev/null +++ b/src/assets/js/global/integration/plugins/datatables.init.js @@ -0,0 +1,29 @@ +"use strict"; +var defaults = { + "language": { + "paginate": { + "first": '', + "last": '', + "next": '', + "previous": '' + } + } +}; + +if (KTUtil.isRTL()) { + defaults = { + "language": { + "paginate": { + "first": '', + "last": '', + "next": '', + "previous": '' + } + } + } +} + +$.extend(true, $.fn.dataTable.defaults, defaults); + +// fix dropdown overflow inside datatable +KTApp.initAbsoluteDropdown('.dataTables_wrapper'); \ No newline at end of file diff --git a/src/assets/js/global/integration/plugins/dropzone.init.js b/src/assets/js/global/integration/plugins/dropzone.init.js new file mode 100644 index 0000000..8bc88b2 --- /dev/null +++ b/src/assets/js/global/integration/plugins/dropzone.init.js @@ -0,0 +1 @@ +Dropzone.autoDiscover = false; diff --git a/src/assets/js/global/integration/plugins/jquery-validation.init.js b/src/assets/js/global/integration/plugins/jquery-validation.init.js new file mode 100644 index 0000000..05a18df --- /dev/null +++ b/src/assets/js/global/integration/plugins/jquery-validation.init.js @@ -0,0 +1,76 @@ +"use strict"; +var valGetParentContainer = function(element) { + var element = $(element); + + if ($(element).closest('.form-group-sub').length > 0) { + return $(element).closest('.form-group-sub') + } else if ($(element).closest('.bootstrap-select').length > 0) { + return $(element).closest('.bootstrap-select') + } else { + return $(element).closest('.form-group'); + } +} + +jQuery.validator.setDefaults({ + errorElement: 'div', //default input error message container + focusInvalid: false, // do not focus the last invalid input + ignore: "", // validate all fields including form hidden input + + errorPlacement: function(error, element) { // render error placement for each input type + var element = $(element); + + var group = valGetParentContainer(element); + var help = group.find('.form-text'); + + if (group.find('.valid-feedback, .invalid-feedback').length !== 0) { + return; + } + + element.addClass('is-invalid'); + error.addClass('invalid-feedback'); + + if (help.length > 0) { + help.before(error); + } else { + if (element.closest('.bootstrap-select').length > 0) { //Bootstrap select + element.closest('.bootstrap-select').wrap('
    ').after(error); + } else if (element.closest('.input-group').length > 0) { //Bootstrap group + element.after(error); + } else { //Checkbox & radios + if (element.is(':checkbox')) { + element.closest('.kt-checkbox').find('> span').after(error); + } else { + element.after(error); + } + } + } + }, + + highlight: function(element) { // hightlight error inputs + var group = valGetParentContainer(element); + group.addClass('validate'); + group.addClass('is-invalid'); + $(element).removeClass('is-valid'); + }, + + unhighlight: function(element) { // revert the change done by hightlight + var group = valGetParentContainer(element); + group.removeClass('validate'); + group.removeClass('is-invalid'); + $(element).removeClass('is-invalid'); + }, + + success: function(label, element) { + var group = valGetParentContainer(element); + group.removeClass('validate'); + group.find('.invalid-feedback').remove(); + } +}); + +jQuery.validator.addMethod("email", function(value, element) { + if (/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(value)) { + return true; + } else { + return false; + } +}, "Please enter a valid Email."); \ No newline at end of file diff --git a/src/assets/js/global/integration/plugins/sweetalert2.init.js b/src/assets/js/global/integration/plugins/sweetalert2.init.js new file mode 100644 index 0000000..d2e95c5 --- /dev/null +++ b/src/assets/js/global/integration/plugins/sweetalert2.init.js @@ -0,0 +1,12 @@ +"use strict"; +// Set defaults +swal.mixin({ + width: 400, + heightAuto: false, + padding: '2.5rem', + buttonsStyling: false, + confirmButtonClass: 'btn btn-success', + confirmButtonColor: null, + cancelButtonClass: 'btn btn-secondary', + cancelButtonColor: null +}); \ No newline at end of file diff --git a/src/assets/media/bg/300.jpg b/src/assets/media/bg/300.jpg new file mode 100644 index 0000000..509b68d Binary files /dev/null and b/src/assets/media/bg/300.jpg differ diff --git a/src/assets/media/bg/350.jpg b/src/assets/media/bg/350.jpg new file mode 100644 index 0000000..2127988 Binary files /dev/null and b/src/assets/media/bg/350.jpg differ diff --git a/src/assets/media/bg/400.jpg b/src/assets/media/bg/400.jpg new file mode 100644 index 0000000..5337048 Binary files /dev/null and b/src/assets/media/bg/400.jpg differ diff --git a/src/assets/media/bg/450.jpg b/src/assets/media/bg/450.jpg new file mode 100644 index 0000000..3b8345f Binary files /dev/null and b/src/assets/media/bg/450.jpg differ diff --git a/src/assets/media/bg/bg-1.jpg b/src/assets/media/bg/bg-1.jpg new file mode 100644 index 0000000..f2f1de7 Binary files /dev/null and b/src/assets/media/bg/bg-1.jpg differ diff --git a/src/assets/media/bg/bg-2.jpg b/src/assets/media/bg/bg-2.jpg new file mode 100644 index 0000000..5ea2e99 Binary files /dev/null and b/src/assets/media/bg/bg-2.jpg differ diff --git a/src/assets/media/bg/bg-3.jpg b/src/assets/media/bg/bg-3.jpg new file mode 100644 index 0000000..eb92779 Binary files /dev/null and b/src/assets/media/bg/bg-3.jpg differ diff --git a/src/assets/media/bg/bg-4.jpg b/src/assets/media/bg/bg-4.jpg new file mode 100644 index 0000000..81ea6ef Binary files /dev/null and b/src/assets/media/bg/bg-4.jpg differ diff --git a/src/assets/media/bg/bg-5.jpg b/src/assets/media/bg/bg-5.jpg new file mode 100644 index 0000000..f1b6413 Binary files /dev/null and b/src/assets/media/bg/bg-5.jpg differ diff --git a/src/assets/media/bg/bg-6.jpg b/src/assets/media/bg/bg-6.jpg new file mode 100644 index 0000000..16f2c75 Binary files /dev/null and b/src/assets/media/bg/bg-6.jpg differ diff --git a/src/assets/media/bg/bg-6.png b/src/assets/media/bg/bg-6.png new file mode 100644 index 0000000..16f2c75 Binary files /dev/null and b/src/assets/media/bg/bg-6.png differ diff --git a/src/assets/media/bg/bg-7.jpg b/src/assets/media/bg/bg-7.jpg new file mode 100644 index 0000000..23649ab Binary files /dev/null and b/src/assets/media/bg/bg-7.jpg differ diff --git a/src/assets/media/bg/bg-8.jpg b/src/assets/media/bg/bg-8.jpg new file mode 100644 index 0000000..c9a9b7f Binary files /dev/null and b/src/assets/media/bg/bg-8.jpg differ diff --git a/src/assets/media/bg/bg-9.jpg b/src/assets/media/bg/bg-9.jpg new file mode 100644 index 0000000..73935de Binary files /dev/null and b/src/assets/media/bg/bg-9.jpg differ diff --git a/src/assets/media/bg/demo4-bg-footer.jpg b/src/assets/media/bg/demo4-bg-footer.jpg new file mode 100644 index 0000000..025efe0 Binary files /dev/null and b/src/assets/media/bg/demo4-bg-footer.jpg differ diff --git a/src/assets/media/bg/home-2-bg.svg b/src/assets/media/bg/home-2-bg.svg new file mode 100644 index 0000000..e2949c4 --- /dev/null +++ b/src/assets/media/bg/home-2-bg.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/src/assets/media/bg/sc-home1-bg.png b/src/assets/media/bg/sc-home1-bg.png new file mode 100644 index 0000000..5b336f6 Binary files /dev/null and b/src/assets/media/bg/sc-home1-bg.png differ diff --git a/src/assets/media/blog/blog1.jpg b/src/assets/media/blog/blog1.jpg new file mode 100644 index 0000000..7140678 Binary files /dev/null and b/src/assets/media/blog/blog1.jpg differ diff --git a/src/assets/media/blog/blog2.jpg b/src/assets/media/blog/blog2.jpg new file mode 100644 index 0000000..e4070ab Binary files /dev/null and b/src/assets/media/blog/blog2.jpg differ diff --git a/src/assets/media/blog/blog3.jpg b/src/assets/media/blog/blog3.jpg new file mode 100644 index 0000000..36438f6 Binary files /dev/null and b/src/assets/media/blog/blog3.jpg differ diff --git a/src/assets/media/blog/blog4.jpg b/src/assets/media/blog/blog4.jpg new file mode 100644 index 0000000..452c60a Binary files /dev/null and b/src/assets/media/blog/blog4.jpg differ diff --git a/src/assets/media/blog/blog5.jpg b/src/assets/media/blog/blog5.jpg new file mode 100644 index 0000000..10a931a Binary files /dev/null and b/src/assets/media/blog/blog5.jpg differ diff --git a/src/assets/media/client-logos/logo1.png b/src/assets/media/client-logos/logo1.png new file mode 100644 index 0000000..dc3d978 Binary files /dev/null and b/src/assets/media/client-logos/logo1.png differ diff --git a/src/assets/media/client-logos/logo2.png b/src/assets/media/client-logos/logo2.png new file mode 100644 index 0000000..e9e26e8 Binary files /dev/null and b/src/assets/media/client-logos/logo2.png differ diff --git a/src/assets/media/client-logos/logo3.png b/src/assets/media/client-logos/logo3.png new file mode 100644 index 0000000..0a3a25f Binary files /dev/null and b/src/assets/media/client-logos/logo3.png differ diff --git a/src/assets/media/client-logos/logo4.png b/src/assets/media/client-logos/logo4.png new file mode 100644 index 0000000..40683a9 Binary files /dev/null and b/src/assets/media/client-logos/logo4.png differ diff --git a/src/assets/media/client-logos/logo5.png b/src/assets/media/client-logos/logo5.png new file mode 100644 index 0000000..8c6cb30 Binary files /dev/null and b/src/assets/media/client-logos/logo5.png differ diff --git a/src/assets/media/company-logos/logo-1.png b/src/assets/media/company-logos/logo-1.png new file mode 100644 index 0000000..922df23 Binary files /dev/null and b/src/assets/media/company-logos/logo-1.png differ diff --git a/src/assets/media/company-logos/logo-2.png b/src/assets/media/company-logos/logo-2.png new file mode 100644 index 0000000..7652688 Binary files /dev/null and b/src/assets/media/company-logos/logo-2.png differ diff --git a/src/assets/media/company-logos/logo-3.png b/src/assets/media/company-logos/logo-3.png new file mode 100644 index 0000000..c8971b9 Binary files /dev/null and b/src/assets/media/company-logos/logo-3.png differ diff --git a/src/assets/media/company-logos/logo-4.png b/src/assets/media/company-logos/logo-4.png new file mode 100644 index 0000000..1a225fd Binary files /dev/null and b/src/assets/media/company-logos/logo-4.png differ diff --git a/src/assets/media/company-logos/logo_client_color.png b/src/assets/media/company-logos/logo_client_color.png new file mode 100644 index 0000000..fe5f9e7 Binary files /dev/null and b/src/assets/media/company-logos/logo_client_color.png differ diff --git a/src/assets/media/company-logos/logo_client_white.png b/src/assets/media/company-logos/logo_client_white.png new file mode 100644 index 0000000..2063f92 Binary files /dev/null and b/src/assets/media/company-logos/logo_client_white.png differ diff --git a/src/assets/media/company-logos/logo_invoice_dark.png b/src/assets/media/company-logos/logo_invoice_dark.png new file mode 100644 index 0000000..2c7e6bd Binary files /dev/null and b/src/assets/media/company-logos/logo_invoice_dark.png differ diff --git a/src/assets/media/company-logos/logo_invoice_white.png b/src/assets/media/company-logos/logo_invoice_white.png new file mode 100644 index 0000000..7818b30 Binary files /dev/null and b/src/assets/media/company-logos/logo_invoice_white.png differ diff --git a/src/assets/media/demos/demo11/bg-1.jpg b/src/assets/media/demos/demo11/bg-1.jpg new file mode 100644 index 0000000..23649ab Binary files /dev/null and b/src/assets/media/demos/demo11/bg-1.jpg differ diff --git a/src/assets/media/demos/demo12/bg-1.jpg b/src/assets/media/demos/demo12/bg-1.jpg new file mode 100644 index 0000000..23649ab Binary files /dev/null and b/src/assets/media/demos/demo12/bg-1.jpg differ diff --git a/src/assets/media/demos/demo4/footer.jpg b/src/assets/media/demos/demo4/footer.jpg new file mode 100644 index 0000000..025efe0 Binary files /dev/null and b/src/assets/media/demos/demo4/footer.jpg differ diff --git a/src/assets/media/demos/demo4/header.jpg b/src/assets/media/demos/demo4/header.jpg new file mode 100644 index 0000000..2127988 Binary files /dev/null and b/src/assets/media/demos/demo4/header.jpg differ diff --git a/src/assets/media/demos/demo8/bg-1.jpg b/src/assets/media/demos/demo8/bg-1.jpg new file mode 100644 index 0000000..23649ab Binary files /dev/null and b/src/assets/media/demos/demo8/bg-1.jpg differ diff --git a/src/assets/media/demos/demo9/bg-300.jpg b/src/assets/media/demos/demo9/bg-300.jpg new file mode 100644 index 0000000..509b68d Binary files /dev/null and b/src/assets/media/demos/demo9/bg-300.jpg differ diff --git a/src/assets/media/demos/demo9/bg-350.jpg b/src/assets/media/demos/demo9/bg-350.jpg new file mode 100644 index 0000000..2127988 Binary files /dev/null and b/src/assets/media/demos/demo9/bg-350.jpg differ diff --git a/src/assets/media/demos/demo9/bg-400.jpg b/src/assets/media/demos/demo9/bg-400.jpg new file mode 100644 index 0000000..5337048 Binary files /dev/null and b/src/assets/media/demos/demo9/bg-400.jpg differ diff --git a/src/assets/media/demos/demo9/bg-450.jpg b/src/assets/media/demos/demo9/bg-450.jpg new file mode 100644 index 0000000..3b8345f Binary files /dev/null and b/src/assets/media/demos/demo9/bg-450.jpg differ diff --git a/src/assets/media/demos/preview/demo1.jpg b/src/assets/media/demos/preview/demo1.jpg new file mode 100644 index 0000000..f4a2f12 Binary files /dev/null and b/src/assets/media/demos/preview/demo1.jpg differ diff --git a/src/assets/media/demos/preview/demo10.jpg b/src/assets/media/demos/preview/demo10.jpg new file mode 100644 index 0000000..496b780 Binary files /dev/null and b/src/assets/media/demos/preview/demo10.jpg differ diff --git a/src/assets/media/demos/preview/demo11.jpg b/src/assets/media/demos/preview/demo11.jpg new file mode 100644 index 0000000..c196444 Binary files /dev/null and b/src/assets/media/demos/preview/demo11.jpg differ diff --git a/src/assets/media/demos/preview/demo12.jpg b/src/assets/media/demos/preview/demo12.jpg new file mode 100644 index 0000000..f24bfba Binary files /dev/null and b/src/assets/media/demos/preview/demo12.jpg differ diff --git a/src/assets/media/demos/preview/demo13.jpg b/src/assets/media/demos/preview/demo13.jpg new file mode 100644 index 0000000..fbee4f2 Binary files /dev/null and b/src/assets/media/demos/preview/demo13.jpg differ diff --git a/src/assets/media/demos/preview/demo14.jpg b/src/assets/media/demos/preview/demo14.jpg new file mode 100644 index 0000000..89c3c83 Binary files /dev/null and b/src/assets/media/demos/preview/demo14.jpg differ diff --git a/src/assets/media/demos/preview/demo15.jpg b/src/assets/media/demos/preview/demo15.jpg new file mode 100644 index 0000000..11536fb Binary files /dev/null and b/src/assets/media/demos/preview/demo15.jpg differ diff --git a/src/assets/media/demos/preview/demo16.jpg b/src/assets/media/demos/preview/demo16.jpg new file mode 100644 index 0000000..9457fc1 Binary files /dev/null and b/src/assets/media/demos/preview/demo16.jpg differ diff --git a/src/assets/media/demos/preview/demo17.jpg b/src/assets/media/demos/preview/demo17.jpg new file mode 100644 index 0000000..7a7679f Binary files /dev/null and b/src/assets/media/demos/preview/demo17.jpg differ diff --git a/src/assets/media/demos/preview/demo2.jpg b/src/assets/media/demos/preview/demo2.jpg new file mode 100644 index 0000000..6f58cbc Binary files /dev/null and b/src/assets/media/demos/preview/demo2.jpg differ diff --git a/src/assets/media/demos/preview/demo3.jpg b/src/assets/media/demos/preview/demo3.jpg new file mode 100644 index 0000000..61ca336 Binary files /dev/null and b/src/assets/media/demos/preview/demo3.jpg differ diff --git a/src/assets/media/demos/preview/demo4.jpg b/src/assets/media/demos/preview/demo4.jpg new file mode 100644 index 0000000..18aeac2 Binary files /dev/null and b/src/assets/media/demos/preview/demo4.jpg differ diff --git a/src/assets/media/demos/preview/demo5.jpg b/src/assets/media/demos/preview/demo5.jpg new file mode 100644 index 0000000..6adf4df Binary files /dev/null and b/src/assets/media/demos/preview/demo5.jpg differ diff --git a/src/assets/media/demos/preview/demo6.jpg b/src/assets/media/demos/preview/demo6.jpg new file mode 100644 index 0000000..eecca1b Binary files /dev/null and b/src/assets/media/demos/preview/demo6.jpg differ diff --git a/src/assets/media/demos/preview/demo7.jpg b/src/assets/media/demos/preview/demo7.jpg new file mode 100644 index 0000000..2cda059 Binary files /dev/null and b/src/assets/media/demos/preview/demo7.jpg differ diff --git a/src/assets/media/demos/preview/demo8.jpg b/src/assets/media/demos/preview/demo8.jpg new file mode 100644 index 0000000..7f69fa0 Binary files /dev/null and b/src/assets/media/demos/preview/demo8.jpg differ diff --git a/src/assets/media/demos/preview/demo9.jpg b/src/assets/media/demos/preview/demo9.jpg new file mode 100644 index 0000000..0c53e43 Binary files /dev/null and b/src/assets/media/demos/preview/demo9.jpg differ diff --git a/src/assets/media/envato/screen1.jpg b/src/assets/media/envato/screen1.jpg new file mode 100644 index 0000000..3639ca2 Binary files /dev/null and b/src/assets/media/envato/screen1.jpg differ diff --git a/src/assets/media/envato/screen2.jpg b/src/assets/media/envato/screen2.jpg new file mode 100644 index 0000000..c642b09 Binary files /dev/null and b/src/assets/media/envato/screen2.jpg differ diff --git a/src/assets/media/error/bg1.jpg b/src/assets/media/error/bg1.jpg new file mode 100644 index 0000000..ffc89a5 Binary files /dev/null and b/src/assets/media/error/bg1.jpg differ diff --git a/src/assets/media/error/bg2.jpg b/src/assets/media/error/bg2.jpg new file mode 100644 index 0000000..48c0ff9 Binary files /dev/null and b/src/assets/media/error/bg2.jpg differ diff --git a/src/assets/media/error/bg3.jpg b/src/assets/media/error/bg3.jpg new file mode 100644 index 0000000..9ebc925 Binary files /dev/null and b/src/assets/media/error/bg3.jpg differ diff --git a/src/assets/media/error/bg4.jpg b/src/assets/media/error/bg4.jpg new file mode 100644 index 0000000..f80fff5 Binary files /dev/null and b/src/assets/media/error/bg4.jpg differ diff --git a/src/assets/media/error/bg5.jpg b/src/assets/media/error/bg5.jpg new file mode 100644 index 0000000..da0588b Binary files /dev/null and b/src/assets/media/error/bg5.jpg differ diff --git a/src/assets/media/error/bg6.jpg b/src/assets/media/error/bg6.jpg new file mode 100644 index 0000000..2e7179f Binary files /dev/null and b/src/assets/media/error/bg6.jpg differ diff --git a/src/assets/media/files/css.svg b/src/assets/media/files/css.svg new file mode 100644 index 0000000..5022204 --- /dev/null +++ b/src/assets/media/files/css.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/files/csv.svg b/src/assets/media/files/csv.svg new file mode 100644 index 0000000..a8c88ec --- /dev/null +++ b/src/assets/media/files/csv.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/files/doc.svg b/src/assets/media/files/doc.svg new file mode 100644 index 0000000..9c86a02 --- /dev/null +++ b/src/assets/media/files/doc.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/files/html.svg b/src/assets/media/files/html.svg new file mode 100644 index 0000000..2ac1778 --- /dev/null +++ b/src/assets/media/files/html.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/files/javascript.svg b/src/assets/media/files/javascript.svg new file mode 100644 index 0000000..23532cb --- /dev/null +++ b/src/assets/media/files/javascript.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/files/jpg.svg b/src/assets/media/files/jpg.svg new file mode 100644 index 0000000..ae9c6d2 --- /dev/null +++ b/src/assets/media/files/jpg.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/files/mp4.svg b/src/assets/media/files/mp4.svg new file mode 100644 index 0000000..40c1833 --- /dev/null +++ b/src/assets/media/files/mp4.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/files/pdf.svg b/src/assets/media/files/pdf.svg new file mode 100644 index 0000000..758720b --- /dev/null +++ b/src/assets/media/files/pdf.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/files/xml.svg b/src/assets/media/files/xml.svg new file mode 100644 index 0000000..7c8bd71 --- /dev/null +++ b/src/assets/media/files/xml.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/files/zip.svg b/src/assets/media/files/zip.svg new file mode 100644 index 0000000..c4c0937 --- /dev/null +++ b/src/assets/media/files/zip.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/001-mauritius.svg b/src/assets/media/flags/001-mauritius.svg new file mode 100644 index 0000000..96a7abf --- /dev/null +++ b/src/assets/media/flags/001-mauritius.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/003-austria.svg b/src/assets/media/flags/003-austria.svg new file mode 100644 index 0000000..83ea5fb --- /dev/null +++ b/src/assets/media/flags/003-austria.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/004-oman.svg b/src/assets/media/flags/004-oman.svg new file mode 100644 index 0000000..5030fca --- /dev/null +++ b/src/assets/media/flags/004-oman.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/005-ethiopia.svg b/src/assets/media/flags/005-ethiopia.svg new file mode 100644 index 0000000..8990365 --- /dev/null +++ b/src/assets/media/flags/005-ethiopia.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/006-tanzania.svg b/src/assets/media/flags/006-tanzania.svg new file mode 100644 index 0000000..55f7129 --- /dev/null +++ b/src/assets/media/flags/006-tanzania.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/007-nicaragua.svg b/src/assets/media/flags/007-nicaragua.svg new file mode 100644 index 0000000..27b6cca --- /dev/null +++ b/src/assets/media/flags/007-nicaragua.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/008-estonia.svg b/src/assets/media/flags/008-estonia.svg new file mode 100644 index 0000000..f44b53a --- /dev/null +++ b/src/assets/media/flags/008-estonia.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/009-uganda.svg b/src/assets/media/flags/009-uganda.svg new file mode 100644 index 0000000..926bc9d --- /dev/null +++ b/src/assets/media/flags/009-uganda.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/010-slovenia.svg b/src/assets/media/flags/010-slovenia.svg new file mode 100644 index 0000000..8b63232 --- /dev/null +++ b/src/assets/media/flags/010-slovenia.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/011-zimbabwe.svg b/src/assets/media/flags/011-zimbabwe.svg new file mode 100644 index 0000000..cd3c0b3 --- /dev/null +++ b/src/assets/media/flags/011-zimbabwe.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/012-sao-tome-and-prince.svg b/src/assets/media/flags/012-sao-tome-and-prince.svg new file mode 100644 index 0000000..2be137a --- /dev/null +++ b/src/assets/media/flags/012-sao-tome-and-prince.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/013-italy.svg b/src/assets/media/flags/013-italy.svg new file mode 100644 index 0000000..2c3a2e3 --- /dev/null +++ b/src/assets/media/flags/013-italy.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/014-wales.svg b/src/assets/media/flags/014-wales.svg new file mode 100644 index 0000000..3130bca --- /dev/null +++ b/src/assets/media/flags/014-wales.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/015-el-salvador.svg b/src/assets/media/flags/015-el-salvador.svg new file mode 100644 index 0000000..b2de291 --- /dev/null +++ b/src/assets/media/flags/015-el-salvador.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/016-nepal.svg b/src/assets/media/flags/016-nepal.svg new file mode 100644 index 0000000..8009e9e --- /dev/null +++ b/src/assets/media/flags/016-nepal.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/017-christmas-island.svg b/src/assets/media/flags/017-christmas-island.svg new file mode 100644 index 0000000..0107ea6 --- /dev/null +++ b/src/assets/media/flags/017-christmas-island.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/018-lebanon.svg b/src/assets/media/flags/018-lebanon.svg new file mode 100644 index 0000000..f41f74f --- /dev/null +++ b/src/assets/media/flags/018-lebanon.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/019-ceuta.svg b/src/assets/media/flags/019-ceuta.svg new file mode 100644 index 0000000..38998e1 --- /dev/null +++ b/src/assets/media/flags/019-ceuta.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/020-iraq.svg b/src/assets/media/flags/020-iraq.svg new file mode 100644 index 0000000..a78b6e9 --- /dev/null +++ b/src/assets/media/flags/020-iraq.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/021-cook-islands.svg b/src/assets/media/flags/021-cook-islands.svg new file mode 100644 index 0000000..671a871 --- /dev/null +++ b/src/assets/media/flags/021-cook-islands.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/022-syria.svg b/src/assets/media/flags/022-syria.svg new file mode 100644 index 0000000..3e98f58 --- /dev/null +++ b/src/assets/media/flags/022-syria.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/023-cocos-island.svg b/src/assets/media/flags/023-cocos-island.svg new file mode 100644 index 0000000..5868744 --- /dev/null +++ b/src/assets/media/flags/023-cocos-island.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/024-honduras.svg b/src/assets/media/flags/024-honduras.svg new file mode 100644 index 0000000..08d48d8 --- /dev/null +++ b/src/assets/media/flags/024-honduras.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/025-anguilla.svg b/src/assets/media/flags/025-anguilla.svg new file mode 100644 index 0000000..2255268 --- /dev/null +++ b/src/assets/media/flags/025-anguilla.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/026-qatar.svg b/src/assets/media/flags/026-qatar.svg new file mode 100644 index 0000000..718a769 --- /dev/null +++ b/src/assets/media/flags/026-qatar.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/027-american-samoa.svg b/src/assets/media/flags/027-american-samoa.svg new file mode 100644 index 0000000..da124ea --- /dev/null +++ b/src/assets/media/flags/027-american-samoa.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/028-puerto-rico.svg b/src/assets/media/flags/028-puerto-rico.svg new file mode 100644 index 0000000..6622b48 --- /dev/null +++ b/src/assets/media/flags/028-puerto-rico.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/029-comoros.svg b/src/assets/media/flags/029-comoros.svg new file mode 100644 index 0000000..923141a --- /dev/null +++ b/src/assets/media/flags/029-comoros.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/030-north-korea.svg b/src/assets/media/flags/030-north-korea.svg new file mode 100644 index 0000000..31d1463 --- /dev/null +++ b/src/assets/media/flags/030-north-korea.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/031-corsica.svg b/src/assets/media/flags/031-corsica.svg new file mode 100644 index 0000000..528f6b1 --- /dev/null +++ b/src/assets/media/flags/031-corsica.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/032-zambia.svg b/src/assets/media/flags/032-zambia.svg new file mode 100644 index 0000000..50a5fbc --- /dev/null +++ b/src/assets/media/flags/032-zambia.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/033-saint-kitts-and-nevis.svg b/src/assets/media/flags/033-saint-kitts-and-nevis.svg new file mode 100644 index 0000000..d503337 --- /dev/null +++ b/src/assets/media/flags/033-saint-kitts-and-nevis.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/034-china.svg b/src/assets/media/flags/034-china.svg new file mode 100644 index 0000000..6c139eb --- /dev/null +++ b/src/assets/media/flags/034-china.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/035-luxembourg.svg b/src/assets/media/flags/035-luxembourg.svg new file mode 100644 index 0000000..c81d754 --- /dev/null +++ b/src/assets/media/flags/035-luxembourg.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/036-central-african-republic.svg b/src/assets/media/flags/036-central-african-republic.svg new file mode 100644 index 0000000..00b434a --- /dev/null +++ b/src/assets/media/flags/036-central-african-republic.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/037-jamaica.svg b/src/assets/media/flags/037-jamaica.svg new file mode 100644 index 0000000..a709601 --- /dev/null +++ b/src/assets/media/flags/037-jamaica.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/038-cape-verde.svg b/src/assets/media/flags/038-cape-verde.svg new file mode 100644 index 0000000..71f38fa --- /dev/null +++ b/src/assets/media/flags/038-cape-verde.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/039-monaco.svg b/src/assets/media/flags/039-monaco.svg new file mode 100644 index 0000000..565cf5f --- /dev/null +++ b/src/assets/media/flags/039-monaco.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/040-bhutan.svg b/src/assets/media/flags/040-bhutan.svg new file mode 100644 index 0000000..31fdde0 --- /dev/null +++ b/src/assets/media/flags/040-bhutan.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/041-paraguay.svg b/src/assets/media/flags/041-paraguay.svg new file mode 100644 index 0000000..8f2e962 --- /dev/null +++ b/src/assets/media/flags/041-paraguay.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/042-aruba.svg b/src/assets/media/flags/042-aruba.svg new file mode 100644 index 0000000..4f53a45 --- /dev/null +++ b/src/assets/media/flags/042-aruba.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/043-montserrat.svg b/src/assets/media/flags/043-montserrat.svg new file mode 100644 index 0000000..cf1b3ec --- /dev/null +++ b/src/assets/media/flags/043-montserrat.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/044-latvia.svg b/src/assets/media/flags/044-latvia.svg new file mode 100644 index 0000000..a2e0615 --- /dev/null +++ b/src/assets/media/flags/044-latvia.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/045-andorra.svg b/src/assets/media/flags/045-andorra.svg new file mode 100644 index 0000000..448f90e --- /dev/null +++ b/src/assets/media/flags/045-andorra.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/046-micronesia.svg b/src/assets/media/flags/046-micronesia.svg new file mode 100644 index 0000000..07f6f94 --- /dev/null +++ b/src/assets/media/flags/046-micronesia.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/047-dominican-republic.svg b/src/assets/media/flags/047-dominican-republic.svg new file mode 100644 index 0000000..d96b67e --- /dev/null +++ b/src/assets/media/flags/047-dominican-republic.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/048-abkhazia.svg b/src/assets/media/flags/048-abkhazia.svg new file mode 100644 index 0000000..6fc3a99 --- /dev/null +++ b/src/assets/media/flags/048-abkhazia.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/049-tunisia.svg b/src/assets/media/flags/049-tunisia.svg new file mode 100644 index 0000000..08e4379 --- /dev/null +++ b/src/assets/media/flags/049-tunisia.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/050-mauritania.svg b/src/assets/media/flags/050-mauritania.svg new file mode 100644 index 0000000..f5dba04 --- /dev/null +++ b/src/assets/media/flags/050-mauritania.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/051-cayman-islands.svg b/src/assets/media/flags/051-cayman-islands.svg new file mode 100644 index 0000000..8756e61 --- /dev/null +++ b/src/assets/media/flags/051-cayman-islands.svg @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/052-kosovo.svg b/src/assets/media/flags/052-kosovo.svg new file mode 100644 index 0000000..7a9aea7 --- /dev/null +++ b/src/assets/media/flags/052-kosovo.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/053-ghana.svg b/src/assets/media/flags/053-ghana.svg new file mode 100644 index 0000000..3f83f4d --- /dev/null +++ b/src/assets/media/flags/053-ghana.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/054-canary-islands.svg b/src/assets/media/flags/054-canary-islands.svg new file mode 100644 index 0000000..1b55832 --- /dev/null +++ b/src/assets/media/flags/054-canary-islands.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/055-scotland.svg b/src/assets/media/flags/055-scotland.svg new file mode 100644 index 0000000..995b18b --- /dev/null +++ b/src/assets/media/flags/055-scotland.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/056-guinea-bissau.svg b/src/assets/media/flags/056-guinea-bissau.svg new file mode 100644 index 0000000..03c737b --- /dev/null +++ b/src/assets/media/flags/056-guinea-bissau.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/057-burundi.svg b/src/assets/media/flags/057-burundi.svg new file mode 100644 index 0000000..3ffb8c8 --- /dev/null +++ b/src/assets/media/flags/057-burundi.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/058-myanmar.svg b/src/assets/media/flags/058-myanmar.svg new file mode 100644 index 0000000..6bcce7d --- /dev/null +++ b/src/assets/media/flags/058-myanmar.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/059-gabon.svg b/src/assets/media/flags/059-gabon.svg new file mode 100644 index 0000000..e7590c7 --- /dev/null +++ b/src/assets/media/flags/059-gabon.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/060-benin.svg b/src/assets/media/flags/060-benin.svg new file mode 100644 index 0000000..7599965 --- /dev/null +++ b/src/assets/media/flags/060-benin.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/061-saba-island.svg b/src/assets/media/flags/061-saba-island.svg new file mode 100644 index 0000000..fbd7ffc --- /dev/null +++ b/src/assets/media/flags/061-saba-island.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/062-namibia.svg b/src/assets/media/flags/062-namibia.svg new file mode 100644 index 0000000..dd6fb2c --- /dev/null +++ b/src/assets/media/flags/062-namibia.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/063-japan.svg b/src/assets/media/flags/063-japan.svg new file mode 100644 index 0000000..60dad82 --- /dev/null +++ b/src/assets/media/flags/063-japan.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/064-lithuania.svg b/src/assets/media/flags/064-lithuania.svg new file mode 100644 index 0000000..e2ae265 --- /dev/null +++ b/src/assets/media/flags/064-lithuania.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/065-eritrea.svg b/src/assets/media/flags/065-eritrea.svg new file mode 100644 index 0000000..0c737c0 --- /dev/null +++ b/src/assets/media/flags/065-eritrea.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/066-chad.svg b/src/assets/media/flags/066-chad.svg new file mode 100644 index 0000000..a1afd0d --- /dev/null +++ b/src/assets/media/flags/066-chad.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/067-kenya.svg b/src/assets/media/flags/067-kenya.svg new file mode 100644 index 0000000..12ef6bc --- /dev/null +++ b/src/assets/media/flags/067-kenya.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/068-djibouti.svg b/src/assets/media/flags/068-djibouti.svg new file mode 100644 index 0000000..852b206 --- /dev/null +++ b/src/assets/media/flags/068-djibouti.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/069-british-indian-ocean-territory.svg b/src/assets/media/flags/069-british-indian-ocean-territory.svg new file mode 100644 index 0000000..6e1fcaf --- /dev/null +++ b/src/assets/media/flags/069-british-indian-ocean-territory.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/070-tuvalu-1.svg b/src/assets/media/flags/070-tuvalu-1.svg new file mode 100644 index 0000000..d49cabb --- /dev/null +++ b/src/assets/media/flags/070-tuvalu-1.svg @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/071-serbia.svg b/src/assets/media/flags/071-serbia.svg new file mode 100644 index 0000000..f2d47b2 --- /dev/null +++ b/src/assets/media/flags/071-serbia.svg @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/072-bonaire.svg b/src/assets/media/flags/072-bonaire.svg new file mode 100644 index 0000000..b7806da --- /dev/null +++ b/src/assets/media/flags/072-bonaire.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/073-togo.svg b/src/assets/media/flags/073-togo.svg new file mode 100644 index 0000000..66100af --- /dev/null +++ b/src/assets/media/flags/073-togo.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/074-kazakhstan.svg b/src/assets/media/flags/074-kazakhstan.svg new file mode 100644 index 0000000..40975f7 --- /dev/null +++ b/src/assets/media/flags/074-kazakhstan.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/075-antigua-and-barbuda.svg b/src/assets/media/flags/075-antigua-and-barbuda.svg new file mode 100644 index 0000000..b4c7c93 --- /dev/null +++ b/src/assets/media/flags/075-antigua-and-barbuda.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/076-suriname.svg b/src/assets/media/flags/076-suriname.svg new file mode 100644 index 0000000..16f6fa7 --- /dev/null +++ b/src/assets/media/flags/076-suriname.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/077-jordan.svg b/src/assets/media/flags/077-jordan.svg new file mode 100644 index 0000000..d05aa3d --- /dev/null +++ b/src/assets/media/flags/077-jordan.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/078-belize.svg b/src/assets/media/flags/078-belize.svg new file mode 100644 index 0000000..b89ae5f --- /dev/null +++ b/src/assets/media/flags/078-belize.svg @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/079-st-barts.svg b/src/assets/media/flags/079-st-barts.svg new file mode 100644 index 0000000..5205637 --- /dev/null +++ b/src/assets/media/flags/079-st-barts.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/080-iceland.svg b/src/assets/media/flags/080-iceland.svg new file mode 100644 index 0000000..93a5806 --- /dev/null +++ b/src/assets/media/flags/080-iceland.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/081-bermuda.svg b/src/assets/media/flags/081-bermuda.svg new file mode 100644 index 0000000..7be8ebd --- /dev/null +++ b/src/assets/media/flags/081-bermuda.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/082-united-nations.svg b/src/assets/media/flags/082-united-nations.svg new file mode 100644 index 0000000..c4db01a --- /dev/null +++ b/src/assets/media/flags/082-united-nations.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/083-somalia.svg b/src/assets/media/flags/083-somalia.svg new file mode 100644 index 0000000..3b72d5c --- /dev/null +++ b/src/assets/media/flags/083-somalia.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/084-barbados.svg b/src/assets/media/flags/084-barbados.svg new file mode 100644 index 0000000..bc5d4c1 --- /dev/null +++ b/src/assets/media/flags/084-barbados.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/085-solomon-islands.svg b/src/assets/media/flags/085-solomon-islands.svg new file mode 100644 index 0000000..7203b62 --- /dev/null +++ b/src/assets/media/flags/085-solomon-islands.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/086-nigeria.svg b/src/assets/media/flags/086-nigeria.svg new file mode 100644 index 0000000..41da495 --- /dev/null +++ b/src/assets/media/flags/086-nigeria.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/087-aland-islands.svg b/src/assets/media/flags/087-aland-islands.svg new file mode 100644 index 0000000..71ae0d7 --- /dev/null +++ b/src/assets/media/flags/087-aland-islands.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/088-uruguay.svg b/src/assets/media/flags/088-uruguay.svg new file mode 100644 index 0000000..9d5ea42 --- /dev/null +++ b/src/assets/media/flags/088-uruguay.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/089-sint-maarten.svg b/src/assets/media/flags/089-sint-maarten.svg new file mode 100644 index 0000000..bf2c035 --- /dev/null +++ b/src/assets/media/flags/089-sint-maarten.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/090-burkina-faso.svg b/src/assets/media/flags/090-burkina-faso.svg new file mode 100644 index 0000000..694be06 --- /dev/null +++ b/src/assets/media/flags/090-burkina-faso.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/091-slovakia.svg b/src/assets/media/flags/091-slovakia.svg new file mode 100644 index 0000000..8ca0933 --- /dev/null +++ b/src/assets/media/flags/091-slovakia.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/092-sierra-leone.svg b/src/assets/media/flags/092-sierra-leone.svg new file mode 100644 index 0000000..3ef894d --- /dev/null +++ b/src/assets/media/flags/092-sierra-leone.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/093-basque-country.svg b/src/assets/media/flags/093-basque-country.svg new file mode 100644 index 0000000..619592a --- /dev/null +++ b/src/assets/media/flags/093-basque-country.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/094-south-korea.svg b/src/assets/media/flags/094-south-korea.svg new file mode 100644 index 0000000..2a868dd --- /dev/null +++ b/src/assets/media/flags/094-south-korea.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/095-pitcairn-islands.svg b/src/assets/media/flags/095-pitcairn-islands.svg new file mode 100644 index 0000000..ccd508d --- /dev/null +++ b/src/assets/media/flags/095-pitcairn-islands.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/096-mozambique.svg b/src/assets/media/flags/096-mozambique.svg new file mode 100644 index 0000000..63f579e --- /dev/null +++ b/src/assets/media/flags/096-mozambique.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/097-san-marino.svg b/src/assets/media/flags/097-san-marino.svg new file mode 100644 index 0000000..3334f79 --- /dev/null +++ b/src/assets/media/flags/097-san-marino.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/098-guatemala.svg b/src/assets/media/flags/098-guatemala.svg new file mode 100644 index 0000000..4b4ff32 --- /dev/null +++ b/src/assets/media/flags/098-guatemala.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/099-albania.svg b/src/assets/media/flags/099-albania.svg new file mode 100644 index 0000000..53b8683 --- /dev/null +++ b/src/assets/media/flags/099-albania.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/100-pakistan.svg b/src/assets/media/flags/100-pakistan.svg new file mode 100644 index 0000000..f792bfe --- /dev/null +++ b/src/assets/media/flags/100-pakistan.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/101-northern-cyprus.svg b/src/assets/media/flags/101-northern-cyprus.svg new file mode 100644 index 0000000..0587fe0 --- /dev/null +++ b/src/assets/media/flags/101-northern-cyprus.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/102-balearic-islands.svg b/src/assets/media/flags/102-balearic-islands.svg new file mode 100644 index 0000000..c134fbf --- /dev/null +++ b/src/assets/media/flags/102-balearic-islands.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/103-marshall-island.svg b/src/assets/media/flags/103-marshall-island.svg new file mode 100644 index 0000000..7e51ddc --- /dev/null +++ b/src/assets/media/flags/103-marshall-island.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/104-ecuador.svg b/src/assets/media/flags/104-ecuador.svg new file mode 100644 index 0000000..4978a74 --- /dev/null +++ b/src/assets/media/flags/104-ecuador.svg @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/105-cameroon.svg b/src/assets/media/flags/105-cameroon.svg new file mode 100644 index 0000000..06a0179 --- /dev/null +++ b/src/assets/media/flags/105-cameroon.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/106-panama.svg b/src/assets/media/flags/106-panama.svg new file mode 100644 index 0000000..e89f18c --- /dev/null +++ b/src/assets/media/flags/106-panama.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/107-kwait.svg b/src/assets/media/flags/107-kwait.svg new file mode 100644 index 0000000..5f9514f --- /dev/null +++ b/src/assets/media/flags/107-kwait.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/108-armenia.svg b/src/assets/media/flags/108-armenia.svg new file mode 100644 index 0000000..67a5a53 --- /dev/null +++ b/src/assets/media/flags/108-armenia.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/109-romania.svg b/src/assets/media/flags/109-romania.svg new file mode 100644 index 0000000..f274915 --- /dev/null +++ b/src/assets/media/flags/109-romania.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/110-guinea.svg b/src/assets/media/flags/110-guinea.svg new file mode 100644 index 0000000..309f35d --- /dev/null +++ b/src/assets/media/flags/110-guinea.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/111-afghanistan.svg b/src/assets/media/flags/111-afghanistan.svg new file mode 100644 index 0000000..b3cb5bc --- /dev/null +++ b/src/assets/media/flags/111-afghanistan.svg @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/112-laos.svg b/src/assets/media/flags/112-laos.svg new file mode 100644 index 0000000..d05646e --- /dev/null +++ b/src/assets/media/flags/112-laos.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/113-greenland.svg b/src/assets/media/flags/113-greenland.svg new file mode 100644 index 0000000..c2b7355 --- /dev/null +++ b/src/assets/media/flags/113-greenland.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/114-british-virgin-islands.svg b/src/assets/media/flags/114-british-virgin-islands.svg new file mode 100644 index 0000000..52174ad --- /dev/null +++ b/src/assets/media/flags/114-british-virgin-islands.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/115-hungary.svg b/src/assets/media/flags/115-hungary.svg new file mode 100644 index 0000000..62a7816 --- /dev/null +++ b/src/assets/media/flags/115-hungary.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/116-curacao.svg b/src/assets/media/flags/116-curacao.svg new file mode 100644 index 0000000..286b87d --- /dev/null +++ b/src/assets/media/flags/116-curacao.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/117-angola.svg b/src/assets/media/flags/117-angola.svg new file mode 100644 index 0000000..734bbf1 --- /dev/null +++ b/src/assets/media/flags/117-angola.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/118-malasya.svg b/src/assets/media/flags/118-malasya.svg new file mode 100644 index 0000000..c9fc8f4 --- /dev/null +++ b/src/assets/media/flags/118-malasya.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/119-brunei.svg b/src/assets/media/flags/119-brunei.svg new file mode 100644 index 0000000..4cca334 --- /dev/null +++ b/src/assets/media/flags/119-brunei.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/120-bahamas.svg b/src/assets/media/flags/120-bahamas.svg new file mode 100644 index 0000000..c84792d --- /dev/null +++ b/src/assets/media/flags/120-bahamas.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/121-new-zealand.svg b/src/assets/media/flags/121-new-zealand.svg new file mode 100644 index 0000000..cc0ee7f --- /dev/null +++ b/src/assets/media/flags/121-new-zealand.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/123-british-columbia.svg b/src/assets/media/flags/123-british-columbia.svg new file mode 100644 index 0000000..9793c4c --- /dev/null +++ b/src/assets/media/flags/123-british-columbia.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/124-vatican-city.svg b/src/assets/media/flags/124-vatican-city.svg new file mode 100644 index 0000000..62464e7 --- /dev/null +++ b/src/assets/media/flags/124-vatican-city.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/125-finland.svg b/src/assets/media/flags/125-finland.svg new file mode 100644 index 0000000..bae8824 --- /dev/null +++ b/src/assets/media/flags/125-finland.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/126-botswana.svg b/src/assets/media/flags/126-botswana.svg new file mode 100644 index 0000000..69a6911 --- /dev/null +++ b/src/assets/media/flags/126-botswana.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/127-sri-lanka.svg b/src/assets/media/flags/127-sri-lanka.svg new file mode 100644 index 0000000..eaf58c3 --- /dev/null +++ b/src/assets/media/flags/127-sri-lanka.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/128-spain.svg b/src/assets/media/flags/128-spain.svg new file mode 100644 index 0000000..3808011 --- /dev/null +++ b/src/assets/media/flags/128-spain.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/129-ossetia.svg b/src/assets/media/flags/129-ossetia.svg new file mode 100644 index 0000000..7d8cdd0 --- /dev/null +++ b/src/assets/media/flags/129-ossetia.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/130-sicily.svg b/src/assets/media/flags/130-sicily.svg new file mode 100644 index 0000000..6b382a4 --- /dev/null +++ b/src/assets/media/flags/130-sicily.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/131-chile.svg b/src/assets/media/flags/131-chile.svg new file mode 100644 index 0000000..bea60c7 --- /dev/null +++ b/src/assets/media/flags/131-chile.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/132-bosnia-and-herzegovina.svg b/src/assets/media/flags/132-bosnia-and-herzegovina.svg new file mode 100644 index 0000000..28e70bc --- /dev/null +++ b/src/assets/media/flags/132-bosnia-and-herzegovina.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/133-saudi-arabia.svg b/src/assets/media/flags/133-saudi-arabia.svg new file mode 100644 index 0000000..e496ad9 --- /dev/null +++ b/src/assets/media/flags/133-saudi-arabia.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/134-liechtenstein.svg b/src/assets/media/flags/134-liechtenstein.svg new file mode 100644 index 0000000..b6075b9 --- /dev/null +++ b/src/assets/media/flags/134-liechtenstein.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/135-belarus.svg b/src/assets/media/flags/135-belarus.svg new file mode 100644 index 0000000..02d6a04 --- /dev/null +++ b/src/assets/media/flags/135-belarus.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/136-iran.svg b/src/assets/media/flags/136-iran.svg new file mode 100644 index 0000000..8f00529 --- /dev/null +++ b/src/assets/media/flags/136-iran.svg @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/137-fiji.svg b/src/assets/media/flags/137-fiji.svg new file mode 100644 index 0000000..21b61b7 --- /dev/null +++ b/src/assets/media/flags/137-fiji.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/138-bahrain.svg b/src/assets/media/flags/138-bahrain.svg new file mode 100644 index 0000000..374a7db --- /dev/null +++ b/src/assets/media/flags/138-bahrain.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/139-venezuela.svg b/src/assets/media/flags/139-venezuela.svg new file mode 100644 index 0000000..e35b132 --- /dev/null +++ b/src/assets/media/flags/139-venezuela.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/140-east-timor.svg b/src/assets/media/flags/140-east-timor.svg new file mode 100644 index 0000000..c6b2e2d --- /dev/null +++ b/src/assets/media/flags/140-east-timor.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/141-azerbaijan.svg b/src/assets/media/flags/141-azerbaijan.svg new file mode 100644 index 0000000..fa12d8d --- /dev/null +++ b/src/assets/media/flags/141-azerbaijan.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/142-tibet.svg b/src/assets/media/flags/142-tibet.svg new file mode 100644 index 0000000..cc24bc2 --- /dev/null +++ b/src/assets/media/flags/142-tibet.svg @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/143-norway.svg b/src/assets/media/flags/143-norway.svg new file mode 100644 index 0000000..46ab6bf --- /dev/null +++ b/src/assets/media/flags/143-norway.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/144-algeria.svg b/src/assets/media/flags/144-algeria.svg new file mode 100644 index 0000000..8692d52 --- /dev/null +++ b/src/assets/media/flags/144-algeria.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/145-ukraine.svg b/src/assets/media/flags/145-ukraine.svg new file mode 100644 index 0000000..04b8a32 --- /dev/null +++ b/src/assets/media/flags/145-ukraine.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/146-gambia.svg b/src/assets/media/flags/146-gambia.svg new file mode 100644 index 0000000..db309a4 --- /dev/null +++ b/src/assets/media/flags/146-gambia.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/147-bangladesh.svg b/src/assets/media/flags/147-bangladesh.svg new file mode 100644 index 0000000..0c948a0 --- /dev/null +++ b/src/assets/media/flags/147-bangladesh.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/148-madeira.svg b/src/assets/media/flags/148-madeira.svg new file mode 100644 index 0000000..202611f --- /dev/null +++ b/src/assets/media/flags/148-madeira.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/149-czech-republic.svg b/src/assets/media/flags/149-czech-republic.svg new file mode 100644 index 0000000..6e082b4 --- /dev/null +++ b/src/assets/media/flags/149-czech-republic.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/150-bolivia.svg b/src/assets/media/flags/150-bolivia.svg new file mode 100644 index 0000000..ee7868f --- /dev/null +++ b/src/assets/media/flags/150-bolivia.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/151-united-arab-emirates.svg b/src/assets/media/flags/151-united-arab-emirates.svg new file mode 100644 index 0000000..c507b8f --- /dev/null +++ b/src/assets/media/flags/151-united-arab-emirates.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/152-kyrgyzstan.svg b/src/assets/media/flags/152-kyrgyzstan.svg new file mode 100644 index 0000000..646fd34 --- /dev/null +++ b/src/assets/media/flags/152-kyrgyzstan.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/153-cuba.svg b/src/assets/media/flags/153-cuba.svg new file mode 100644 index 0000000..b84b10e --- /dev/null +++ b/src/assets/media/flags/153-cuba.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/154-swaziland.svg b/src/assets/media/flags/154-swaziland.svg new file mode 100644 index 0000000..718aab5 --- /dev/null +++ b/src/assets/media/flags/154-swaziland.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/155-israel.svg b/src/assets/media/flags/155-israel.svg new file mode 100644 index 0000000..0c1f226 --- /dev/null +++ b/src/assets/media/flags/155-israel.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/156-costa-rica.svg b/src/assets/media/flags/156-costa-rica.svg new file mode 100644 index 0000000..596a10e --- /dev/null +++ b/src/assets/media/flags/156-costa-rica.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/157-republic-of-the-congo.svg b/src/assets/media/flags/157-republic-of-the-congo.svg new file mode 100644 index 0000000..1d96ea7 --- /dev/null +++ b/src/assets/media/flags/157-republic-of-the-congo.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/158-egypt.svg b/src/assets/media/flags/158-egypt.svg new file mode 100644 index 0000000..065d536 --- /dev/null +++ b/src/assets/media/flags/158-egypt.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/159-cambodia.svg b/src/assets/media/flags/159-cambodia.svg new file mode 100644 index 0000000..cbba946 --- /dev/null +++ b/src/assets/media/flags/159-cambodia.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/160-northern-marianas-islands.svg b/src/assets/media/flags/160-northern-marianas-islands.svg new file mode 100644 index 0000000..4029970 --- /dev/null +++ b/src/assets/media/flags/160-northern-marianas-islands.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/161-ivory-coast.svg b/src/assets/media/flags/161-ivory-coast.svg new file mode 100644 index 0000000..eea20db --- /dev/null +++ b/src/assets/media/flags/161-ivory-coast.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/162-germany.svg b/src/assets/media/flags/162-germany.svg new file mode 100644 index 0000000..7e059ed --- /dev/null +++ b/src/assets/media/flags/162-germany.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/163-papua-new-guinea.svg b/src/assets/media/flags/163-papua-new-guinea.svg new file mode 100644 index 0000000..05a76f9 --- /dev/null +++ b/src/assets/media/flags/163-papua-new-guinea.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/164-croatia.svg b/src/assets/media/flags/164-croatia.svg new file mode 100644 index 0000000..b37f9ba --- /dev/null +++ b/src/assets/media/flags/164-croatia.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/165-belgium.svg b/src/assets/media/flags/165-belgium.svg new file mode 100644 index 0000000..3528e23 --- /dev/null +++ b/src/assets/media/flags/165-belgium.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/166-morocco.svg b/src/assets/media/flags/166-morocco.svg new file mode 100644 index 0000000..5acea60 --- /dev/null +++ b/src/assets/media/flags/166-morocco.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/167-macao.svg b/src/assets/media/flags/167-macao.svg new file mode 100644 index 0000000..25cbedc --- /dev/null +++ b/src/assets/media/flags/167-macao.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/168-bulgaria.svg b/src/assets/media/flags/168-bulgaria.svg new file mode 100644 index 0000000..60671ef --- /dev/null +++ b/src/assets/media/flags/168-bulgaria.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/169-liberia.svg b/src/assets/media/flags/169-liberia.svg new file mode 100644 index 0000000..b0f6ecb --- /dev/null +++ b/src/assets/media/flags/169-liberia.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/170-greece.svg b/src/assets/media/flags/170-greece.svg new file mode 100644 index 0000000..9632b6f --- /dev/null +++ b/src/assets/media/flags/170-greece.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/171-galapagos-islands.svg b/src/assets/media/flags/171-galapagos-islands.svg new file mode 100644 index 0000000..5c9bb4a --- /dev/null +++ b/src/assets/media/flags/171-galapagos-islands.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/172-st-lucia.svg b/src/assets/media/flags/172-st-lucia.svg new file mode 100644 index 0000000..3d32682 --- /dev/null +++ b/src/assets/media/flags/172-st-lucia.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/173-mali.svg b/src/assets/media/flags/173-mali.svg new file mode 100644 index 0000000..9059f81 --- /dev/null +++ b/src/assets/media/flags/173-mali.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/174-denmark.svg b/src/assets/media/flags/174-denmark.svg new file mode 100644 index 0000000..d2c9e7f --- /dev/null +++ b/src/assets/media/flags/174-denmark.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/175-rapa-nui.svg b/src/assets/media/flags/175-rapa-nui.svg new file mode 100644 index 0000000..0cb703e --- /dev/null +++ b/src/assets/media/flags/175-rapa-nui.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/176-lesotho.svg b/src/assets/media/flags/176-lesotho.svg new file mode 100644 index 0000000..57f22a4 --- /dev/null +++ b/src/assets/media/flags/176-lesotho.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/177-colombia.svg b/src/assets/media/flags/177-colombia.svg new file mode 100644 index 0000000..3f67537 --- /dev/null +++ b/src/assets/media/flags/177-colombia.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/178-palau.svg b/src/assets/media/flags/178-palau.svg new file mode 100644 index 0000000..19623a2 --- /dev/null +++ b/src/assets/media/flags/178-palau.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/179-ireland.svg b/src/assets/media/flags/179-ireland.svg new file mode 100644 index 0000000..c1f75ba --- /dev/null +++ b/src/assets/media/flags/179-ireland.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/180-french-polynesia.svg b/src/assets/media/flags/180-french-polynesia.svg new file mode 100644 index 0000000..9eb56ae --- /dev/null +++ b/src/assets/media/flags/180-french-polynesia.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/181-trinidad-and-tobago.svg b/src/assets/media/flags/181-trinidad-and-tobago.svg new file mode 100644 index 0000000..72e026f --- /dev/null +++ b/src/assets/media/flags/181-trinidad-and-tobago.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/182-niue.svg b/src/assets/media/flags/182-niue.svg new file mode 100644 index 0000000..0c3b6d0 --- /dev/null +++ b/src/assets/media/flags/182-niue.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/183-hong-kong.svg b/src/assets/media/flags/183-hong-kong.svg new file mode 100644 index 0000000..bc23f8a --- /dev/null +++ b/src/assets/media/flags/183-hong-kong.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/184-sweden.svg b/src/assets/media/flags/184-sweden.svg new file mode 100644 index 0000000..e27a5f7 --- /dev/null +++ b/src/assets/media/flags/184-sweden.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/185-haiti.svg b/src/assets/media/flags/185-haiti.svg new file mode 100644 index 0000000..fd0497d --- /dev/null +++ b/src/assets/media/flags/185-haiti.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/186-dominica.svg b/src/assets/media/flags/186-dominica.svg new file mode 100644 index 0000000..c1228c6 --- /dev/null +++ b/src/assets/media/flags/186-dominica.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/187-vanuatu.svg b/src/assets/media/flags/187-vanuatu.svg new file mode 100644 index 0000000..fcbd354 --- /dev/null +++ b/src/assets/media/flags/187-vanuatu.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/188-peru.svg b/src/assets/media/flags/188-peru.svg new file mode 100644 index 0000000..cd23022 --- /dev/null +++ b/src/assets/media/flags/188-peru.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/189-equatorial-guinea.svg b/src/assets/media/flags/189-equatorial-guinea.svg new file mode 100644 index 0000000..3cb6f88 --- /dev/null +++ b/src/assets/media/flags/189-equatorial-guinea.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/190-uzbekistn.svg b/src/assets/media/flags/190-uzbekistn.svg new file mode 100644 index 0000000..265704a --- /dev/null +++ b/src/assets/media/flags/190-uzbekistn.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/191-tonga.svg b/src/assets/media/flags/191-tonga.svg new file mode 100644 index 0000000..7116131 --- /dev/null +++ b/src/assets/media/flags/191-tonga.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/192-philippines.svg b/src/assets/media/flags/192-philippines.svg new file mode 100644 index 0000000..a6772d6 --- /dev/null +++ b/src/assets/media/flags/192-philippines.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/193-norfolk-island.svg b/src/assets/media/flags/193-norfolk-island.svg new file mode 100644 index 0000000..2082bdf --- /dev/null +++ b/src/assets/media/flags/193-norfolk-island.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/194-malta.svg b/src/assets/media/flags/194-malta.svg new file mode 100644 index 0000000..83bc352 --- /dev/null +++ b/src/assets/media/flags/194-malta.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/195-france.svg b/src/assets/media/flags/195-france.svg new file mode 100644 index 0000000..f5e7ae9 --- /dev/null +++ b/src/assets/media/flags/195-france.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/196-tajikistan.svg b/src/assets/media/flags/196-tajikistan.svg new file mode 100644 index 0000000..4c1f795 --- /dev/null +++ b/src/assets/media/flags/196-tajikistan.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/197-melilla.svg b/src/assets/media/flags/197-melilla.svg new file mode 100644 index 0000000..10b20a4 --- /dev/null +++ b/src/assets/media/flags/197-melilla.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/198-argentina.svg b/src/assets/media/flags/198-argentina.svg new file mode 100644 index 0000000..0cd84ab --- /dev/null +++ b/src/assets/media/flags/198-argentina.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/199-sudan.svg b/src/assets/media/flags/199-sudan.svg new file mode 100644 index 0000000..6df8c2d --- /dev/null +++ b/src/assets/media/flags/199-sudan.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/200-south-africa.svg b/src/assets/media/flags/200-south-africa.svg new file mode 100644 index 0000000..2e657ba --- /dev/null +++ b/src/assets/media/flags/200-south-africa.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/201-martinique.svg b/src/assets/media/flags/201-martinique.svg new file mode 100644 index 0000000..e80b49c --- /dev/null +++ b/src/assets/media/flags/201-martinique.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/202-taiwan.svg b/src/assets/media/flags/202-taiwan.svg new file mode 100644 index 0000000..d1f3671 --- /dev/null +++ b/src/assets/media/flags/202-taiwan.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/203-sahrawi-arab-democratic-republic.svg b/src/assets/media/flags/203-sahrawi-arab-democratic-republic.svg new file mode 100644 index 0000000..29e3d7f --- /dev/null +++ b/src/assets/media/flags/203-sahrawi-arab-democratic-republic.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/204-guernsey.svg b/src/assets/media/flags/204-guernsey.svg new file mode 100644 index 0000000..250079e --- /dev/null +++ b/src/assets/media/flags/204-guernsey.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/205-switzerland.svg b/src/assets/media/flags/205-switzerland.svg new file mode 100644 index 0000000..d496223 --- /dev/null +++ b/src/assets/media/flags/205-switzerland.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/206-rwanda.svg b/src/assets/media/flags/206-rwanda.svg new file mode 100644 index 0000000..18810be --- /dev/null +++ b/src/assets/media/flags/206-rwanda.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/207-guam.svg b/src/assets/media/flags/207-guam.svg new file mode 100644 index 0000000..64bf9fd --- /dev/null +++ b/src/assets/media/flags/207-guam.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/208-palestine.svg b/src/assets/media/flags/208-palestine.svg new file mode 100644 index 0000000..0072a44 --- /dev/null +++ b/src/assets/media/flags/208-palestine.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/209-indonesia.svg b/src/assets/media/flags/209-indonesia.svg new file mode 100644 index 0000000..00596a3 --- /dev/null +++ b/src/assets/media/flags/209-indonesia.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/210-grenada.svg b/src/assets/media/flags/210-grenada.svg new file mode 100644 index 0000000..9ec3356 --- /dev/null +++ b/src/assets/media/flags/210-grenada.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/211-poland.svg b/src/assets/media/flags/211-poland.svg new file mode 100644 index 0000000..f4cd957 --- /dev/null +++ b/src/assets/media/flags/211-poland.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/212-moldova.svg b/src/assets/media/flags/212-moldova.svg new file mode 100644 index 0000000..5e403f3 --- /dev/null +++ b/src/assets/media/flags/212-moldova.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/213-gibraltar.svg b/src/assets/media/flags/213-gibraltar.svg new file mode 100644 index 0000000..d7c167e --- /dev/null +++ b/src/assets/media/flags/213-gibraltar.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/214-malawi.svg b/src/assets/media/flags/214-malawi.svg new file mode 100644 index 0000000..dd13a37 --- /dev/null +++ b/src/assets/media/flags/214-malawi.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/215-falkland-islands.svg b/src/assets/media/flags/215-falkland-islands.svg new file mode 100644 index 0000000..f5f0c22 --- /dev/null +++ b/src/assets/media/flags/215-falkland-islands.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/216-england.svg b/src/assets/media/flags/216-england.svg new file mode 100644 index 0000000..574257a --- /dev/null +++ b/src/assets/media/flags/216-england.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/217-virgin-islands.svg b/src/assets/media/flags/217-virgin-islands.svg new file mode 100644 index 0000000..bcb036f --- /dev/null +++ b/src/assets/media/flags/217-virgin-islands.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/218-turkey.svg b/src/assets/media/flags/218-turkey.svg new file mode 100644 index 0000000..6a44c2a --- /dev/null +++ b/src/assets/media/flags/218-turkey.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/219-isle-of-man.svg b/src/assets/media/flags/219-isle-of-man.svg new file mode 100644 index 0000000..9ff50f6 --- /dev/null +++ b/src/assets/media/flags/219-isle-of-man.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/220-vietnam.svg b/src/assets/media/flags/220-vietnam.svg new file mode 100644 index 0000000..08f02fb --- /dev/null +++ b/src/assets/media/flags/220-vietnam.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/221-tuvalu.svg b/src/assets/media/flags/221-tuvalu.svg new file mode 100644 index 0000000..871d1de --- /dev/null +++ b/src/assets/media/flags/221-tuvalu.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/222-niger.svg b/src/assets/media/flags/222-niger.svg new file mode 100644 index 0000000..60a73a2 --- /dev/null +++ b/src/assets/media/flags/222-niger.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/223-turks-and-caicos.svg b/src/assets/media/flags/223-turks-and-caicos.svg new file mode 100644 index 0000000..17bfea2 --- /dev/null +++ b/src/assets/media/flags/223-turks-and-caicos.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/224-portugal.svg b/src/assets/media/flags/224-portugal.svg new file mode 100644 index 0000000..f1d2274 --- /dev/null +++ b/src/assets/media/flags/224-portugal.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/225-maldives.svg b/src/assets/media/flags/225-maldives.svg new file mode 100644 index 0000000..1459140 --- /dev/null +++ b/src/assets/media/flags/225-maldives.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/226-united-states.svg b/src/assets/media/flags/226-united-states.svg new file mode 100644 index 0000000..37ff08d --- /dev/null +++ b/src/assets/media/flags/226-united-states.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/227-senegal.svg b/src/assets/media/flags/227-senegal.svg new file mode 100644 index 0000000..43aeda2 --- /dev/null +++ b/src/assets/media/flags/227-senegal.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/228-nauru.svg b/src/assets/media/flags/228-nauru.svg new file mode 100644 index 0000000..e922d0e --- /dev/null +++ b/src/assets/media/flags/228-nauru.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/229-turkmenistan.svg b/src/assets/media/flags/229-turkmenistan.svg new file mode 100644 index 0000000..c130cd7 --- /dev/null +++ b/src/assets/media/flags/229-turkmenistan.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/230-singapore.svg b/src/assets/media/flags/230-singapore.svg new file mode 100644 index 0000000..c1bbe0d --- /dev/null +++ b/src/assets/media/flags/230-singapore.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/231-libya.svg b/src/assets/media/flags/231-libya.svg new file mode 100644 index 0000000..33e2c2f --- /dev/null +++ b/src/assets/media/flags/231-libya.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/232-yemen.svg b/src/assets/media/flags/232-yemen.svg new file mode 100644 index 0000000..dbe7eb0 --- /dev/null +++ b/src/assets/media/flags/232-yemen.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/233-transnistria.svg b/src/assets/media/flags/233-transnistria.svg new file mode 100644 index 0000000..e0439ab --- /dev/null +++ b/src/assets/media/flags/233-transnistria.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/234-australia.svg b/src/assets/media/flags/234-australia.svg new file mode 100644 index 0000000..5001427 --- /dev/null +++ b/src/assets/media/flags/234-australia.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/235-tokelau.svg b/src/assets/media/flags/235-tokelau.svg new file mode 100644 index 0000000..c48108d --- /dev/null +++ b/src/assets/media/flags/235-tokelau.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/236-republic-of-macedonia.svg b/src/assets/media/flags/236-republic-of-macedonia.svg new file mode 100644 index 0000000..5966f94 --- /dev/null +++ b/src/assets/media/flags/236-republic-of-macedonia.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/237-netherlands.svg b/src/assets/media/flags/237-netherlands.svg new file mode 100644 index 0000000..2f71030 --- /dev/null +++ b/src/assets/media/flags/237-netherlands.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/238-thailand.svg b/src/assets/media/flags/238-thailand.svg new file mode 100644 index 0000000..e5dae5c --- /dev/null +++ b/src/assets/media/flags/238-thailand.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/239-montenegro.svg b/src/assets/media/flags/239-montenegro.svg new file mode 100644 index 0000000..bf10070 --- /dev/null +++ b/src/assets/media/flags/239-montenegro.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/240-azores-islands.svg b/src/assets/media/flags/240-azores-islands.svg new file mode 100644 index 0000000..40b29de --- /dev/null +++ b/src/assets/media/flags/240-azores-islands.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/241-st-vincent-and-the-grenadines.svg b/src/assets/media/flags/241-st-vincent-and-the-grenadines.svg new file mode 100644 index 0000000..ffe6fee --- /dev/null +++ b/src/assets/media/flags/241-st-vincent-and-the-grenadines.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/242-madagascar.svg b/src/assets/media/flags/242-madagascar.svg new file mode 100644 index 0000000..7b0360b --- /dev/null +++ b/src/assets/media/flags/242-madagascar.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/243-canada.svg b/src/assets/media/flags/243-canada.svg new file mode 100644 index 0000000..aa6531c --- /dev/null +++ b/src/assets/media/flags/243-canada.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/244-south-sudan.svg b/src/assets/media/flags/244-south-sudan.svg new file mode 100644 index 0000000..ac0a21e --- /dev/null +++ b/src/assets/media/flags/244-south-sudan.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/245-jersey.svg b/src/assets/media/flags/245-jersey.svg new file mode 100644 index 0000000..04130bb --- /dev/null +++ b/src/assets/media/flags/245-jersey.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/246-india.svg b/src/assets/media/flags/246-india.svg new file mode 100644 index 0000000..a9df976 --- /dev/null +++ b/src/assets/media/flags/246-india.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/247-somaliland.svg b/src/assets/media/flags/247-somaliland.svg new file mode 100644 index 0000000..deb11fe --- /dev/null +++ b/src/assets/media/flags/247-somaliland.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/248-russia.svg b/src/assets/media/flags/248-russia.svg new file mode 100644 index 0000000..3fdc382 --- /dev/null +++ b/src/assets/media/flags/248-russia.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/249-democratic-republic-of-congo.svg b/src/assets/media/flags/249-democratic-republic-of-congo.svg new file mode 100644 index 0000000..7fd9cc3 --- /dev/null +++ b/src/assets/media/flags/249-democratic-republic-of-congo.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/250-sint-eustatius.svg b/src/assets/media/flags/250-sint-eustatius.svg new file mode 100644 index 0000000..317526e --- /dev/null +++ b/src/assets/media/flags/250-sint-eustatius.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/251-samoa.svg b/src/assets/media/flags/251-samoa.svg new file mode 100644 index 0000000..1327d3f --- /dev/null +++ b/src/assets/media/flags/251-samoa.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/252-mexico.svg b/src/assets/media/flags/252-mexico.svg new file mode 100644 index 0000000..bf9a058 --- /dev/null +++ b/src/assets/media/flags/252-mexico.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/253-seychelles.svg b/src/assets/media/flags/253-seychelles.svg new file mode 100644 index 0000000..9c48b97 --- /dev/null +++ b/src/assets/media/flags/253-seychelles.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/254-nato.svg b/src/assets/media/flags/254-nato.svg new file mode 100644 index 0000000..f8603fe --- /dev/null +++ b/src/assets/media/flags/254-nato.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/255-brazil.svg b/src/assets/media/flags/255-brazil.svg new file mode 100644 index 0000000..a63534c --- /dev/null +++ b/src/assets/media/flags/255-brazil.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/256-georgia.svg b/src/assets/media/flags/256-georgia.svg new file mode 100644 index 0000000..19aeac1 --- /dev/null +++ b/src/assets/media/flags/256-georgia.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/257-sardinia.svg b/src/assets/media/flags/257-sardinia.svg new file mode 100644 index 0000000..9c122f5 --- /dev/null +++ b/src/assets/media/flags/257-sardinia.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/258-mongolia.svg b/src/assets/media/flags/258-mongolia.svg new file mode 100644 index 0000000..0037448 --- /dev/null +++ b/src/assets/media/flags/258-mongolia.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/259-european-union.svg b/src/assets/media/flags/259-european-union.svg new file mode 100644 index 0000000..76377e8 --- /dev/null +++ b/src/assets/media/flags/259-european-union.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/260-united-kingdom.svg b/src/assets/media/flags/260-united-kingdom.svg new file mode 100644 index 0000000..bab1dbd --- /dev/null +++ b/src/assets/media/flags/260-united-kingdom.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/261-kiribati.svg b/src/assets/media/flags/261-kiribati.svg new file mode 100644 index 0000000..700fa69 --- /dev/null +++ b/src/assets/media/flags/261-kiribati.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/flags/262-hawaii.svg b/src/assets/media/flags/262-hawaii.svg new file mode 100644 index 0000000..4955f12 --- /dev/null +++ b/src/assets/media/flags/262-hawaii.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/icons/exchange.svg b/src/assets/media/icons/exchange.svg new file mode 100644 index 0000000..33d29c1 --- /dev/null +++ b/src/assets/media/icons/exchange.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/icons/logout.svg b/src/assets/media/icons/logout.svg new file mode 100644 index 0000000..73ae8c6 --- /dev/null +++ b/src/assets/media/icons/logout.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/icons/question.svg b/src/assets/media/icons/question.svg new file mode 100644 index 0000000..9e0ad4e --- /dev/null +++ b/src/assets/media/icons/question.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/icons/svg/Clothes/Brassiere.svg b/src/assets/media/icons/svg/Clothes/Brassiere.svg new file mode 100644 index 0000000..ecd0299 --- /dev/null +++ b/src/assets/media/icons/svg/Clothes/Brassiere.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Clothes / Brassiere + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Clothes/Briefcase.svg b/src/assets/media/icons/svg/Clothes/Briefcase.svg new file mode 100644 index 0000000..cea9c6c --- /dev/null +++ b/src/assets/media/icons/svg/Clothes/Briefcase.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Clothes / Briefcase + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Clothes/Cap.svg b/src/assets/media/icons/svg/Clothes/Cap.svg new file mode 100644 index 0000000..0720eb0 --- /dev/null +++ b/src/assets/media/icons/svg/Clothes/Cap.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Clothes / Cap + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Clothes/Crown.svg b/src/assets/media/icons/svg/Clothes/Crown.svg new file mode 100644 index 0000000..2352b32 --- /dev/null +++ b/src/assets/media/icons/svg/Clothes/Crown.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Clothes / Crown + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Clothes/Dress.svg b/src/assets/media/icons/svg/Clothes/Dress.svg new file mode 100644 index 0000000..1a646f7 --- /dev/null +++ b/src/assets/media/icons/svg/Clothes/Dress.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Clothes / Dress + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Clothes/Hanger.svg b/src/assets/media/icons/svg/Clothes/Hanger.svg new file mode 100644 index 0000000..0814b21 --- /dev/null +++ b/src/assets/media/icons/svg/Clothes/Hanger.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Clothes / Hanger + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Clothes/Hat.svg b/src/assets/media/icons/svg/Clothes/Hat.svg new file mode 100644 index 0000000..6653f4f --- /dev/null +++ b/src/assets/media/icons/svg/Clothes/Hat.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Clothes / Hat + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Clothes/Panties.svg b/src/assets/media/icons/svg/Clothes/Panties.svg new file mode 100644 index 0000000..0c5af28 --- /dev/null +++ b/src/assets/media/icons/svg/Clothes/Panties.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Clothes / Panties + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Clothes/Shirt.svg b/src/assets/media/icons/svg/Clothes/Shirt.svg new file mode 100644 index 0000000..1938540 --- /dev/null +++ b/src/assets/media/icons/svg/Clothes/Shirt.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Clothes / Shirt + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Clothes/Shoes.svg b/src/assets/media/icons/svg/Clothes/Shoes.svg new file mode 100644 index 0000000..8bfa9d4 --- /dev/null +++ b/src/assets/media/icons/svg/Clothes/Shoes.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Clothes / Shoes + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Clothes/Shorts.svg b/src/assets/media/icons/svg/Clothes/Shorts.svg new file mode 100644 index 0000000..300f44a --- /dev/null +++ b/src/assets/media/icons/svg/Clothes/Shorts.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Clothes / Shorts + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Clothes/Sneakers.svg b/src/assets/media/icons/svg/Clothes/Sneakers.svg new file mode 100644 index 0000000..65b90be --- /dev/null +++ b/src/assets/media/icons/svg/Clothes/Sneakers.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Clothes / Sneakers + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Clothes/Socks.svg b/src/assets/media/icons/svg/Clothes/Socks.svg new file mode 100644 index 0000000..f755c6e --- /dev/null +++ b/src/assets/media/icons/svg/Clothes/Socks.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Clothes / Socks + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Clothes/Sun-glasses.svg b/src/assets/media/icons/svg/Clothes/Sun-glasses.svg new file mode 100644 index 0000000..fd423d0 --- /dev/null +++ b/src/assets/media/icons/svg/Clothes/Sun-glasses.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Clothes / Sun-glasses + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Clothes/T-Shirt.svg b/src/assets/media/icons/svg/Clothes/T-Shirt.svg new file mode 100644 index 0000000..178c472 --- /dev/null +++ b/src/assets/media/icons/svg/Clothes/T-Shirt.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Clothes / T-Shirt + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Clothes/Tie.svg b/src/assets/media/icons/svg/Clothes/Tie.svg new file mode 100644 index 0000000..e6d1d19 --- /dev/null +++ b/src/assets/media/icons/svg/Clothes/Tie.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Clothes / Tie + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Backspace.svg b/src/assets/media/icons/svg/Code/Backspace.svg new file mode 100644 index 0000000..511d12b --- /dev/null +++ b/src/assets/media/icons/svg/Code/Backspace.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Code / Backspace + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/CMD.svg b/src/assets/media/icons/svg/Code/CMD.svg new file mode 100644 index 0000000..ab70255 --- /dev/null +++ b/src/assets/media/icons/svg/Code/CMD.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Code / CMD + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Code.svg b/src/assets/media/icons/svg/Code/Code.svg new file mode 100644 index 0000000..49cc79d --- /dev/null +++ b/src/assets/media/icons/svg/Code/Code.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Code / Code + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Commit.svg b/src/assets/media/icons/svg/Code/Commit.svg new file mode 100644 index 0000000..a6af176 --- /dev/null +++ b/src/assets/media/icons/svg/Code/Commit.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Code / Commit + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Compiling.svg b/src/assets/media/icons/svg/Code/Compiling.svg new file mode 100644 index 0000000..ee46047 --- /dev/null +++ b/src/assets/media/icons/svg/Code/Compiling.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Code / Compiling + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Control.svg b/src/assets/media/icons/svg/Code/Control.svg new file mode 100644 index 0000000..f8489bc --- /dev/null +++ b/src/assets/media/icons/svg/Code/Control.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Code / Control + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Done-circle.svg b/src/assets/media/icons/svg/Code/Done-circle.svg new file mode 100644 index 0000000..3b35045 --- /dev/null +++ b/src/assets/media/icons/svg/Code/Done-circle.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Code / Done-circle + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Error-circle.svg b/src/assets/media/icons/svg/Code/Error-circle.svg new file mode 100644 index 0000000..79993c7 --- /dev/null +++ b/src/assets/media/icons/svg/Code/Error-circle.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Code / Error-circle + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Git1.svg b/src/assets/media/icons/svg/Code/Git1.svg new file mode 100644 index 0000000..281ec24 --- /dev/null +++ b/src/assets/media/icons/svg/Code/Git1.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Code / Git1 + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Git2.svg b/src/assets/media/icons/svg/Code/Git2.svg new file mode 100644 index 0000000..ce6334f --- /dev/null +++ b/src/assets/media/icons/svg/Code/Git2.svg @@ -0,0 +1,16 @@ + + + + Stockholm-icons / Code / Git2 + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Git3.svg b/src/assets/media/icons/svg/Code/Git3.svg new file mode 100644 index 0000000..f5617f9 --- /dev/null +++ b/src/assets/media/icons/svg/Code/Git3.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Code / Git3 + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Git4.svg b/src/assets/media/icons/svg/Code/Git4.svg new file mode 100644 index 0000000..85e0a1e --- /dev/null +++ b/src/assets/media/icons/svg/Code/Git4.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Code / Git4 + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Github.svg b/src/assets/media/icons/svg/Code/Github.svg new file mode 100644 index 0000000..6bf4683 --- /dev/null +++ b/src/assets/media/icons/svg/Code/Github.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Code / Github + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Info-circle.svg b/src/assets/media/icons/svg/Code/Info-circle.svg new file mode 100644 index 0000000..4ed6cc0 --- /dev/null +++ b/src/assets/media/icons/svg/Code/Info-circle.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Code / Info-circle + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Left-circle.svg b/src/assets/media/icons/svg/Code/Left-circle.svg new file mode 100644 index 0000000..018c582 --- /dev/null +++ b/src/assets/media/icons/svg/Code/Left-circle.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Code / Left-circle + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Loading.svg b/src/assets/media/icons/svg/Code/Loading.svg new file mode 100644 index 0000000..cac3340 --- /dev/null +++ b/src/assets/media/icons/svg/Code/Loading.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Code / Loading + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Lock-circle.svg b/src/assets/media/icons/svg/Code/Lock-circle.svg new file mode 100644 index 0000000..0e3760a --- /dev/null +++ b/src/assets/media/icons/svg/Code/Lock-circle.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Code / Lock-circle + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Lock-overturning.svg b/src/assets/media/icons/svg/Code/Lock-overturning.svg new file mode 100644 index 0000000..844ddd0 --- /dev/null +++ b/src/assets/media/icons/svg/Code/Lock-overturning.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Code / Lock-overturning + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Minus.svg b/src/assets/media/icons/svg/Code/Minus.svg new file mode 100644 index 0000000..17f74d6 --- /dev/null +++ b/src/assets/media/icons/svg/Code/Minus.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Code / Minus + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Option.svg b/src/assets/media/icons/svg/Code/Option.svg new file mode 100644 index 0000000..438a225 --- /dev/null +++ b/src/assets/media/icons/svg/Code/Option.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Code / Option + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Plus.svg b/src/assets/media/icons/svg/Code/Plus.svg new file mode 100644 index 0000000..3b56e9e --- /dev/null +++ b/src/assets/media/icons/svg/Code/Plus.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Code / Plus + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Puzzle.svg b/src/assets/media/icons/svg/Code/Puzzle.svg new file mode 100644 index 0000000..06de4ab --- /dev/null +++ b/src/assets/media/icons/svg/Code/Puzzle.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Code / Puzzle + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Question-circle.svg b/src/assets/media/icons/svg/Code/Question-circle.svg new file mode 100644 index 0000000..cd43f83 --- /dev/null +++ b/src/assets/media/icons/svg/Code/Question-circle.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Code / Question-circle + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Right-circle.svg b/src/assets/media/icons/svg/Code/Right-circle.svg new file mode 100644 index 0000000..ec90fc6 --- /dev/null +++ b/src/assets/media/icons/svg/Code/Right-circle.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Code / Right-circle + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Settings4.svg b/src/assets/media/icons/svg/Code/Settings4.svg new file mode 100644 index 0000000..b49cdee --- /dev/null +++ b/src/assets/media/icons/svg/Code/Settings4.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Code / Settings4 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Shift.svg b/src/assets/media/icons/svg/Code/Shift.svg new file mode 100644 index 0000000..7deaa17 --- /dev/null +++ b/src/assets/media/icons/svg/Code/Shift.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Code / Shift + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Spy.svg b/src/assets/media/icons/svg/Code/Spy.svg new file mode 100644 index 0000000..27cbced --- /dev/null +++ b/src/assets/media/icons/svg/Code/Spy.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Code / Spy + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Stop.svg b/src/assets/media/icons/svg/Code/Stop.svg new file mode 100644 index 0000000..42e511b --- /dev/null +++ b/src/assets/media/icons/svg/Code/Stop.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Code / Stop + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Terminal.svg b/src/assets/media/icons/svg/Code/Terminal.svg new file mode 100644 index 0000000..83e6859 --- /dev/null +++ b/src/assets/media/icons/svg/Code/Terminal.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Code / Terminal + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Thunder-circle.svg b/src/assets/media/icons/svg/Code/Thunder-circle.svg new file mode 100644 index 0000000..f2b54b5 --- /dev/null +++ b/src/assets/media/icons/svg/Code/Thunder-circle.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Code / Thunder-circle + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Time-schedule.svg b/src/assets/media/icons/svg/Code/Time-schedule.svg new file mode 100644 index 0000000..0bd36a0 --- /dev/null +++ b/src/assets/media/icons/svg/Code/Time-schedule.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Code / Time-schedule + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Warning-1-circle.svg b/src/assets/media/icons/svg/Code/Warning-1-circle.svg new file mode 100644 index 0000000..953161f --- /dev/null +++ b/src/assets/media/icons/svg/Code/Warning-1-circle.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Code / Warning-1-circle + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Code/Warning-2.svg b/src/assets/media/icons/svg/Code/Warning-2.svg new file mode 100644 index 0000000..4de1035 --- /dev/null +++ b/src/assets/media/icons/svg/Code/Warning-2.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Code / Warning-2 + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Active-call.svg b/src/assets/media/icons/svg/Communication/Active-call.svg new file mode 100644 index 0000000..2b8a27e --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Active-call.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Active-call + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Add-user.svg b/src/assets/media/icons/svg/Communication/Add-user.svg new file mode 100644 index 0000000..ce59086 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Add-user.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Add-user + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Address-card.svg b/src/assets/media/icons/svg/Communication/Address-card.svg new file mode 100644 index 0000000..702ad3a --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Address-card.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Communication / Address-card + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Adress-book1.svg b/src/assets/media/icons/svg/Communication/Adress-book1.svg new file mode 100644 index 0000000..07c5761 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Adress-book1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Adress-book1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Adress-book2.svg b/src/assets/media/icons/svg/Communication/Adress-book2.svg new file mode 100644 index 0000000..403077d --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Adress-book2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Adress-book2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Archive.svg b/src/assets/media/icons/svg/Communication/Archive.svg new file mode 100644 index 0000000..489fbaa --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Archive.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Communication / Archive + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Call#1.svg b/src/assets/media/icons/svg/Communication/Call#1.svg new file mode 100644 index 0000000..1c0a8ae --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Call#1.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Communication / Call#1 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Call.svg b/src/assets/media/icons/svg/Communication/Call.svg new file mode 100644 index 0000000..a72e565 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Call.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Communication / Call + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Chat-check.svg b/src/assets/media/icons/svg/Communication/Chat-check.svg new file mode 100644 index 0000000..87e3852 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Chat-check.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Chat-check + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Chat-error.svg b/src/assets/media/icons/svg/Communication/Chat-error.svg new file mode 100644 index 0000000..3486a06 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Chat-error.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Chat-error + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Chat-locked.svg b/src/assets/media/icons/svg/Communication/Chat-locked.svg new file mode 100644 index 0000000..026375b --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Chat-locked.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Chat-locked + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Chat-smile.svg b/src/assets/media/icons/svg/Communication/Chat-smile.svg new file mode 100644 index 0000000..d078cc5 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Chat-smile.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Chat-smile + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Chat1.svg b/src/assets/media/icons/svg/Communication/Chat1.svg new file mode 100644 index 0000000..1fbe327 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Chat1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Chat1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Chat2.svg b/src/assets/media/icons/svg/Communication/Chat2.svg new file mode 100644 index 0000000..a0b638a --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Chat2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Chat2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Chat4.svg b/src/assets/media/icons/svg/Communication/Chat4.svg new file mode 100644 index 0000000..19e82e8 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Chat4.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Communication / Chat4 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Chat5.svg b/src/assets/media/icons/svg/Communication/Chat5.svg new file mode 100644 index 0000000..e672269 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Chat5.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Chat5 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Chat6.svg b/src/assets/media/icons/svg/Communication/Chat6.svg new file mode 100644 index 0000000..d8143dd --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Chat6.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Chat6 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Clipboard-check.svg b/src/assets/media/icons/svg/Communication/Clipboard-check.svg new file mode 100644 index 0000000..fdea7dd --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Clipboard-check.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Communication / Clipboard-check + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Clipboard-list.svg b/src/assets/media/icons/svg/Communication/Clipboard-list.svg new file mode 100644 index 0000000..3b1c24c --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Clipboard-list.svg @@ -0,0 +1,18 @@ + + + + Stockholm-icons / Communication / Clipboard-list + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Contact1.svg b/src/assets/media/icons/svg/Communication/Contact1.svg new file mode 100644 index 0000000..018de01 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Contact1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Contact1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Delete-user.svg b/src/assets/media/icons/svg/Communication/Delete-user.svg new file mode 100644 index 0000000..ae6c0a5 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Delete-user.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Delete-user + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Dial-numbers.svg b/src/assets/media/icons/svg/Communication/Dial-numbers.svg new file mode 100644 index 0000000..9815820 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Dial-numbers.svg @@ -0,0 +1,19 @@ + + + + Stockholm-icons / Communication / Dial-numbers + Created with Sketch. + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Flag.svg b/src/assets/media/icons/svg/Communication/Flag.svg new file mode 100644 index 0000000..dcb4b76 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Flag.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Flag + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Forward.svg b/src/assets/media/icons/svg/Communication/Forward.svg new file mode 100644 index 0000000..1313b78 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Forward.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Communication / Forward + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Group-chat.svg b/src/assets/media/icons/svg/Communication/Group-chat.svg new file mode 100644 index 0000000..46111b8 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Group-chat.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Group-chat + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Group.svg b/src/assets/media/icons/svg/Communication/Group.svg new file mode 100644 index 0000000..fdfe613 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Group.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Group + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Incoming-box.svg b/src/assets/media/icons/svg/Communication/Incoming-box.svg new file mode 100644 index 0000000..7c31a89 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Incoming-box.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Communication / Incoming-box + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Incoming-call.svg b/src/assets/media/icons/svg/Communication/Incoming-call.svg new file mode 100644 index 0000000..c8a92d7 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Incoming-call.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Incoming-call + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Incoming-mail.svg b/src/assets/media/icons/svg/Communication/Incoming-mail.svg new file mode 100644 index 0000000..2a569a7 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Incoming-mail.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Incoming-mail + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Mail-at.svg b/src/assets/media/icons/svg/Communication/Mail-at.svg new file mode 100644 index 0000000..ecaeaf7 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Mail-at.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Communication / Mail-at + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Mail-attachment.svg b/src/assets/media/icons/svg/Communication/Mail-attachment.svg new file mode 100644 index 0000000..19c24e0 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Mail-attachment.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Mail-attachment + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Mail-box.svg b/src/assets/media/icons/svg/Communication/Mail-box.svg new file mode 100644 index 0000000..13ad99a --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Mail-box.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Mail-box + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Mail-error.svg b/src/assets/media/icons/svg/Communication/Mail-error.svg new file mode 100644 index 0000000..4ec6109 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Mail-error.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Mail-error + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Mail-heart.svg b/src/assets/media/icons/svg/Communication/Mail-heart.svg new file mode 100644 index 0000000..713f2ea --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Mail-heart.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Mail-heart + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Mail-locked.svg b/src/assets/media/icons/svg/Communication/Mail-locked.svg new file mode 100644 index 0000000..0420cfa --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Mail-locked.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Mail-locked + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Mail-notification.svg b/src/assets/media/icons/svg/Communication/Mail-notification.svg new file mode 100644 index 0000000..19648f2 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Mail-notification.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Mail-notification + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Mail-opened.svg b/src/assets/media/icons/svg/Communication/Mail-opened.svg new file mode 100644 index 0000000..38db76b --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Mail-opened.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Mail-opened + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Mail-unocked.svg b/src/assets/media/icons/svg/Communication/Mail-unocked.svg new file mode 100644 index 0000000..d156cc5 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Mail-unocked.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Mail-unocked + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Mail.svg b/src/assets/media/icons/svg/Communication/Mail.svg new file mode 100644 index 0000000..a2f3070 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Mail.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Communication / Mail + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Missed-call.svg b/src/assets/media/icons/svg/Communication/Missed-call.svg new file mode 100644 index 0000000..11b8ef4 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Missed-call.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Missed-call + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Outgoing-box.svg b/src/assets/media/icons/svg/Communication/Outgoing-box.svg new file mode 100644 index 0000000..cbd6c1f --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Outgoing-box.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Communication / Outgoing-box + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Outgoing-call.svg b/src/assets/media/icons/svg/Communication/Outgoing-call.svg new file mode 100644 index 0000000..e509b38 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Outgoing-call.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Outgoing-call + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Outgoing-mail.svg b/src/assets/media/icons/svg/Communication/Outgoing-mail.svg new file mode 100644 index 0000000..d59afde --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Outgoing-mail.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Outgoing-mail + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/RSS.svg b/src/assets/media/icons/svg/Communication/RSS.svg new file mode 100644 index 0000000..3362d08 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/RSS.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Communication / RSS + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Readed-mail.svg b/src/assets/media/icons/svg/Communication/Readed-mail.svg new file mode 100644 index 0000000..81e1199 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Readed-mail.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Readed-mail + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Reply-all.svg b/src/assets/media/icons/svg/Communication/Reply-all.svg new file mode 100644 index 0000000..b082d94 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Reply-all.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Reply-all + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Reply.svg b/src/assets/media/icons/svg/Communication/Reply.svg new file mode 100644 index 0000000..2732144 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Reply.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Communication / Reply + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Right.svg b/src/assets/media/icons/svg/Communication/Right.svg new file mode 100644 index 0000000..fc0dd89 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Right.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Communication / Right + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Safe-chat.svg b/src/assets/media/icons/svg/Communication/Safe-chat.svg new file mode 100644 index 0000000..f9e5d5f --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Safe-chat.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Safe-chat + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Send.svg b/src/assets/media/icons/svg/Communication/Send.svg new file mode 100644 index 0000000..3e0e3fd --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Send.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Communication / Send + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Sending mail.svg b/src/assets/media/icons/svg/Communication/Sending mail.svg new file mode 100644 index 0000000..6f5a539 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Sending mail.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Sending mail + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Sending.svg b/src/assets/media/icons/svg/Communication/Sending.svg new file mode 100644 index 0000000..602b2cb --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Sending.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Sending + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Share.svg b/src/assets/media/icons/svg/Communication/Share.svg new file mode 100644 index 0000000..433e0d3 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Share.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Share + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Shield-thunder.svg b/src/assets/media/icons/svg/Communication/Shield-thunder.svg new file mode 100644 index 0000000..e98381e --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Shield-thunder.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Shield-thunder + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Shield-user.svg b/src/assets/media/icons/svg/Communication/Shield-user.svg new file mode 100644 index 0000000..e9e2bb5 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Shield-user.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Communication / Shield-user + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Snoozed-mail.svg b/src/assets/media/icons/svg/Communication/Snoozed-mail.svg new file mode 100644 index 0000000..e4c8fa8 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Snoozed-mail.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Snoozed-mail + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Spam.svg b/src/assets/media/icons/svg/Communication/Spam.svg new file mode 100644 index 0000000..5e59e7e --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Spam.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Communication / Spam + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Thumbtack.svg b/src/assets/media/icons/svg/Communication/Thumbtack.svg new file mode 100644 index 0000000..debb7ec --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Thumbtack.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Thumbtack + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Urgent-mail.svg b/src/assets/media/icons/svg/Communication/Urgent-mail.svg new file mode 100644 index 0000000..55befb2 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Urgent-mail.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Urgent-mail + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Communication/Write.svg b/src/assets/media/icons/svg/Communication/Write.svg new file mode 100644 index 0000000..a9625d3 --- /dev/null +++ b/src/assets/media/icons/svg/Communication/Write.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Communication / Write + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Cooking/Baking-glove.svg b/src/assets/media/icons/svg/Cooking/Baking-glove.svg new file mode 100644 index 0000000..3ead821 --- /dev/null +++ b/src/assets/media/icons/svg/Cooking/Baking-glove.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Cooking / Baking-glove + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Cooking/Bowl.svg b/src/assets/media/icons/svg/Cooking/Bowl.svg new file mode 100644 index 0000000..a7b1d42 --- /dev/null +++ b/src/assets/media/icons/svg/Cooking/Bowl.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Cooking / Bowl + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Cooking/Chef.svg b/src/assets/media/icons/svg/Cooking/Chef.svg new file mode 100644 index 0000000..8e37300 --- /dev/null +++ b/src/assets/media/icons/svg/Cooking/Chef.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Cooking / Chef + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Cooking/Cooking-book.svg b/src/assets/media/icons/svg/Cooking/Cooking-book.svg new file mode 100644 index 0000000..2558f8c --- /dev/null +++ b/src/assets/media/icons/svg/Cooking/Cooking-book.svg @@ -0,0 +1,17 @@ + + + + Stockholm-icons / Cooking / Cooking-book + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Cooking/Cooking-pot.svg b/src/assets/media/icons/svg/Cooking/Cooking-pot.svg new file mode 100644 index 0000000..979ce96 --- /dev/null +++ b/src/assets/media/icons/svg/Cooking/Cooking-pot.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Cooking / Cooking-pot + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Cooking/Cutting board.svg b/src/assets/media/icons/svg/Cooking/Cutting board.svg new file mode 100644 index 0000000..c36eb2c --- /dev/null +++ b/src/assets/media/icons/svg/Cooking/Cutting board.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Cooking / Cutting board + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Cooking/Dinner.svg b/src/assets/media/icons/svg/Cooking/Dinner.svg new file mode 100644 index 0000000..180fde8 --- /dev/null +++ b/src/assets/media/icons/svg/Cooking/Dinner.svg @@ -0,0 +1,15 @@ + + + + Stockholm-icons / Cooking / Dinner + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Cooking/Dish.svg b/src/assets/media/icons/svg/Cooking/Dish.svg new file mode 100644 index 0000000..9231008 --- /dev/null +++ b/src/assets/media/icons/svg/Cooking/Dish.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Cooking / Dish + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Cooking/Dishes.svg b/src/assets/media/icons/svg/Cooking/Dishes.svg new file mode 100644 index 0000000..c4da220 --- /dev/null +++ b/src/assets/media/icons/svg/Cooking/Dishes.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Cooking / Dishes + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Cooking/Fork-spoon-knife.svg b/src/assets/media/icons/svg/Cooking/Fork-spoon-knife.svg new file mode 100644 index 0000000..5a38279 --- /dev/null +++ b/src/assets/media/icons/svg/Cooking/Fork-spoon-knife.svg @@ -0,0 +1,16 @@ + + + + Stockholm-icons / Cooking / Fork-spoon-knife + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Cooking/Fork-spoon.svg b/src/assets/media/icons/svg/Cooking/Fork-spoon.svg new file mode 100644 index 0000000..4e6bca1 --- /dev/null +++ b/src/assets/media/icons/svg/Cooking/Fork-spoon.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Cooking / Fork-spoon + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Cooking/Fork.svg b/src/assets/media/icons/svg/Cooking/Fork.svg new file mode 100644 index 0000000..0467ce5 --- /dev/null +++ b/src/assets/media/icons/svg/Cooking/Fork.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Cooking / Fork + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Cooking/Frying-pan.svg b/src/assets/media/icons/svg/Cooking/Frying-pan.svg new file mode 100644 index 0000000..845e227 --- /dev/null +++ b/src/assets/media/icons/svg/Cooking/Frying-pan.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Cooking / Frying-pan + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Cooking/Grater.svg b/src/assets/media/icons/svg/Cooking/Grater.svg new file mode 100644 index 0000000..582d123 --- /dev/null +++ b/src/assets/media/icons/svg/Cooking/Grater.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Cooking / Grater + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Cooking/Kitchen-scale.svg b/src/assets/media/icons/svg/Cooking/Kitchen-scale.svg new file mode 100644 index 0000000..3fb94c9 --- /dev/null +++ b/src/assets/media/icons/svg/Cooking/Kitchen-scale.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Cooking / Kitchen-scale + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Cooking/Knife1.svg b/src/assets/media/icons/svg/Cooking/Knife1.svg new file mode 100644 index 0000000..66c7c0e --- /dev/null +++ b/src/assets/media/icons/svg/Cooking/Knife1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Cooking / Knife1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Cooking/Knife2.svg b/src/assets/media/icons/svg/Cooking/Knife2.svg new file mode 100644 index 0000000..0aa9546 --- /dev/null +++ b/src/assets/media/icons/svg/Cooking/Knife2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Cooking / Knife2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Cooking/KnifeAndFork1.svg b/src/assets/media/icons/svg/Cooking/KnifeAndFork1.svg new file mode 100644 index 0000000..aa7604a --- /dev/null +++ b/src/assets/media/icons/svg/Cooking/KnifeAndFork1.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Cooking / Knife&fork#1 + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Cooking/KnifeAndFork2.svg b/src/assets/media/icons/svg/Cooking/KnifeAndFork2.svg new file mode 100644 index 0000000..dfedd2a --- /dev/null +++ b/src/assets/media/icons/svg/Cooking/KnifeAndFork2.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Cooking / Knife&fork#2 + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Cooking/Ladle.svg b/src/assets/media/icons/svg/Cooking/Ladle.svg new file mode 100644 index 0000000..0d3fcaa --- /dev/null +++ b/src/assets/media/icons/svg/Cooking/Ladle.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Cooking / Ladle + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Cooking/Rolling-pin.svg b/src/assets/media/icons/svg/Cooking/Rolling-pin.svg new file mode 100644 index 0000000..2192098 --- /dev/null +++ b/src/assets/media/icons/svg/Cooking/Rolling-pin.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Cooking / Rolling-pin + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Cooking/Saucepan.svg b/src/assets/media/icons/svg/Cooking/Saucepan.svg new file mode 100644 index 0000000..da8c048 --- /dev/null +++ b/src/assets/media/icons/svg/Cooking/Saucepan.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Cooking / Saucepan + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Cooking/Shovel.svg b/src/assets/media/icons/svg/Cooking/Shovel.svg new file mode 100644 index 0000000..9256088 --- /dev/null +++ b/src/assets/media/icons/svg/Cooking/Shovel.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Cooking / Shovel + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Cooking/Sieve.svg b/src/assets/media/icons/svg/Cooking/Sieve.svg new file mode 100644 index 0000000..21db736 --- /dev/null +++ b/src/assets/media/icons/svg/Cooking/Sieve.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Cooking / Sieve + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Cooking/Spoon.svg b/src/assets/media/icons/svg/Cooking/Spoon.svg new file mode 100644 index 0000000..f26e54f --- /dev/null +++ b/src/assets/media/icons/svg/Cooking/Spoon.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Cooking / Spoon + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Adjust.svg b/src/assets/media/icons/svg/Design/Adjust.svg new file mode 100644 index 0000000..53f23ca --- /dev/null +++ b/src/assets/media/icons/svg/Design/Adjust.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Design / Adjust + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Anchor-center-down.svg b/src/assets/media/icons/svg/Design/Anchor-center-down.svg new file mode 100644 index 0000000..e91f1be --- /dev/null +++ b/src/assets/media/icons/svg/Design/Anchor-center-down.svg @@ -0,0 +1,15 @@ + + + + Stockholm-icons / Design / Anchor-center-down + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Anchor-center-up.svg b/src/assets/media/icons/svg/Design/Anchor-center-up.svg new file mode 100644 index 0000000..dce428c --- /dev/null +++ b/src/assets/media/icons/svg/Design/Anchor-center-up.svg @@ -0,0 +1,15 @@ + + + + Stockholm-icons / Design / Anchor-center-up + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Anchor-center.svg b/src/assets/media/icons/svg/Design/Anchor-center.svg new file mode 100644 index 0000000..1b601a4 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Anchor-center.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Anchor-center + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Anchor-left-down.svg b/src/assets/media/icons/svg/Design/Anchor-left-down.svg new file mode 100644 index 0000000..4cd589b --- /dev/null +++ b/src/assets/media/icons/svg/Design/Anchor-left-down.svg @@ -0,0 +1,15 @@ + + + + Stockholm-icons / Design / Anchor-left-down + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Anchor-left-up.svg b/src/assets/media/icons/svg/Design/Anchor-left-up.svg new file mode 100644 index 0000000..ec61959 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Anchor-left-up.svg @@ -0,0 +1,15 @@ + + + + Stockholm-icons / Design / Anchor-left-up + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Anchor-left.svg b/src/assets/media/icons/svg/Design/Anchor-left.svg new file mode 100644 index 0000000..30caee5 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Anchor-left.svg @@ -0,0 +1,15 @@ + + + + Stockholm-icons / Design / Anchor-left + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Anchor-right-down.svg b/src/assets/media/icons/svg/Design/Anchor-right-down.svg new file mode 100644 index 0000000..2bf3f76 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Anchor-right-down.svg @@ -0,0 +1,15 @@ + + + + Stockholm-icons / Design / Anchor-right-down + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Anchor-right-up.svg b/src/assets/media/icons/svg/Design/Anchor-right-up.svg new file mode 100644 index 0000000..81a01be --- /dev/null +++ b/src/assets/media/icons/svg/Design/Anchor-right-up.svg @@ -0,0 +1,15 @@ + + + + Stockholm-icons / Design / Anchor-right-up + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Anchor-right.svg b/src/assets/media/icons/svg/Design/Anchor-right.svg new file mode 100644 index 0000000..05f1bd6 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Anchor-right.svg @@ -0,0 +1,15 @@ + + + + Stockholm-icons / Design / Anchor-right + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Arrows.svg b/src/assets/media/icons/svg/Design/Arrows.svg new file mode 100644 index 0000000..a914f8d --- /dev/null +++ b/src/assets/media/icons/svg/Design/Arrows.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Arrows + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Bezier-curve.svg b/src/assets/media/icons/svg/Design/Bezier-curve.svg new file mode 100644 index 0000000..d7603d4 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Bezier-curve.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Bezier-curve + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Border.svg b/src/assets/media/icons/svg/Design/Border.svg new file mode 100644 index 0000000..e957a7e --- /dev/null +++ b/src/assets/media/icons/svg/Design/Border.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Design / Border + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Brush.svg b/src/assets/media/icons/svg/Design/Brush.svg new file mode 100644 index 0000000..92b97c4 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Brush.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Brush + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Bucket.svg b/src/assets/media/icons/svg/Design/Bucket.svg new file mode 100644 index 0000000..16d2d98 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Bucket.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Bucket + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Cap-1.svg b/src/assets/media/icons/svg/Design/Cap-1.svg new file mode 100644 index 0000000..f2ce285 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Cap-1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Cap-1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Cap-2.svg b/src/assets/media/icons/svg/Design/Cap-2.svg new file mode 100644 index 0000000..b08b0af --- /dev/null +++ b/src/assets/media/icons/svg/Design/Cap-2.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Design / Cap-2 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Cap-3.svg b/src/assets/media/icons/svg/Design/Cap-3.svg new file mode 100644 index 0000000..bf0edd2 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Cap-3.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Cap-3 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Circle.svg b/src/assets/media/icons/svg/Design/Circle.svg new file mode 100644 index 0000000..f74a5b8 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Circle.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Design / Circle + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Color-profile.svg b/src/assets/media/icons/svg/Design/Color-profile.svg new file mode 100644 index 0000000..23e72de --- /dev/null +++ b/src/assets/media/icons/svg/Design/Color-profile.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Color-profile + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Color.svg b/src/assets/media/icons/svg/Design/Color.svg new file mode 100644 index 0000000..f81e0ed --- /dev/null +++ b/src/assets/media/icons/svg/Design/Color.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Design / Color + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Component.svg b/src/assets/media/icons/svg/Design/Component.svg new file mode 100644 index 0000000..c99966d --- /dev/null +++ b/src/assets/media/icons/svg/Design/Component.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Design / Component + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Crop.svg b/src/assets/media/icons/svg/Design/Crop.svg new file mode 100644 index 0000000..a113901 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Crop.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Crop + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Difference.svg b/src/assets/media/icons/svg/Design/Difference.svg new file mode 100644 index 0000000..c536884 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Difference.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Difference + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Edit.svg b/src/assets/media/icons/svg/Design/Edit.svg new file mode 100644 index 0000000..1826d13 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Edit.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Edit + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Eraser.svg b/src/assets/media/icons/svg/Design/Eraser.svg new file mode 100644 index 0000000..79d22ca --- /dev/null +++ b/src/assets/media/icons/svg/Design/Eraser.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Design / Eraser + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Flatten.svg b/src/assets/media/icons/svg/Design/Flatten.svg new file mode 100644 index 0000000..e6c2158 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Flatten.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Flatten + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Flip-horizontal.svg b/src/assets/media/icons/svg/Design/Flip-horizontal.svg new file mode 100644 index 0000000..908c63c --- /dev/null +++ b/src/assets/media/icons/svg/Design/Flip-horizontal.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Design / Flip-horizontal + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Flip-vertical.svg b/src/assets/media/icons/svg/Design/Flip-vertical.svg new file mode 100644 index 0000000..7831b95 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Flip-vertical.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Design / Flip-vertical + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Horizontal.svg b/src/assets/media/icons/svg/Design/Horizontal.svg new file mode 100644 index 0000000..eb27032 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Horizontal.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Horizontal + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Image.svg b/src/assets/media/icons/svg/Design/Image.svg new file mode 100644 index 0000000..6f8af09 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Image.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Design / Image + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Interselect.svg b/src/assets/media/icons/svg/Design/Interselect.svg new file mode 100644 index 0000000..09a289f --- /dev/null +++ b/src/assets/media/icons/svg/Design/Interselect.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Interselect + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Join-1.svg b/src/assets/media/icons/svg/Design/Join-1.svg new file mode 100644 index 0000000..0fc8358 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Join-1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Join-1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Join-2.svg b/src/assets/media/icons/svg/Design/Join-2.svg new file mode 100644 index 0000000..21882f7 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Join-2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Join-2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Join-3.svg b/src/assets/media/icons/svg/Design/Join-3.svg new file mode 100644 index 0000000..4340135 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Join-3.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Join-3 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Layers.svg b/src/assets/media/icons/svg/Design/Layers.svg new file mode 100644 index 0000000..950c52c --- /dev/null +++ b/src/assets/media/icons/svg/Design/Layers.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Layers + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Line.svg b/src/assets/media/icons/svg/Design/Line.svg new file mode 100644 index 0000000..722b804 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Line.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Design / Line + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Magic.svg b/src/assets/media/icons/svg/Design/Magic.svg new file mode 100644 index 0000000..f109b18 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Magic.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Magic + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Mask.svg b/src/assets/media/icons/svg/Design/Mask.svg new file mode 100644 index 0000000..6c4d612 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Mask.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Mask + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Patch.svg b/src/assets/media/icons/svg/Design/Patch.svg new file mode 100644 index 0000000..0e8d0f3 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Patch.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Design / Patch + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Pen-tool-vector.svg b/src/assets/media/icons/svg/Design/Pen-tool-vector.svg new file mode 100644 index 0000000..58a5fe1 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Pen-tool-vector.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Pen-tool-vector + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/PenAndRuller.svg b/src/assets/media/icons/svg/Design/PenAndRuller.svg new file mode 100644 index 0000000..b9637eb --- /dev/null +++ b/src/assets/media/icons/svg/Design/PenAndRuller.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Pen&ruller + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Pencil.svg b/src/assets/media/icons/svg/Design/Pencil.svg new file mode 100644 index 0000000..0b8aeaa --- /dev/null +++ b/src/assets/media/icons/svg/Design/Pencil.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Pencil + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Picker.svg b/src/assets/media/icons/svg/Design/Picker.svg new file mode 100644 index 0000000..e84e005 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Picker.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Picker + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Pixels.svg b/src/assets/media/icons/svg/Design/Pixels.svg new file mode 100644 index 0000000..472901e --- /dev/null +++ b/src/assets/media/icons/svg/Design/Pixels.svg @@ -0,0 +1,16 @@ + + + + Stockholm-icons / Design / Pixels + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Polygon.svg b/src/assets/media/icons/svg/Design/Polygon.svg new file mode 100644 index 0000000..7b4ed76 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Polygon.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Design / Polygon + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Position.svg b/src/assets/media/icons/svg/Design/Position.svg new file mode 100644 index 0000000..14da9cc --- /dev/null +++ b/src/assets/media/icons/svg/Design/Position.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Design / Position + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Rectangle.svg b/src/assets/media/icons/svg/Design/Rectangle.svg new file mode 100644 index 0000000..06f9899 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Rectangle.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Design / Rectangle + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Saturation.svg b/src/assets/media/icons/svg/Design/Saturation.svg new file mode 100644 index 0000000..3823ca0 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Saturation.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Saturation + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Select.svg b/src/assets/media/icons/svg/Design/Select.svg new file mode 100644 index 0000000..d53e5ee --- /dev/null +++ b/src/assets/media/icons/svg/Design/Select.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Select + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Sketch.svg b/src/assets/media/icons/svg/Design/Sketch.svg new file mode 100644 index 0000000..ea2a48d --- /dev/null +++ b/src/assets/media/icons/svg/Design/Sketch.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Sketch + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Stamp.svg b/src/assets/media/icons/svg/Design/Stamp.svg new file mode 100644 index 0000000..9bd611d --- /dev/null +++ b/src/assets/media/icons/svg/Design/Stamp.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Stamp + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Substract.svg b/src/assets/media/icons/svg/Design/Substract.svg new file mode 100644 index 0000000..534f3a9 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Substract.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Substract + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Target.svg b/src/assets/media/icons/svg/Design/Target.svg new file mode 100644 index 0000000..2902b2a --- /dev/null +++ b/src/assets/media/icons/svg/Design/Target.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Target + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Triangle.svg b/src/assets/media/icons/svg/Design/Triangle.svg new file mode 100644 index 0000000..ba5a027 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Triangle.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Design / Triangle + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Union.svg b/src/assets/media/icons/svg/Design/Union.svg new file mode 100644 index 0000000..64488e5 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Union.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Design / Union + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/Vertical.svg b/src/assets/media/icons/svg/Design/Vertical.svg new file mode 100644 index 0000000..df89764 --- /dev/null +++ b/src/assets/media/icons/svg/Design/Vertical.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Design / Vertical + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/ZoomMinus.svg b/src/assets/media/icons/svg/Design/ZoomMinus.svg new file mode 100644 index 0000000..ec45840 --- /dev/null +++ b/src/assets/media/icons/svg/Design/ZoomMinus.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Design / ZoomMinus + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Design/ZoomPlus.svg b/src/assets/media/icons/svg/Design/ZoomPlus.svg new file mode 100644 index 0000000..524ef6c --- /dev/null +++ b/src/assets/media/icons/svg/Design/ZoomPlus.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Design / ZoomPlus + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Airpods.svg b/src/assets/media/icons/svg/Devices/Airpods.svg new file mode 100644 index 0000000..8e5df76 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Airpods.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Devices / Airpods + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Android.svg b/src/assets/media/icons/svg/Devices/Android.svg new file mode 100644 index 0000000..9a75a6a --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Android.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Android + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Apple-Watch.svg b/src/assets/media/icons/svg/Devices/Apple-Watch.svg new file mode 100644 index 0000000..9d0cfea --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Apple-Watch.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Apple-Watch + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Battery-charging.svg b/src/assets/media/icons/svg/Devices/Battery-charging.svg new file mode 100644 index 0000000..b3e9628 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Battery-charging.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Devices / Battery-charging + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Battery-empty.svg b/src/assets/media/icons/svg/Devices/Battery-empty.svg new file mode 100644 index 0000000..9af4872 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Battery-empty.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Battery-empty + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Battery-full.svg b/src/assets/media/icons/svg/Devices/Battery-full.svg new file mode 100644 index 0000000..2347026 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Battery-full.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Battery-full + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Battery-half.svg b/src/assets/media/icons/svg/Devices/Battery-half.svg new file mode 100644 index 0000000..81a10c7 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Battery-half.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Battery-half + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Bluetooth.svg b/src/assets/media/icons/svg/Devices/Bluetooth.svg new file mode 100644 index 0000000..27eda65 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Bluetooth.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Bluetooth + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/CPU1.svg b/src/assets/media/icons/svg/Devices/CPU1.svg new file mode 100644 index 0000000..6a82edf --- /dev/null +++ b/src/assets/media/icons/svg/Devices/CPU1.svg @@ -0,0 +1,18 @@ + + + + Stockholm-icons / Devices / CPU1 + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/CPU2.svg b/src/assets/media/icons/svg/Devices/CPU2.svg new file mode 100644 index 0000000..801bf1e --- /dev/null +++ b/src/assets/media/icons/svg/Devices/CPU2.svg @@ -0,0 +1,24 @@ + + + + Stockholm-icons / Devices / CPU2 + Created with Sketch. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Camera.svg b/src/assets/media/icons/svg/Devices/Camera.svg new file mode 100644 index 0000000..16ce46e --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Camera.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Devices / Camera + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Cardboard-vr.svg b/src/assets/media/icons/svg/Devices/Cardboard-vr.svg new file mode 100644 index 0000000..174d245 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Cardboard-vr.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Cardboard-vr + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Cassete.svg b/src/assets/media/icons/svg/Devices/Cassete.svg new file mode 100644 index 0000000..0d3817b --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Cassete.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Devices / Cassete + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Diagnostics.svg b/src/assets/media/icons/svg/Devices/Diagnostics.svg new file mode 100644 index 0000000..dc62560 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Diagnostics.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Devices / Diagnostics + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Display1.svg b/src/assets/media/icons/svg/Devices/Display1.svg new file mode 100644 index 0000000..9dbe4c8 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Display1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Display1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Display2.svg b/src/assets/media/icons/svg/Devices/Display2.svg new file mode 100644 index 0000000..8a1543b --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Display2.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Devices / Display2 + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Display3.svg b/src/assets/media/icons/svg/Devices/Display3.svg new file mode 100644 index 0000000..9a91741 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Display3.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Devices / Display3 + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Gameboy.svg b/src/assets/media/icons/svg/Devices/Gameboy.svg new file mode 100644 index 0000000..531e124 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Gameboy.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Gameboy + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Gamepad1.svg b/src/assets/media/icons/svg/Devices/Gamepad1.svg new file mode 100644 index 0000000..1ec6e25 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Gamepad1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Gamepad1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Gamepad2.svg b/src/assets/media/icons/svg/Devices/Gamepad2.svg new file mode 100644 index 0000000..0913832 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Gamepad2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Gamepad2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Generator.svg b/src/assets/media/icons/svg/Devices/Generator.svg new file mode 100644 index 0000000..278c588 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Generator.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Devices / Generator + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Hard-drive.svg b/src/assets/media/icons/svg/Devices/Hard-drive.svg new file mode 100644 index 0000000..22dcc41 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Hard-drive.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Hard-drive + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Headphones.svg b/src/assets/media/icons/svg/Devices/Headphones.svg new file mode 100644 index 0000000..de8593c --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Headphones.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Headphones + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Homepod.svg b/src/assets/media/icons/svg/Devices/Homepod.svg new file mode 100644 index 0000000..70e06e6 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Homepod.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Homepod + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Keyboard.svg b/src/assets/media/icons/svg/Devices/Keyboard.svg new file mode 100644 index 0000000..a2d94b0 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Keyboard.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Keyboard + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/LTE1.svg b/src/assets/media/icons/svg/Devices/LTE1.svg new file mode 100644 index 0000000..fccf587 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/LTE1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / LTE1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/LTE2.svg b/src/assets/media/icons/svg/Devices/LTE2.svg new file mode 100644 index 0000000..90f1c4b --- /dev/null +++ b/src/assets/media/icons/svg/Devices/LTE2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / LTE2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Laptop-macbook.svg b/src/assets/media/icons/svg/Devices/Laptop-macbook.svg new file mode 100644 index 0000000..4727a2f --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Laptop-macbook.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Laptop-macbook + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Laptop.svg b/src/assets/media/icons/svg/Devices/Laptop.svg new file mode 100644 index 0000000..c92efcd --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Laptop.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Laptop + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Mic.svg b/src/assets/media/icons/svg/Devices/Mic.svg new file mode 100644 index 0000000..68c3589 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Mic.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Mic + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Midi.svg b/src/assets/media/icons/svg/Devices/Midi.svg new file mode 100644 index 0000000..b403b9c --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Midi.svg @@ -0,0 +1,17 @@ + + + + Stockholm-icons / Devices / Midi + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Mouse.svg b/src/assets/media/icons/svg/Devices/Mouse.svg new file mode 100644 index 0000000..8f05b45 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Mouse.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Devices / Mouse + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Phone.svg b/src/assets/media/icons/svg/Devices/Phone.svg new file mode 100644 index 0000000..24ae75e --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Phone.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Devices / Phone + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Printer.svg b/src/assets/media/icons/svg/Devices/Printer.svg new file mode 100644 index 0000000..4b18dcc --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Printer.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Printer + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Radio.svg b/src/assets/media/icons/svg/Devices/Radio.svg new file mode 100644 index 0000000..c60a89e --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Radio.svg @@ -0,0 +1,15 @@ + + + + Stockholm-icons / Devices / Radio + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Router1.svg b/src/assets/media/icons/svg/Devices/Router1.svg new file mode 100644 index 0000000..3cca837 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Router1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Router1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Router2.svg b/src/assets/media/icons/svg/Devices/Router2.svg new file mode 100644 index 0000000..4424010 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Router2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Router2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/SD-card.svg b/src/assets/media/icons/svg/Devices/SD-card.svg new file mode 100644 index 0000000..54f40a9 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/SD-card.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Devices / SD-card + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Server.svg b/src/assets/media/icons/svg/Devices/Server.svg new file mode 100644 index 0000000..3e00053 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Server.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Devices / Server + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Speaker.svg b/src/assets/media/icons/svg/Devices/Speaker.svg new file mode 100644 index 0000000..5f58668 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Speaker.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Speaker + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/TV1.svg b/src/assets/media/icons/svg/Devices/TV1.svg new file mode 100644 index 0000000..92494ea --- /dev/null +++ b/src/assets/media/icons/svg/Devices/TV1.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Devices / TV1 + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/TV2.svg b/src/assets/media/icons/svg/Devices/TV2.svg new file mode 100644 index 0000000..a9642c1 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/TV2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / TV2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Tablet.svg b/src/assets/media/icons/svg/Devices/Tablet.svg new file mode 100644 index 0000000..972a26d --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Tablet.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Tablet + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/USB.svg b/src/assets/media/icons/svg/Devices/USB.svg new file mode 100644 index 0000000..00eb64d --- /dev/null +++ b/src/assets/media/icons/svg/Devices/USB.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Devices / USB + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Usb-storage.svg b/src/assets/media/icons/svg/Devices/Usb-storage.svg new file mode 100644 index 0000000..136818a --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Usb-storage.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Usb-storage + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Video-camera.svg b/src/assets/media/icons/svg/Devices/Video-camera.svg new file mode 100644 index 0000000..0fdcffd --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Video-camera.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Video-camera + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Watch1.svg b/src/assets/media/icons/svg/Devices/Watch1.svg new file mode 100644 index 0000000..3f2aca7 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Watch1.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Devices / Watch1 + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Watch2.svg b/src/assets/media/icons/svg/Devices/Watch2.svg new file mode 100644 index 0000000..3d71b25 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Watch2.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Devices / Watch2 + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/Wi-fi.svg b/src/assets/media/icons/svg/Devices/Wi-fi.svg new file mode 100644 index 0000000..f035d1f --- /dev/null +++ b/src/assets/media/icons/svg/Devices/Wi-fi.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / Wi-fi + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/iMac.svg b/src/assets/media/icons/svg/Devices/iMac.svg new file mode 100644 index 0000000..1f5352f --- /dev/null +++ b/src/assets/media/icons/svg/Devices/iMac.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Devices / iMac + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/iPhone-X.svg b/src/assets/media/icons/svg/Devices/iPhone-X.svg new file mode 100644 index 0000000..d1c518e --- /dev/null +++ b/src/assets/media/icons/svg/Devices/iPhone-X.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Devices / iPhone-X + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/iPhone-back.svg b/src/assets/media/icons/svg/Devices/iPhone-back.svg new file mode 100644 index 0000000..9ca7219 --- /dev/null +++ b/src/assets/media/icons/svg/Devices/iPhone-back.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Devices / iPhone-back + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Devices/iPhone-x-back.svg b/src/assets/media/icons/svg/Devices/iPhone-x-back.svg new file mode 100644 index 0000000..7eac81a --- /dev/null +++ b/src/assets/media/icons/svg/Devices/iPhone-x-back.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Devices / iPhone-x-back + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Electric/Air-conditioning.svg b/src/assets/media/icons/svg/Electric/Air-conditioning.svg new file mode 100644 index 0000000..ccad84a --- /dev/null +++ b/src/assets/media/icons/svg/Electric/Air-conditioning.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Electric / Air-conditioning + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Electric/Blender.svg b/src/assets/media/icons/svg/Electric/Blender.svg new file mode 100644 index 0000000..4c00e99 --- /dev/null +++ b/src/assets/media/icons/svg/Electric/Blender.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Electric / Blender + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Electric/Fan.svg b/src/assets/media/icons/svg/Electric/Fan.svg new file mode 100644 index 0000000..f8ec482 --- /dev/null +++ b/src/assets/media/icons/svg/Electric/Fan.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Electric / Fan + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Electric/Fridge.svg b/src/assets/media/icons/svg/Electric/Fridge.svg new file mode 100644 index 0000000..1259286 --- /dev/null +++ b/src/assets/media/icons/svg/Electric/Fridge.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Electric / Fridge + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Electric/Gas-stove.svg b/src/assets/media/icons/svg/Electric/Gas-stove.svg new file mode 100644 index 0000000..7c895fc --- /dev/null +++ b/src/assets/media/icons/svg/Electric/Gas-stove.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Electric / Gas-stove + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Electric/Highvoltage.svg b/src/assets/media/icons/svg/Electric/Highvoltage.svg new file mode 100644 index 0000000..7c9e179 --- /dev/null +++ b/src/assets/media/icons/svg/Electric/Highvoltage.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Electric / Highvoltage + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Electric/Iron.svg b/src/assets/media/icons/svg/Electric/Iron.svg new file mode 100644 index 0000000..b991bdb --- /dev/null +++ b/src/assets/media/icons/svg/Electric/Iron.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Electric / Iron + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Electric/Kettle.svg b/src/assets/media/icons/svg/Electric/Kettle.svg new file mode 100644 index 0000000..ee11fe2 --- /dev/null +++ b/src/assets/media/icons/svg/Electric/Kettle.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Electric / Kettle + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Electric/Mixer.svg b/src/assets/media/icons/svg/Electric/Mixer.svg new file mode 100644 index 0000000..bdaf501 --- /dev/null +++ b/src/assets/media/icons/svg/Electric/Mixer.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Electric / Mixer + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Electric/Outlet.svg b/src/assets/media/icons/svg/Electric/Outlet.svg new file mode 100644 index 0000000..e14fb14 --- /dev/null +++ b/src/assets/media/icons/svg/Electric/Outlet.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Electric / Outlet + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Electric/Range-hood.svg b/src/assets/media/icons/svg/Electric/Range-hood.svg new file mode 100644 index 0000000..6eac5db --- /dev/null +++ b/src/assets/media/icons/svg/Electric/Range-hood.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Electric / Range-hood + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Electric/Shutdown.svg b/src/assets/media/icons/svg/Electric/Shutdown.svg new file mode 100644 index 0000000..b3a23ec --- /dev/null +++ b/src/assets/media/icons/svg/Electric/Shutdown.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Electric / Shutdown + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Electric/Socket-eu.svg b/src/assets/media/icons/svg/Electric/Socket-eu.svg new file mode 100644 index 0000000..e4d3d51 --- /dev/null +++ b/src/assets/media/icons/svg/Electric/Socket-eu.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Electric / Socket-eu + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Electric/Socket-us.svg b/src/assets/media/icons/svg/Electric/Socket-us.svg new file mode 100644 index 0000000..a15e842 --- /dev/null +++ b/src/assets/media/icons/svg/Electric/Socket-us.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Electric / Socket-us + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Electric/Washer.svg b/src/assets/media/icons/svg/Electric/Washer.svg new file mode 100644 index 0000000..45ff9ee --- /dev/null +++ b/src/assets/media/icons/svg/Electric/Washer.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Electric / Washer + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Electric/air-dryer.svg b/src/assets/media/icons/svg/Electric/air-dryer.svg new file mode 100644 index 0000000..d58866b --- /dev/null +++ b/src/assets/media/icons/svg/Electric/air-dryer.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Electric / Нair-dryer + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Cloud-download.svg b/src/assets/media/icons/svg/Files/Cloud-download.svg new file mode 100644 index 0000000..a008fee --- /dev/null +++ b/src/assets/media/icons/svg/Files/Cloud-download.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / Cloud-download + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Cloud-upload.svg b/src/assets/media/icons/svg/Files/Cloud-upload.svg new file mode 100644 index 0000000..344e65e --- /dev/null +++ b/src/assets/media/icons/svg/Files/Cloud-upload.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / Cloud-upload + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Compilation.svg b/src/assets/media/icons/svg/Files/Compilation.svg new file mode 100644 index 0000000..191e8e1 --- /dev/null +++ b/src/assets/media/icons/svg/Files/Compilation.svg @@ -0,0 +1,15 @@ + + + + Stockholm-icons / Files / Compilation + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Compiled-file.svg b/src/assets/media/icons/svg/Files/Compiled-file.svg new file mode 100644 index 0000000..5bfed96 --- /dev/null +++ b/src/assets/media/icons/svg/Files/Compiled-file.svg @@ -0,0 +1,15 @@ + + + + Stockholm-icons / Files / Compiled-file + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Deleted-file.svg b/src/assets/media/icons/svg/Files/Deleted-file.svg new file mode 100644 index 0000000..a2b17cc --- /dev/null +++ b/src/assets/media/icons/svg/Files/Deleted-file.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / Deleted-file + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Deleted-folder.svg b/src/assets/media/icons/svg/Files/Deleted-folder.svg new file mode 100644 index 0000000..9ad245e --- /dev/null +++ b/src/assets/media/icons/svg/Files/Deleted-folder.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / Deleted-folder + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Download.svg b/src/assets/media/icons/svg/Files/Download.svg new file mode 100644 index 0000000..fd2d8ae --- /dev/null +++ b/src/assets/media/icons/svg/Files/Download.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Files / Download + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/DownloadedFile.svg b/src/assets/media/icons/svg/Files/DownloadedFile.svg new file mode 100644 index 0000000..3259d8f --- /dev/null +++ b/src/assets/media/icons/svg/Files/DownloadedFile.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / DownloadedFile + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Downloads-folder.svg b/src/assets/media/icons/svg/Files/Downloads-folder.svg new file mode 100644 index 0000000..1a40074 --- /dev/null +++ b/src/assets/media/icons/svg/Files/Downloads-folder.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / Downloads-folder + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Export.svg b/src/assets/media/icons/svg/Files/Export.svg new file mode 100644 index 0000000..8009ea9 --- /dev/null +++ b/src/assets/media/icons/svg/Files/Export.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Files / Export + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/File-cloud.svg b/src/assets/media/icons/svg/Files/File-cloud.svg new file mode 100644 index 0000000..a42632a --- /dev/null +++ b/src/assets/media/icons/svg/Files/File-cloud.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / File-cloud + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/File-done.svg b/src/assets/media/icons/svg/Files/File-done.svg new file mode 100644 index 0000000..ce1fc80 --- /dev/null +++ b/src/assets/media/icons/svg/Files/File-done.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / File-done + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/File-minus.svg b/src/assets/media/icons/svg/Files/File-minus.svg new file mode 100644 index 0000000..5d34dbe --- /dev/null +++ b/src/assets/media/icons/svg/Files/File-minus.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / File-minus + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/File-plus.svg b/src/assets/media/icons/svg/Files/File-plus.svg new file mode 100644 index 0000000..bff8859 --- /dev/null +++ b/src/assets/media/icons/svg/Files/File-plus.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / File-plus + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/File.svg b/src/assets/media/icons/svg/Files/File.svg new file mode 100644 index 0000000..3316a25 --- /dev/null +++ b/src/assets/media/icons/svg/Files/File.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Files / File + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Folder-check.svg b/src/assets/media/icons/svg/Files/Folder-check.svg new file mode 100644 index 0000000..8f5c897 --- /dev/null +++ b/src/assets/media/icons/svg/Files/Folder-check.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / Folder-check + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Folder-cloud.svg b/src/assets/media/icons/svg/Files/Folder-cloud.svg new file mode 100644 index 0000000..2e9249c --- /dev/null +++ b/src/assets/media/icons/svg/Files/Folder-cloud.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / Folder-cloud + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Folder-error.svg b/src/assets/media/icons/svg/Files/Folder-error.svg new file mode 100644 index 0000000..93b5d26 --- /dev/null +++ b/src/assets/media/icons/svg/Files/Folder-error.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / Folder-error + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Folder-heart.svg b/src/assets/media/icons/svg/Files/Folder-heart.svg new file mode 100644 index 0000000..9e9898b --- /dev/null +++ b/src/assets/media/icons/svg/Files/Folder-heart.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / Folder-heart + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Folder-minus.svg b/src/assets/media/icons/svg/Files/Folder-minus.svg new file mode 100644 index 0000000..003f2f9 --- /dev/null +++ b/src/assets/media/icons/svg/Files/Folder-minus.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / Folder-minus + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Folder-plus.svg b/src/assets/media/icons/svg/Files/Folder-plus.svg new file mode 100644 index 0000000..c913c3c --- /dev/null +++ b/src/assets/media/icons/svg/Files/Folder-plus.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / Folder-plus + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Folder-solid.svg b/src/assets/media/icons/svg/Files/Folder-solid.svg new file mode 100644 index 0000000..14cd689 --- /dev/null +++ b/src/assets/media/icons/svg/Files/Folder-solid.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Files / Folder-solid + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Folder-star.svg b/src/assets/media/icons/svg/Files/Folder-star.svg new file mode 100644 index 0000000..cbb69e3 --- /dev/null +++ b/src/assets/media/icons/svg/Files/Folder-star.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / Folder-star + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Folder-thunder.svg b/src/assets/media/icons/svg/Files/Folder-thunder.svg new file mode 100644 index 0000000..3e9a9d4 --- /dev/null +++ b/src/assets/media/icons/svg/Files/Folder-thunder.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / Folder-thunder + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Folder.svg b/src/assets/media/icons/svg/Files/Folder.svg new file mode 100644 index 0000000..b7aaacf --- /dev/null +++ b/src/assets/media/icons/svg/Files/Folder.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Files / Folder + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Group-folders.svg b/src/assets/media/icons/svg/Files/Group-folders.svg new file mode 100644 index 0000000..f25de24 --- /dev/null +++ b/src/assets/media/icons/svg/Files/Group-folders.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / Group-folders + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Import.svg b/src/assets/media/icons/svg/Files/Import.svg new file mode 100644 index 0000000..a65766b --- /dev/null +++ b/src/assets/media/icons/svg/Files/Import.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Files / Import + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Locked-folder.svg b/src/assets/media/icons/svg/Files/Locked-folder.svg new file mode 100644 index 0000000..232a1ff --- /dev/null +++ b/src/assets/media/icons/svg/Files/Locked-folder.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / Locked-folder + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Media-folder.svg b/src/assets/media/icons/svg/Files/Media-folder.svg new file mode 100644 index 0000000..6e890c7 --- /dev/null +++ b/src/assets/media/icons/svg/Files/Media-folder.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / Media-folder + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Media.svg b/src/assets/media/icons/svg/Files/Media.svg new file mode 100644 index 0000000..2e14a57 --- /dev/null +++ b/src/assets/media/icons/svg/Files/Media.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / Media + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Music.svg b/src/assets/media/icons/svg/Files/Music.svg new file mode 100644 index 0000000..e4a5e47 --- /dev/null +++ b/src/assets/media/icons/svg/Files/Music.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / Music + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Pictures1.svg b/src/assets/media/icons/svg/Files/Pictures1.svg new file mode 100644 index 0000000..158c3f6 --- /dev/null +++ b/src/assets/media/icons/svg/Files/Pictures1.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Files / Pictures1 + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Pictures2.svg b/src/assets/media/icons/svg/Files/Pictures2.svg new file mode 100644 index 0000000..4f5a70e --- /dev/null +++ b/src/assets/media/icons/svg/Files/Pictures2.svg @@ -0,0 +1,16 @@ + + + + Stockholm-icons / Files / Pictures2 + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Protected-file.svg b/src/assets/media/icons/svg/Files/Protected-file.svg new file mode 100644 index 0000000..a31a771 --- /dev/null +++ b/src/assets/media/icons/svg/Files/Protected-file.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / Protected-file + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Selected-file.svg b/src/assets/media/icons/svg/Files/Selected-file.svg new file mode 100644 index 0000000..abba235 --- /dev/null +++ b/src/assets/media/icons/svg/Files/Selected-file.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / Selected-file + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Share.svg b/src/assets/media/icons/svg/Files/Share.svg new file mode 100644 index 0000000..0824db1 --- /dev/null +++ b/src/assets/media/icons/svg/Files/Share.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Files / Share + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Upload-folder.svg b/src/assets/media/icons/svg/Files/Upload-folder.svg new file mode 100644 index 0000000..e04d636 --- /dev/null +++ b/src/assets/media/icons/svg/Files/Upload-folder.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / Upload-folder + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Upload.svg b/src/assets/media/icons/svg/Files/Upload.svg new file mode 100644 index 0000000..94e3e00 --- /dev/null +++ b/src/assets/media/icons/svg/Files/Upload.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Files / Upload + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/Uploaded-file.svg b/src/assets/media/icons/svg/Files/Uploaded-file.svg new file mode 100644 index 0000000..00549e1 --- /dev/null +++ b/src/assets/media/icons/svg/Files/Uploaded-file.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Files / Uploaded-file + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Files/User-folder.svg b/src/assets/media/icons/svg/Files/User-folder.svg new file mode 100644 index 0000000..65fd2c7 --- /dev/null +++ b/src/assets/media/icons/svg/Files/User-folder.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Files / User-folder + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Food/Beer.svg b/src/assets/media/icons/svg/Food/Beer.svg new file mode 100644 index 0000000..48d1212 --- /dev/null +++ b/src/assets/media/icons/svg/Food/Beer.svg @@ -0,0 +1,15 @@ + + + + Stockholm-icons / Food / Beer + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Food/Bottle1.svg b/src/assets/media/icons/svg/Food/Bottle1.svg new file mode 100644 index 0000000..6a2eeb0 --- /dev/null +++ b/src/assets/media/icons/svg/Food/Bottle1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Food / Bottle1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Food/Bottle2.svg b/src/assets/media/icons/svg/Food/Bottle2.svg new file mode 100644 index 0000000..2474b53 --- /dev/null +++ b/src/assets/media/icons/svg/Food/Bottle2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Food / Bottle2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Food/Bread.svg b/src/assets/media/icons/svg/Food/Bread.svg new file mode 100644 index 0000000..ef58b61 --- /dev/null +++ b/src/assets/media/icons/svg/Food/Bread.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Food / Bread + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Food/Bucket.svg b/src/assets/media/icons/svg/Food/Bucket.svg new file mode 100644 index 0000000..c188bff --- /dev/null +++ b/src/assets/media/icons/svg/Food/Bucket.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Food / Bucket + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Food/Burger.svg b/src/assets/media/icons/svg/Food/Burger.svg new file mode 100644 index 0000000..6d2ab4c --- /dev/null +++ b/src/assets/media/icons/svg/Food/Burger.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Food / Burger + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Food/Cake.svg b/src/assets/media/icons/svg/Food/Cake.svg new file mode 100644 index 0000000..27a0ed4 --- /dev/null +++ b/src/assets/media/icons/svg/Food/Cake.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Food / Cake + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Food/Carrot.svg b/src/assets/media/icons/svg/Food/Carrot.svg new file mode 100644 index 0000000..b946336 --- /dev/null +++ b/src/assets/media/icons/svg/Food/Carrot.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Food / Carrot + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Food/Cheese.svg b/src/assets/media/icons/svg/Food/Cheese.svg new file mode 100644 index 0000000..bcb6268 --- /dev/null +++ b/src/assets/media/icons/svg/Food/Cheese.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Food / Cheese + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Food/Chicken.svg b/src/assets/media/icons/svg/Food/Chicken.svg new file mode 100644 index 0000000..0039e03 --- /dev/null +++ b/src/assets/media/icons/svg/Food/Chicken.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Food / Chicken + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Food/Coffee1.svg b/src/assets/media/icons/svg/Food/Coffee1.svg new file mode 100644 index 0000000..1772691 --- /dev/null +++ b/src/assets/media/icons/svg/Food/Coffee1.svg @@ -0,0 +1,15 @@ + + + + Stockholm-icons / Food / Coffee1 + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Food/Coffee2.svg b/src/assets/media/icons/svg/Food/Coffee2.svg new file mode 100644 index 0000000..ff077c8 --- /dev/null +++ b/src/assets/media/icons/svg/Food/Coffee2.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Food / Coffee2 + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Food/Cookie.svg b/src/assets/media/icons/svg/Food/Cookie.svg new file mode 100644 index 0000000..abb46d6 --- /dev/null +++ b/src/assets/media/icons/svg/Food/Cookie.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Food / Cookie + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Food/Dinner.svg b/src/assets/media/icons/svg/Food/Dinner.svg new file mode 100644 index 0000000..5d6fafa --- /dev/null +++ b/src/assets/media/icons/svg/Food/Dinner.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Food / Dinner + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Food/Fish.svg b/src/assets/media/icons/svg/Food/Fish.svg new file mode 100644 index 0000000..9a8c8c1 --- /dev/null +++ b/src/assets/media/icons/svg/Food/Fish.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Food / Fish + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Food/French Bread.svg b/src/assets/media/icons/svg/Food/French Bread.svg new file mode 100644 index 0000000..bbbc5f8 --- /dev/null +++ b/src/assets/media/icons/svg/Food/French Bread.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Food / French Bread + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Food/Glass-martini.svg b/src/assets/media/icons/svg/Food/Glass-martini.svg new file mode 100644 index 0000000..728bffa --- /dev/null +++ b/src/assets/media/icons/svg/Food/Glass-martini.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Food / Glass-martini + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Food/Ice-cream1.svg b/src/assets/media/icons/svg/Food/Ice-cream1.svg new file mode 100644 index 0000000..2b27be6 --- /dev/null +++ b/src/assets/media/icons/svg/Food/Ice-cream1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Food / Ice-cream1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Food/Ice-cream2.svg b/src/assets/media/icons/svg/Food/Ice-cream2.svg new file mode 100644 index 0000000..08c9418 --- /dev/null +++ b/src/assets/media/icons/svg/Food/Ice-cream2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Food / Ice-cream2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Food/Miso-soup.svg b/src/assets/media/icons/svg/Food/Miso-soup.svg new file mode 100644 index 0000000..d7acbf0 --- /dev/null +++ b/src/assets/media/icons/svg/Food/Miso-soup.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Food / Miso-soup + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Food/Orange.svg b/src/assets/media/icons/svg/Food/Orange.svg new file mode 100644 index 0000000..79acf3e --- /dev/null +++ b/src/assets/media/icons/svg/Food/Orange.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Food / Orange + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Food/Pizza.svg b/src/assets/media/icons/svg/Food/Pizza.svg new file mode 100644 index 0000000..401edbb --- /dev/null +++ b/src/assets/media/icons/svg/Food/Pizza.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Food / Pizza + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Food/Sushi.svg b/src/assets/media/icons/svg/Food/Sushi.svg new file mode 100644 index 0000000..b41dce5 --- /dev/null +++ b/src/assets/media/icons/svg/Food/Sushi.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Food / Sushi + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Food/Two-bottles.svg b/src/assets/media/icons/svg/Food/Two-bottles.svg new file mode 100644 index 0000000..9941eda --- /dev/null +++ b/src/assets/media/icons/svg/Food/Two-bottles.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Food / Two-bottles + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Food/Wine.svg b/src/assets/media/icons/svg/Food/Wine.svg new file mode 100644 index 0000000..0eccc5d --- /dev/null +++ b/src/assets/media/icons/svg/Food/Wine.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Food / Wine + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Attachment1.svg b/src/assets/media/icons/svg/General/Attachment1.svg new file mode 100644 index 0000000..66cdcb0 --- /dev/null +++ b/src/assets/media/icons/svg/General/Attachment1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / General / Attachment1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Attachment2.svg b/src/assets/media/icons/svg/General/Attachment2.svg new file mode 100644 index 0000000..6d75868 --- /dev/null +++ b/src/assets/media/icons/svg/General/Attachment2.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / General / Attachment2 + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Binocular.svg b/src/assets/media/icons/svg/General/Binocular.svg new file mode 100644 index 0000000..d3a4a2e --- /dev/null +++ b/src/assets/media/icons/svg/General/Binocular.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / General / Binocular + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Bookmark.svg b/src/assets/media/icons/svg/General/Bookmark.svg new file mode 100644 index 0000000..af44fc2 --- /dev/null +++ b/src/assets/media/icons/svg/General/Bookmark.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / General / Bookmark + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Clip.svg b/src/assets/media/icons/svg/General/Clip.svg new file mode 100644 index 0000000..cee6cd6 --- /dev/null +++ b/src/assets/media/icons/svg/General/Clip.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / General / Clip + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Clipboard.svg b/src/assets/media/icons/svg/General/Clipboard.svg new file mode 100644 index 0000000..fc44255 --- /dev/null +++ b/src/assets/media/icons/svg/General/Clipboard.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / General / Clipboard + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Cursor.svg b/src/assets/media/icons/svg/General/Cursor.svg new file mode 100644 index 0000000..fbec5fa --- /dev/null +++ b/src/assets/media/icons/svg/General/Cursor.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / General / Cursor + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Dislike.svg b/src/assets/media/icons/svg/General/Dislike.svg new file mode 100644 index 0000000..90b0278 --- /dev/null +++ b/src/assets/media/icons/svg/General/Dislike.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / General / Dislike + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Duplicate.svg b/src/assets/media/icons/svg/General/Duplicate.svg new file mode 100644 index 0000000..44550ef --- /dev/null +++ b/src/assets/media/icons/svg/General/Duplicate.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / General / Duplicate + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Edit.svg b/src/assets/media/icons/svg/General/Edit.svg new file mode 100644 index 0000000..a7f413c --- /dev/null +++ b/src/assets/media/icons/svg/General/Edit.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / General / Edit + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Expand-arrows.svg b/src/assets/media/icons/svg/General/Expand-arrows.svg new file mode 100644 index 0000000..5d0cbf6 --- /dev/null +++ b/src/assets/media/icons/svg/General/Expand-arrows.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / General / Expand-arrows + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Fire.svg b/src/assets/media/icons/svg/General/Fire.svg new file mode 100644 index 0000000..e10020f --- /dev/null +++ b/src/assets/media/icons/svg/General/Fire.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / General / Fire + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Folder.svg b/src/assets/media/icons/svg/General/Folder.svg new file mode 100644 index 0000000..bcb60ef --- /dev/null +++ b/src/assets/media/icons/svg/General/Folder.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / General / Folder + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Half-heart.svg b/src/assets/media/icons/svg/General/Half-heart.svg new file mode 100644 index 0000000..54fd605 --- /dev/null +++ b/src/assets/media/icons/svg/General/Half-heart.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / General / Half-heart + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Half-star.svg b/src/assets/media/icons/svg/General/Half-star.svg new file mode 100644 index 0000000..b069dc1 --- /dev/null +++ b/src/assets/media/icons/svg/General/Half-star.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / General / Half-star + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Heart.svg b/src/assets/media/icons/svg/General/Heart.svg new file mode 100644 index 0000000..0c694f7 --- /dev/null +++ b/src/assets/media/icons/svg/General/Heart.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / General / Heart + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Hidden.svg b/src/assets/media/icons/svg/General/Hidden.svg new file mode 100644 index 0000000..84344d1 --- /dev/null +++ b/src/assets/media/icons/svg/General/Hidden.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / General / Hidden + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Like.svg b/src/assets/media/icons/svg/General/Like.svg new file mode 100644 index 0000000..b7b6a56 --- /dev/null +++ b/src/assets/media/icons/svg/General/Like.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / General / Like + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Lock.svg b/src/assets/media/icons/svg/General/Lock.svg new file mode 100644 index 0000000..2ad5846 --- /dev/null +++ b/src/assets/media/icons/svg/General/Lock.svg @@ -0,0 +1,16 @@ + + + + Stockholm-icons / General / Lock + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Notification2.svg b/src/assets/media/icons/svg/General/Notification2.svg new file mode 100644 index 0000000..81348c0 --- /dev/null +++ b/src/assets/media/icons/svg/General/Notification2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / General / Notification2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Notifications1.svg b/src/assets/media/icons/svg/General/Notifications1.svg new file mode 100644 index 0000000..337480e --- /dev/null +++ b/src/assets/media/icons/svg/General/Notifications1.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / General / Notifications1 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Other1.svg b/src/assets/media/icons/svg/General/Other1.svg new file mode 100644 index 0000000..ba1df29 --- /dev/null +++ b/src/assets/media/icons/svg/General/Other1.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / General / Other1 + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Other2.svg b/src/assets/media/icons/svg/General/Other2.svg new file mode 100644 index 0000000..23a7cd8 --- /dev/null +++ b/src/assets/media/icons/svg/General/Other2.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / General / Other2 + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Sad.svg b/src/assets/media/icons/svg/General/Sad.svg new file mode 100644 index 0000000..2302804 --- /dev/null +++ b/src/assets/media/icons/svg/General/Sad.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / General / Sad + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Save.svg b/src/assets/media/icons/svg/General/Save.svg new file mode 100644 index 0000000..57ce003 --- /dev/null +++ b/src/assets/media/icons/svg/General/Save.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / General / Save + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Scale.svg b/src/assets/media/icons/svg/General/Scale.svg new file mode 100644 index 0000000..e1f1219 --- /dev/null +++ b/src/assets/media/icons/svg/General/Scale.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / General / Scale + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Scissors.svg b/src/assets/media/icons/svg/General/Scissors.svg new file mode 100644 index 0000000..e05b036 --- /dev/null +++ b/src/assets/media/icons/svg/General/Scissors.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / General / Scissors + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Search.svg b/src/assets/media/icons/svg/General/Search.svg new file mode 100644 index 0000000..baf73e9 --- /dev/null +++ b/src/assets/media/icons/svg/General/Search.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / General / Search + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Settings#3.svg b/src/assets/media/icons/svg/General/Settings#3.svg new file mode 100644 index 0000000..a40e5e4 --- /dev/null +++ b/src/assets/media/icons/svg/General/Settings#3.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / General / Settings#3 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Settings-1.svg b/src/assets/media/icons/svg/General/Settings-1.svg new file mode 100644 index 0000000..d51bb53 --- /dev/null +++ b/src/assets/media/icons/svg/General/Settings-1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / General / Settings-1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Settings-2.svg b/src/assets/media/icons/svg/General/Settings-2.svg new file mode 100644 index 0000000..b779eee --- /dev/null +++ b/src/assets/media/icons/svg/General/Settings-2.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / General / Settings-2 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Shield-check.svg b/src/assets/media/icons/svg/General/Shield-check.svg new file mode 100644 index 0000000..3cb75d4 --- /dev/null +++ b/src/assets/media/icons/svg/General/Shield-check.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / General / Shield-check + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Shield-disabled.svg b/src/assets/media/icons/svg/General/Shield-disabled.svg new file mode 100644 index 0000000..9bfc148 --- /dev/null +++ b/src/assets/media/icons/svg/General/Shield-disabled.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / General / Shield-disabled + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Shield-protected.svg b/src/assets/media/icons/svg/General/Shield-protected.svg new file mode 100644 index 0000000..0a351de --- /dev/null +++ b/src/assets/media/icons/svg/General/Shield-protected.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / General / Shield-protected + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Size.svg b/src/assets/media/icons/svg/General/Size.svg new file mode 100644 index 0000000..8135945 --- /dev/null +++ b/src/assets/media/icons/svg/General/Size.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / General / Size + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Smile.svg b/src/assets/media/icons/svg/General/Smile.svg new file mode 100644 index 0000000..b97cecc --- /dev/null +++ b/src/assets/media/icons/svg/General/Smile.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / General / Smile + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Star.svg b/src/assets/media/icons/svg/General/Star.svg new file mode 100644 index 0000000..8478ad7 --- /dev/null +++ b/src/assets/media/icons/svg/General/Star.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / General / Star + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Thunder-move.svg b/src/assets/media/icons/svg/General/Thunder-move.svg new file mode 100644 index 0000000..76a321d --- /dev/null +++ b/src/assets/media/icons/svg/General/Thunder-move.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / General / Thunder-move + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Thunder.svg b/src/assets/media/icons/svg/General/Thunder.svg new file mode 100644 index 0000000..a6ad197 --- /dev/null +++ b/src/assets/media/icons/svg/General/Thunder.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / General / Thunder + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Trash.svg b/src/assets/media/icons/svg/General/Trash.svg new file mode 100644 index 0000000..8cc0f17 --- /dev/null +++ b/src/assets/media/icons/svg/General/Trash.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / General / Trash + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Unlock.svg b/src/assets/media/icons/svg/General/Unlock.svg new file mode 100644 index 0000000..b8c9431 --- /dev/null +++ b/src/assets/media/icons/svg/General/Unlock.svg @@ -0,0 +1,16 @@ + + + + Stockholm-icons / General / Unlock + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/Update.svg b/src/assets/media/icons/svg/General/Update.svg new file mode 100644 index 0000000..ab6178c --- /dev/null +++ b/src/assets/media/icons/svg/General/Update.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / General / Update + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/General/User.svg b/src/assets/media/icons/svg/General/User.svg new file mode 100644 index 0000000..013e6d6 --- /dev/null +++ b/src/assets/media/icons/svg/General/User.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / General / User + Created with Sketch. + + + + + + + diff --git a/src/assets/media/icons/svg/General/Visible.svg b/src/assets/media/icons/svg/General/Visible.svg new file mode 100644 index 0000000..96a7b97 --- /dev/null +++ b/src/assets/media/icons/svg/General/Visible.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / General / Visible + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Air-ballon.svg b/src/assets/media/icons/svg/Home/Air-ballon.svg new file mode 100644 index 0000000..f997f9b --- /dev/null +++ b/src/assets/media/icons/svg/Home/Air-ballon.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Air-ballon + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Alarm-clock.svg b/src/assets/media/icons/svg/Home/Alarm-clock.svg new file mode 100644 index 0000000..d6c734f --- /dev/null +++ b/src/assets/media/icons/svg/Home/Alarm-clock.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Home / Alarm-clock + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Armchair.svg b/src/assets/media/icons/svg/Home/Armchair.svg new file mode 100644 index 0000000..8869133 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Armchair.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Armchair + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Bag-chair.svg b/src/assets/media/icons/svg/Home/Bag-chair.svg new file mode 100644 index 0000000..8debfda --- /dev/null +++ b/src/assets/media/icons/svg/Home/Bag-chair.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Bag-chair + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Bath.svg b/src/assets/media/icons/svg/Home/Bath.svg new file mode 100644 index 0000000..b131c90 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Bath.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Bath + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Bed.svg b/src/assets/media/icons/svg/Home/Bed.svg new file mode 100644 index 0000000..6524080 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Bed.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Home / Bed + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Book-open.svg b/src/assets/media/icons/svg/Home/Book-open.svg new file mode 100644 index 0000000..3ca362b --- /dev/null +++ b/src/assets/media/icons/svg/Home/Book-open.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Book-open + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Book.svg b/src/assets/media/icons/svg/Home/Book.svg new file mode 100644 index 0000000..5791599 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Book.svg @@ -0,0 +1,16 @@ + + + + Stockholm-icons / Home / Book + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Box.svg b/src/assets/media/icons/svg/Home/Box.svg new file mode 100644 index 0000000..4a82483 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Box.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Box + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Broom.svg b/src/assets/media/icons/svg/Home/Broom.svg new file mode 100644 index 0000000..2522253 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Broom.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Broom + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Building.svg b/src/assets/media/icons/svg/Home/Building.svg new file mode 100644 index 0000000..6595bd5 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Building.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Home / Building + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Bulb1.svg b/src/assets/media/icons/svg/Home/Bulb1.svg new file mode 100644 index 0000000..04856b1 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Bulb1.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Home / Bulb1 + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Bulb2.svg b/src/assets/media/icons/svg/Home/Bulb2.svg new file mode 100644 index 0000000..e999d8b --- /dev/null +++ b/src/assets/media/icons/svg/Home/Bulb2.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Home / Bulb2 + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Chair1.svg b/src/assets/media/icons/svg/Home/Chair1.svg new file mode 100644 index 0000000..2f5d804 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Chair1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Chair1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Chair2.svg b/src/assets/media/icons/svg/Home/Chair2.svg new file mode 100644 index 0000000..eb53508 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Chair2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Chair2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Clock.svg b/src/assets/media/icons/svg/Home/Clock.svg new file mode 100644 index 0000000..428c8ee --- /dev/null +++ b/src/assets/media/icons/svg/Home/Clock.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Clock + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Commode1.svg b/src/assets/media/icons/svg/Home/Commode1.svg new file mode 100644 index 0000000..4dd0163 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Commode1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Сommode#1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Commode2.svg b/src/assets/media/icons/svg/Home/Commode2.svg new file mode 100644 index 0000000..e34734a --- /dev/null +++ b/src/assets/media/icons/svg/Home/Commode2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Сommode#2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Couch.svg b/src/assets/media/icons/svg/Home/Couch.svg new file mode 100644 index 0000000..c253325 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Couch.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Couch + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Cupboard.svg b/src/assets/media/icons/svg/Home/Cupboard.svg new file mode 100644 index 0000000..194812f --- /dev/null +++ b/src/assets/media/icons/svg/Home/Cupboard.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Сupboard + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Curtains.svg b/src/assets/media/icons/svg/Home/Curtains.svg new file mode 100644 index 0000000..f18f821 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Curtains.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Сurtains + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Deer.svg b/src/assets/media/icons/svg/Home/Deer.svg new file mode 100644 index 0000000..123bac2 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Deer.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Deer + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Door-open.svg b/src/assets/media/icons/svg/Home/Door-open.svg new file mode 100644 index 0000000..c39ea7b --- /dev/null +++ b/src/assets/media/icons/svg/Home/Door-open.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Door-open + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Earth.svg b/src/assets/media/icons/svg/Home/Earth.svg new file mode 100644 index 0000000..28ad6ec --- /dev/null +++ b/src/assets/media/icons/svg/Home/Earth.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Earth + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Fireplace.svg b/src/assets/media/icons/svg/Home/Fireplace.svg new file mode 100644 index 0000000..8e53703 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Fireplace.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Fireplace + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Flashlight.svg b/src/assets/media/icons/svg/Home/Flashlight.svg new file mode 100644 index 0000000..b3eff4f --- /dev/null +++ b/src/assets/media/icons/svg/Home/Flashlight.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Flashlight + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Flower1.svg b/src/assets/media/icons/svg/Home/Flower1.svg new file mode 100644 index 0000000..de78697 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Flower1.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Home / Flower1 + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Flower2.svg b/src/assets/media/icons/svg/Home/Flower2.svg new file mode 100644 index 0000000..b6c75e5 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Flower2.svg @@ -0,0 +1,15 @@ + + + + Stockholm-icons / Home / Flower2 + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Flower3.svg b/src/assets/media/icons/svg/Home/Flower3.svg new file mode 100644 index 0000000..8dec94c --- /dev/null +++ b/src/assets/media/icons/svg/Home/Flower3.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Home / Flower3 + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Globe.svg b/src/assets/media/icons/svg/Home/Globe.svg new file mode 100644 index 0000000..4228b5d --- /dev/null +++ b/src/assets/media/icons/svg/Home/Globe.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Globe + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Home-heart.svg b/src/assets/media/icons/svg/Home/Home-heart.svg new file mode 100644 index 0000000..317fd31 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Home-heart.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Home-heart + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Home.svg b/src/assets/media/icons/svg/Home/Home.svg new file mode 100644 index 0000000..02b3475 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Home.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Home / Home + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Key.svg b/src/assets/media/icons/svg/Home/Key.svg new file mode 100644 index 0000000..bf8fe38 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Key.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Key + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Ladder.svg b/src/assets/media/icons/svg/Home/Ladder.svg new file mode 100644 index 0000000..3e2bc18 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Ladder.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Ladder + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Lamp1.svg b/src/assets/media/icons/svg/Home/Lamp1.svg new file mode 100644 index 0000000..e48a438 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Lamp1.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Home / Lamp1 + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Lamp2.svg b/src/assets/media/icons/svg/Home/Lamp2.svg new file mode 100644 index 0000000..5f873b6 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Lamp2.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Home / Lamp2 + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Library.svg b/src/assets/media/icons/svg/Home/Library.svg new file mode 100644 index 0000000..f0e598f --- /dev/null +++ b/src/assets/media/icons/svg/Home/Library.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Library + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Mailbox.svg b/src/assets/media/icons/svg/Home/Mailbox.svg new file mode 100644 index 0000000..712417b --- /dev/null +++ b/src/assets/media/icons/svg/Home/Mailbox.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Mailbox + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Mirror.svg b/src/assets/media/icons/svg/Home/Mirror.svg new file mode 100644 index 0000000..f28c563 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Mirror.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Mirror + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Picture.svg b/src/assets/media/icons/svg/Home/Picture.svg new file mode 100644 index 0000000..9f918ed --- /dev/null +++ b/src/assets/media/icons/svg/Home/Picture.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Home / Picture + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Ruller.svg b/src/assets/media/icons/svg/Home/Ruller.svg new file mode 100644 index 0000000..99aa7af --- /dev/null +++ b/src/assets/media/icons/svg/Home/Ruller.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Home / Ruller + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Stairs.svg b/src/assets/media/icons/svg/Home/Stairs.svg new file mode 100644 index 0000000..e479b46 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Stairs.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Home / Stairs + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Timer.svg b/src/assets/media/icons/svg/Home/Timer.svg new file mode 100644 index 0000000..81e0943 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Timer.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Home / Timer + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Toilet.svg b/src/assets/media/icons/svg/Home/Toilet.svg new file mode 100644 index 0000000..a9db592 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Toilet.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Toilet + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Towel.svg b/src/assets/media/icons/svg/Home/Towel.svg new file mode 100644 index 0000000..ebaec13 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Towel.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Home / Towel + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Trash.svg b/src/assets/media/icons/svg/Home/Trash.svg new file mode 100644 index 0000000..ab41ac9 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Trash.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Trash + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Water-mixer.svg b/src/assets/media/icons/svg/Home/Water-mixer.svg new file mode 100644 index 0000000..f0ca046 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Water-mixer.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Home / Water-mixer + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Weight1.svg b/src/assets/media/icons/svg/Home/Weight1.svg new file mode 100644 index 0000000..b73743f --- /dev/null +++ b/src/assets/media/icons/svg/Home/Weight1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Weight1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Weight2.svg b/src/assets/media/icons/svg/Home/Weight2.svg new file mode 100644 index 0000000..2c4bee5 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Weight2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Weight2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Wood-horse.svg b/src/assets/media/icons/svg/Home/Wood-horse.svg new file mode 100644 index 0000000..b92a6a4 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Wood-horse.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Home / Wood-horse + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Wood1.svg b/src/assets/media/icons/svg/Home/Wood1.svg new file mode 100644 index 0000000..7b5f5a9 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Wood1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Wood1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Home/Wood2.svg b/src/assets/media/icons/svg/Home/Wood2.svg new file mode 100644 index 0000000..f55c924 --- /dev/null +++ b/src/assets/media/icons/svg/Home/Wood2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Home / Wood2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Layout/Layout-3d.svg b/src/assets/media/icons/svg/Layout/Layout-3d.svg new file mode 100644 index 0000000..7b6e20d --- /dev/null +++ b/src/assets/media/icons/svg/Layout/Layout-3d.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Layout / Layout-3d + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Layout/Layout-4-blocks.svg b/src/assets/media/icons/svg/Layout/Layout-4-blocks.svg new file mode 100644 index 0000000..381c9d0 --- /dev/null +++ b/src/assets/media/icons/svg/Layout/Layout-4-blocks.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Layout / Layout-4-blocks + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Layout/Layout-arrange.svg b/src/assets/media/icons/svg/Layout/Layout-arrange.svg new file mode 100644 index 0000000..09e84d8 --- /dev/null +++ b/src/assets/media/icons/svg/Layout/Layout-arrange.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Layout / Layout-arrange + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Layout/Layout-grid.svg b/src/assets/media/icons/svg/Layout/Layout-grid.svg new file mode 100644 index 0000000..79afab2 --- /dev/null +++ b/src/assets/media/icons/svg/Layout/Layout-grid.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Layout / Layout-grid + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Layout/Layout-horizontal.svg b/src/assets/media/icons/svg/Layout/Layout-horizontal.svg new file mode 100644 index 0000000..eb3a46c --- /dev/null +++ b/src/assets/media/icons/svg/Layout/Layout-horizontal.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Layout / Layout-horizontal + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Layout/Layout-left-panel-1.svg b/src/assets/media/icons/svg/Layout/Layout-left-panel-1.svg new file mode 100644 index 0000000..a0eb537 --- /dev/null +++ b/src/assets/media/icons/svg/Layout/Layout-left-panel-1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Layout / Layout-left-panel-1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Layout/Layout-left-panel-2.svg b/src/assets/media/icons/svg/Layout/Layout-left-panel-2.svg new file mode 100644 index 0000000..05ceee8 --- /dev/null +++ b/src/assets/media/icons/svg/Layout/Layout-left-panel-2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Layout / Layout-left-panel-2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Layout/Layout-right-panel-1.svg b/src/assets/media/icons/svg/Layout/Layout-right-panel-1.svg new file mode 100644 index 0000000..7b45a01 --- /dev/null +++ b/src/assets/media/icons/svg/Layout/Layout-right-panel-1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Layout / Layout-right-panel-1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Layout/Layout-right-panel-2.svg b/src/assets/media/icons/svg/Layout/Layout-right-panel-2.svg new file mode 100644 index 0000000..df59430 --- /dev/null +++ b/src/assets/media/icons/svg/Layout/Layout-right-panel-2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Layout / Layout-right-panel-2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Layout/Layout-top-panel-1.svg b/src/assets/media/icons/svg/Layout/Layout-top-panel-1.svg new file mode 100644 index 0000000..4a270af --- /dev/null +++ b/src/assets/media/icons/svg/Layout/Layout-top-panel-1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Layout / Layout-top-panel-1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Layout/Layout-top-panel-2.svg b/src/assets/media/icons/svg/Layout/Layout-top-panel-2.svg new file mode 100644 index 0000000..26e74de --- /dev/null +++ b/src/assets/media/icons/svg/Layout/Layout-top-panel-2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Layout / Layout-top-panel-2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Layout/Layout-top-panel-3.svg b/src/assets/media/icons/svg/Layout/Layout-top-panel-3.svg new file mode 100644 index 0000000..4ade050 --- /dev/null +++ b/src/assets/media/icons/svg/Layout/Layout-top-panel-3.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Layout / Layout-top-panel-3 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Layout/Layout-top-panel-4.svg b/src/assets/media/icons/svg/Layout/Layout-top-panel-4.svg new file mode 100644 index 0000000..a032763 --- /dev/null +++ b/src/assets/media/icons/svg/Layout/Layout-top-panel-4.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Layout / Layout-top-panel-4 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Layout/Layout-top-panel-5.svg b/src/assets/media/icons/svg/Layout/Layout-top-panel-5.svg new file mode 100644 index 0000000..aec1b76 --- /dev/null +++ b/src/assets/media/icons/svg/Layout/Layout-top-panel-5.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Layout / Layout-top-panel-5 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Layout/Layout-top-panel-6.svg b/src/assets/media/icons/svg/Layout/Layout-top-panel-6.svg new file mode 100644 index 0000000..8b8cf26 --- /dev/null +++ b/src/assets/media/icons/svg/Layout/Layout-top-panel-6.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Layout / Layout-top-panel-6 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Layout/Layout-vertical.svg b/src/assets/media/icons/svg/Layout/Layout-vertical.svg new file mode 100644 index 0000000..ab51918 --- /dev/null +++ b/src/assets/media/icons/svg/Layout/Layout-vertical.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Layout / Layout-vertical + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Map/Compass.svg b/src/assets/media/icons/svg/Map/Compass.svg new file mode 100644 index 0000000..42e022e --- /dev/null +++ b/src/assets/media/icons/svg/Map/Compass.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Map / Compass + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Map/Direction1.svg b/src/assets/media/icons/svg/Map/Direction1.svg new file mode 100644 index 0000000..33d8aa0 --- /dev/null +++ b/src/assets/media/icons/svg/Map/Direction1.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Map / Direction1 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Map/Direction2.svg b/src/assets/media/icons/svg/Map/Direction2.svg new file mode 100644 index 0000000..70f042f --- /dev/null +++ b/src/assets/media/icons/svg/Map/Direction2.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Map / Direction2 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Map/Location-arrow.svg b/src/assets/media/icons/svg/Map/Location-arrow.svg new file mode 100644 index 0000000..d39783a --- /dev/null +++ b/src/assets/media/icons/svg/Map/Location-arrow.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Map / Location-arrow + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Map/Marker1.svg b/src/assets/media/icons/svg/Map/Marker1.svg new file mode 100644 index 0000000..9ec3852 --- /dev/null +++ b/src/assets/media/icons/svg/Map/Marker1.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Map / Marker1 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Map/Marker2.svg b/src/assets/media/icons/svg/Map/Marker2.svg new file mode 100644 index 0000000..9f4721f --- /dev/null +++ b/src/assets/media/icons/svg/Map/Marker2.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Map / Marker2 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Map/Position.svg b/src/assets/media/icons/svg/Map/Position.svg new file mode 100644 index 0000000..0478ed0 --- /dev/null +++ b/src/assets/media/icons/svg/Map/Position.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Map / Position + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Add-music.svg b/src/assets/media/icons/svg/Media/Add-music.svg new file mode 100644 index 0000000..f638ddc --- /dev/null +++ b/src/assets/media/icons/svg/Media/Add-music.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / Add-music + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Airplay-video.svg b/src/assets/media/icons/svg/Media/Airplay-video.svg new file mode 100644 index 0000000..09d36c0 --- /dev/null +++ b/src/assets/media/icons/svg/Media/Airplay-video.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / Airplay-video + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Airplay.svg b/src/assets/media/icons/svg/Media/Airplay.svg new file mode 100644 index 0000000..12fb9d1 --- /dev/null +++ b/src/assets/media/icons/svg/Media/Airplay.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / Airplay + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Back.svg b/src/assets/media/icons/svg/Media/Back.svg new file mode 100644 index 0000000..c61e765 --- /dev/null +++ b/src/assets/media/icons/svg/Media/Back.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / Back + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Backward.svg b/src/assets/media/icons/svg/Media/Backward.svg new file mode 100644 index 0000000..8e260ac --- /dev/null +++ b/src/assets/media/icons/svg/Media/Backward.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / Backward + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/CD.svg b/src/assets/media/icons/svg/Media/CD.svg new file mode 100644 index 0000000..30308ed --- /dev/null +++ b/src/assets/media/icons/svg/Media/CD.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / CD + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/DVD.svg b/src/assets/media/icons/svg/Media/DVD.svg new file mode 100644 index 0000000..9105c7e --- /dev/null +++ b/src/assets/media/icons/svg/Media/DVD.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / DVD + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Eject.svg b/src/assets/media/icons/svg/Media/Eject.svg new file mode 100644 index 0000000..ad42cee --- /dev/null +++ b/src/assets/media/icons/svg/Media/Eject.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / Eject + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Equalizer.svg b/src/assets/media/icons/svg/Media/Equalizer.svg new file mode 100644 index 0000000..14d2975 --- /dev/null +++ b/src/assets/media/icons/svg/Media/Equalizer.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Media / Equalizer + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Forward.svg b/src/assets/media/icons/svg/Media/Forward.svg new file mode 100644 index 0000000..ca9729c --- /dev/null +++ b/src/assets/media/icons/svg/Media/Forward.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / Forward + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Media-library1.svg b/src/assets/media/icons/svg/Media/Media-library1.svg new file mode 100644 index 0000000..7a8791a --- /dev/null +++ b/src/assets/media/icons/svg/Media/Media-library1.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Media / Media-library1 + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Media-library2.svg b/src/assets/media/icons/svg/Media/Media-library2.svg new file mode 100644 index 0000000..ab3ea3d --- /dev/null +++ b/src/assets/media/icons/svg/Media/Media-library2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / Media-library2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Media-library3.svg b/src/assets/media/icons/svg/Media/Media-library3.svg new file mode 100644 index 0000000..c57e814 --- /dev/null +++ b/src/assets/media/icons/svg/Media/Media-library3.svg @@ -0,0 +1,17 @@ + + + + Stockholm-icons / Media / Media-library3 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Movie-Lane2.svg b/src/assets/media/icons/svg/Media/Movie-Lane2.svg new file mode 100644 index 0000000..ceca20d --- /dev/null +++ b/src/assets/media/icons/svg/Media/Movie-Lane2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / Movie-Lane2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Movie-lane1.svg b/src/assets/media/icons/svg/Media/Movie-lane1.svg new file mode 100644 index 0000000..0ef807a --- /dev/null +++ b/src/assets/media/icons/svg/Media/Movie-lane1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / Movie-lane1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Music-cloud.svg b/src/assets/media/icons/svg/Media/Music-cloud.svg new file mode 100644 index 0000000..b46d473 --- /dev/null +++ b/src/assets/media/icons/svg/Media/Music-cloud.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / Music-cloud + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Music-note.svg b/src/assets/media/icons/svg/Media/Music-note.svg new file mode 100644 index 0000000..48d81b0 --- /dev/null +++ b/src/assets/media/icons/svg/Media/Music-note.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Media / Music-note + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Music.svg b/src/assets/media/icons/svg/Media/Music.svg new file mode 100644 index 0000000..3019e20 --- /dev/null +++ b/src/assets/media/icons/svg/Media/Music.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Media / Music + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Mute.svg b/src/assets/media/icons/svg/Media/Mute.svg new file mode 100644 index 0000000..8c44da2 --- /dev/null +++ b/src/assets/media/icons/svg/Media/Mute.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / Mute + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Next.svg b/src/assets/media/icons/svg/Media/Next.svg new file mode 100644 index 0000000..139e2ed --- /dev/null +++ b/src/assets/media/icons/svg/Media/Next.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / Next + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Pause.svg b/src/assets/media/icons/svg/Media/Pause.svg new file mode 100644 index 0000000..6b4f9e8 --- /dev/null +++ b/src/assets/media/icons/svg/Media/Pause.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Media / Pause + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Play.svg b/src/assets/media/icons/svg/Media/Play.svg new file mode 100644 index 0000000..1893cd0 --- /dev/null +++ b/src/assets/media/icons/svg/Media/Play.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Media / Play + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Playlist1.svg b/src/assets/media/icons/svg/Media/Playlist1.svg new file mode 100644 index 0000000..53c4792 --- /dev/null +++ b/src/assets/media/icons/svg/Media/Playlist1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / Playlist1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Playlist2.svg b/src/assets/media/icons/svg/Media/Playlist2.svg new file mode 100644 index 0000000..a0b3f06 --- /dev/null +++ b/src/assets/media/icons/svg/Media/Playlist2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / Playlist2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Rec.svg b/src/assets/media/icons/svg/Media/Rec.svg new file mode 100644 index 0000000..1a55770 --- /dev/null +++ b/src/assets/media/icons/svg/Media/Rec.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Media / Rec + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Repeat-one.svg b/src/assets/media/icons/svg/Media/Repeat-one.svg new file mode 100644 index 0000000..f13818d --- /dev/null +++ b/src/assets/media/icons/svg/Media/Repeat-one.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / Repeat-one + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Repeat.svg b/src/assets/media/icons/svg/Media/Repeat.svg new file mode 100644 index 0000000..ac197ca --- /dev/null +++ b/src/assets/media/icons/svg/Media/Repeat.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / Repeat + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Shuffle.svg b/src/assets/media/icons/svg/Media/Shuffle.svg new file mode 100644 index 0000000..9444aa9 --- /dev/null +++ b/src/assets/media/icons/svg/Media/Shuffle.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / Shuffle + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Volume-down.svg b/src/assets/media/icons/svg/Media/Volume-down.svg new file mode 100644 index 0000000..52660d0 --- /dev/null +++ b/src/assets/media/icons/svg/Media/Volume-down.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / Volume-down + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Volume-full.svg b/src/assets/media/icons/svg/Media/Volume-full.svg new file mode 100644 index 0000000..89337d2 --- /dev/null +++ b/src/assets/media/icons/svg/Media/Volume-full.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / Volume-full + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Volume-half.svg b/src/assets/media/icons/svg/Media/Volume-half.svg new file mode 100644 index 0000000..cf2ed17 --- /dev/null +++ b/src/assets/media/icons/svg/Media/Volume-half.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / Volume-half + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Volume-up.svg b/src/assets/media/icons/svg/Media/Volume-up.svg new file mode 100644 index 0000000..f3287b8 --- /dev/null +++ b/src/assets/media/icons/svg/Media/Volume-up.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / Volume-up + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Vynil.svg b/src/assets/media/icons/svg/Media/Vynil.svg new file mode 100644 index 0000000..ea85332 --- /dev/null +++ b/src/assets/media/icons/svg/Media/Vynil.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / Vynil + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Media/Youtube.svg b/src/assets/media/icons/svg/Media/Youtube.svg new file mode 100644 index 0000000..7b0f15e --- /dev/null +++ b/src/assets/media/icons/svg/Media/Youtube.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Media / Youtube + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Angle-double-down.svg b/src/assets/media/icons/svg/Navigation/Angle-double-down.svg new file mode 100644 index 0000000..ee58dae --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Angle-double-down.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Navigation / Angle-double-down + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Angle-double-left.svg b/src/assets/media/icons/svg/Navigation/Angle-double-left.svg new file mode 100644 index 0000000..2232ce7 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Angle-double-left.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Navigation / Angle-double-left + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Angle-double-right.svg b/src/assets/media/icons/svg/Navigation/Angle-double-right.svg new file mode 100644 index 0000000..0436793 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Angle-double-right.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Navigation / Angle-double-right + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Angle-double-up.svg b/src/assets/media/icons/svg/Navigation/Angle-double-up.svg new file mode 100644 index 0000000..51df107 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Angle-double-up.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Navigation / Angle-double-up + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Angle-down.svg b/src/assets/media/icons/svg/Navigation/Angle-down.svg new file mode 100644 index 0000000..653e108 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Angle-down.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Navigation / Angle-down + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Angle-left.svg b/src/assets/media/icons/svg/Navigation/Angle-left.svg new file mode 100644 index 0000000..e8dec27 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Angle-left.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Navigation / Angle-left + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Angle-right.svg b/src/assets/media/icons/svg/Navigation/Angle-right.svg new file mode 100644 index 0000000..6dfd092 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Angle-right.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Navigation / Angle-right + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Arrow-down.svg b/src/assets/media/icons/svg/Navigation/Arrow-down.svg new file mode 100644 index 0000000..4796767 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Arrow-down.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Navigation / Arrow-down + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Arrow-from-bottom.svg b/src/assets/media/icons/svg/Navigation/Arrow-from-bottom.svg new file mode 100644 index 0000000..07a9762 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Arrow-from-bottom.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Navigation / Arrow-from-bottom + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Arrow-from-left.svg b/src/assets/media/icons/svg/Navigation/Arrow-from-left.svg new file mode 100644 index 0000000..395d747 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Arrow-from-left.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Navigation / Arrow-from-left + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Arrow-from-right.svg b/src/assets/media/icons/svg/Navigation/Arrow-from-right.svg new file mode 100644 index 0000000..74d28a2 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Arrow-from-right.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Navigation / Arrow-from-right + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Arrow-from-top.svg b/src/assets/media/icons/svg/Navigation/Arrow-from-top.svg new file mode 100644 index 0000000..7093577 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Arrow-from-top.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Navigation / Arrow-from-top + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Arrow-left.svg b/src/assets/media/icons/svg/Navigation/Arrow-left.svg new file mode 100644 index 0000000..a00cdf9 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Arrow-left.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Navigation / Arrow-left + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Arrow-right.svg b/src/assets/media/icons/svg/Navigation/Arrow-right.svg new file mode 100644 index 0000000..dc90d92 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Arrow-right.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Navigation / Arrow-right + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Arrow-to-bottom.svg b/src/assets/media/icons/svg/Navigation/Arrow-to-bottom.svg new file mode 100644 index 0000000..0f82974 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Arrow-to-bottom.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Navigation / Arrow-to-bottom + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Arrow-to-left.svg b/src/assets/media/icons/svg/Navigation/Arrow-to-left.svg new file mode 100644 index 0000000..ea9d1b2 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Arrow-to-left.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Navigation / Arrow-to-left + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Arrow-to-right.svg b/src/assets/media/icons/svg/Navigation/Arrow-to-right.svg new file mode 100644 index 0000000..2cd0299 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Arrow-to-right.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Navigation / Arrow-to-right + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Arrow-to-up.svg b/src/assets/media/icons/svg/Navigation/Arrow-to-up.svg new file mode 100644 index 0000000..3d834b4 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Arrow-to-up.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Navigation / Arrow-to-up + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Arrow-up.svg b/src/assets/media/icons/svg/Navigation/Arrow-up.svg new file mode 100644 index 0000000..48b01cd --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Arrow-up.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Navigation / Arrow-up + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Arrows-h.svg b/src/assets/media/icons/svg/Navigation/Arrows-h.svg new file mode 100644 index 0000000..fdf60ee --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Arrows-h.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Navigation / Arrows-h + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Arrows-v.svg b/src/assets/media/icons/svg/Navigation/Arrows-v.svg new file mode 100644 index 0000000..c96f151 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Arrows-v.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Navigation / Arrows-v + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Check.svg b/src/assets/media/icons/svg/Navigation/Check.svg new file mode 100644 index 0000000..4c5882a --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Check.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Navigation / Check + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Close.svg b/src/assets/media/icons/svg/Navigation/Close.svg new file mode 100644 index 0000000..a7bc8eb --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Close.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Navigation / Close + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Double-check.svg b/src/assets/media/icons/svg/Navigation/Double-check.svg new file mode 100644 index 0000000..bc2a85d --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Double-check.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Navigation / Double-check + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Down-2.svg b/src/assets/media/icons/svg/Navigation/Down-2.svg new file mode 100644 index 0000000..aacf339 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Down-2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Navigation / Down-2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Down-left.svg b/src/assets/media/icons/svg/Navigation/Down-left.svg new file mode 100644 index 0000000..db6acee --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Down-left.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Navigation / Down-left + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Down-right.svg b/src/assets/media/icons/svg/Navigation/Down-right.svg new file mode 100644 index 0000000..68ab305 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Down-right.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Navigation / Down-right + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Exchange.svg b/src/assets/media/icons/svg/Navigation/Exchange.svg new file mode 100644 index 0000000..a0568fa --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Exchange.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Navigation / Exchange + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Left 3.svg b/src/assets/media/icons/svg/Navigation/Left 3.svg new file mode 100644 index 0000000..cb373f5 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Left 3.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Navigation / Left 3 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Left-2.svg b/src/assets/media/icons/svg/Navigation/Left-2.svg new file mode 100644 index 0000000..25acddc --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Left-2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Navigation / Left-2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Minus.svg b/src/assets/media/icons/svg/Navigation/Minus.svg new file mode 100644 index 0000000..7fcd816 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Minus.svg @@ -0,0 +1,10 @@ + + + + Stockholm-icons / Navigation / Minus + Created with Sketch. + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Plus.svg b/src/assets/media/icons/svg/Navigation/Plus.svg new file mode 100644 index 0000000..2ca255a --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Plus.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Navigation / Plus + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Right 3.svg b/src/assets/media/icons/svg/Navigation/Right 3.svg new file mode 100644 index 0000000..e0643a5 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Right 3.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Navigation / Right 3 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Right-2.svg b/src/assets/media/icons/svg/Navigation/Right-2.svg new file mode 100644 index 0000000..bc9dc09 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Right-2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Navigation / Right-2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Route.svg b/src/assets/media/icons/svg/Navigation/Route.svg new file mode 100644 index 0000000..c64f6aa --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Route.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Navigation / Route + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Sign-in.svg b/src/assets/media/icons/svg/Navigation/Sign-in.svg new file mode 100644 index 0000000..a78a04a --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Sign-in.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Navigation / Sign-in + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Sign-out.svg b/src/assets/media/icons/svg/Navigation/Sign-out.svg new file mode 100644 index 0000000..31a2578 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Sign-out.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Navigation / Sign-out + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Stockholm-icons/Navigation/Angle-up.svg b/src/assets/media/icons/svg/Navigation/Stockholm-icons/Navigation/Angle-up.svg new file mode 100644 index 0000000..47358f1 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Stockholm-icons/Navigation/Angle-up.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Navigation / Stockholm-icons / Navigation / Angle-up + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Up-2.svg b/src/assets/media/icons/svg/Navigation/Up-2.svg new file mode 100644 index 0000000..de65a7e --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Up-2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Navigation / Up-2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Up-down.svg b/src/assets/media/icons/svg/Navigation/Up-down.svg new file mode 100644 index 0000000..748aab8 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Up-down.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Navigation / Up-down + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Up-left.svg b/src/assets/media/icons/svg/Navigation/Up-left.svg new file mode 100644 index 0000000..aa39c1a --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Up-left.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Navigation / Up-left + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Up-right.svg b/src/assets/media/icons/svg/Navigation/Up-right.svg new file mode 100644 index 0000000..74a772a --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Up-right.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Navigation / Up-right + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Navigation/Waiting.svg b/src/assets/media/icons/svg/Navigation/Waiting.svg new file mode 100644 index 0000000..d9a72e6 --- /dev/null +++ b/src/assets/media/icons/svg/Navigation/Waiting.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Navigation / Waiting + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/ATM.svg b/src/assets/media/icons/svg/Shopping/ATM.svg new file mode 100644 index 0000000..7946f10 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/ATM.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / ATM + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Bag1.svg b/src/assets/media/icons/svg/Shopping/Bag1.svg new file mode 100644 index 0000000..7e951b4 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Bag1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / Bag1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Bag2.svg b/src/assets/media/icons/svg/Shopping/Bag2.svg new file mode 100644 index 0000000..ff5168b --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Bag2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / Bag2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Barcode-read.svg b/src/assets/media/icons/svg/Shopping/Barcode-read.svg new file mode 100644 index 0000000..6ecc941 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Barcode-read.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / Barcode-read + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Barcode-scan.svg b/src/assets/media/icons/svg/Shopping/Barcode-scan.svg new file mode 100644 index 0000000..5ab3bc1 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Barcode-scan.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Shopping / Barcode-scan + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Barcode.svg b/src/assets/media/icons/svg/Shopping/Barcode.svg new file mode 100644 index 0000000..b16cfa3 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Barcode.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / Barcode + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Bitcoin.svg b/src/assets/media/icons/svg/Shopping/Bitcoin.svg new file mode 100644 index 0000000..e7148e1 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Bitcoin.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Shopping / Bitcoin + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Box1.svg b/src/assets/media/icons/svg/Shopping/Box1.svg new file mode 100644 index 0000000..834a50d --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Box1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / Box1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Box2.svg b/src/assets/media/icons/svg/Shopping/Box2.svg new file mode 100644 index 0000000..be009e7 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Box2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / Box2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Box3.svg b/src/assets/media/icons/svg/Shopping/Box3.svg new file mode 100644 index 0000000..b987e39 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Box3.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / Box3 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Calculator.svg b/src/assets/media/icons/svg/Shopping/Calculator.svg new file mode 100644 index 0000000..145784d --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Calculator.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / Calculator + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Cart1.svg b/src/assets/media/icons/svg/Shopping/Cart1.svg new file mode 100644 index 0000000..a6317cc --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Cart1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / Cart1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Cart2.svg b/src/assets/media/icons/svg/Shopping/Cart2.svg new file mode 100644 index 0000000..2c86bcc --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Cart2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / Cart2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Cart3.svg b/src/assets/media/icons/svg/Shopping/Cart3.svg new file mode 100644 index 0000000..f6d1b94 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Cart3.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / Cart3 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Chart-bar1.svg b/src/assets/media/icons/svg/Shopping/Chart-bar1.svg new file mode 100644 index 0000000..008d7f1 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Chart-bar1.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Shopping / Chart-bar1 + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Chart-bar2.svg b/src/assets/media/icons/svg/Shopping/Chart-bar2.svg new file mode 100644 index 0000000..c1e936f --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Chart-bar2.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Shopping / Chart-bar2 + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Chart-bar3.svg b/src/assets/media/icons/svg/Shopping/Chart-bar3.svg new file mode 100644 index 0000000..375f4b9 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Chart-bar3.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Shopping / Chart-bar3 + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Chart-line1.svg b/src/assets/media/icons/svg/Shopping/Chart-line1.svg new file mode 100644 index 0000000..b66ede0 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Chart-line1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / Chart-line1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Chart-line2.svg b/src/assets/media/icons/svg/Shopping/Chart-line2.svg new file mode 100644 index 0000000..1c66a98 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Chart-line2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / Chart-line2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Chart-pie.svg b/src/assets/media/icons/svg/Shopping/Chart-pie.svg new file mode 100644 index 0000000..c591b9b --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Chart-pie.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / Chart-pie + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Credit-card.svg b/src/assets/media/icons/svg/Shopping/Credit-card.svg new file mode 100644 index 0000000..40e190b --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Credit-card.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Shopping / Credit-card + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Dollar.svg b/src/assets/media/icons/svg/Shopping/Dollar.svg new file mode 100644 index 0000000..28b88d4 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Dollar.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Shopping / Dollar + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Euro.svg b/src/assets/media/icons/svg/Shopping/Euro.svg new file mode 100644 index 0000000..ce2c812 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Euro.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / Euro + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Gift.svg b/src/assets/media/icons/svg/Shopping/Gift.svg new file mode 100644 index 0000000..ac23b0f --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Gift.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / Gift + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Loader.svg b/src/assets/media/icons/svg/Shopping/Loader.svg new file mode 100644 index 0000000..f31d436 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Loader.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Shopping / Loader + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/MC.svg b/src/assets/media/icons/svg/Shopping/MC.svg new file mode 100644 index 0000000..6f381d6 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/MC.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / MC + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Money.svg b/src/assets/media/icons/svg/Shopping/Money.svg new file mode 100644 index 0000000..ce62ec4 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Money.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / Money + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Pound.svg b/src/assets/media/icons/svg/Shopping/Pound.svg new file mode 100644 index 0000000..1235ca0 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Pound.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / Pound + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Price1.svg b/src/assets/media/icons/svg/Shopping/Price1.svg new file mode 100644 index 0000000..208392e --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Price1.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Shopping / Price1 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Price2.svg b/src/assets/media/icons/svg/Shopping/Price2.svg new file mode 100644 index 0000000..3fea6a7 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Price2.svg @@ -0,0 +1,15 @@ + + + + Stockholm-icons / Shopping / Price2 + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Rouble.svg b/src/assets/media/icons/svg/Shopping/Rouble.svg new file mode 100644 index 0000000..ddce1a6 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Rouble.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / Rouble + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Safe.svg b/src/assets/media/icons/svg/Shopping/Safe.svg new file mode 100644 index 0000000..edaf603 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Safe.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / Safe + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Sale1.svg b/src/assets/media/icons/svg/Shopping/Sale1.svg new file mode 100644 index 0000000..5a0d199 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Sale1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / Sale1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Sale2.svg b/src/assets/media/icons/svg/Shopping/Sale2.svg new file mode 100644 index 0000000..51eb237 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Sale2.svg @@ -0,0 +1,14 @@ + + + + Stockholm-icons / Shopping / Sale2 + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Settings.svg b/src/assets/media/icons/svg/Shopping/Settings.svg new file mode 100644 index 0000000..27c4940 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Settings.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / Settings + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Sort1.svg b/src/assets/media/icons/svg/Shopping/Sort1.svg new file mode 100644 index 0000000..4cd7cba --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Sort1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / Sort1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Sort2.svg b/src/assets/media/icons/svg/Shopping/Sort2.svg new file mode 100644 index 0000000..c28f3df --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Sort2.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Shopping / Sort2 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Sort3.svg b/src/assets/media/icons/svg/Shopping/Sort3.svg new file mode 100644 index 0000000..3f2716f --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Sort3.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Shopping / Sort3 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Ticket.svg b/src/assets/media/icons/svg/Shopping/Ticket.svg new file mode 100644 index 0000000..4b6a41f --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Ticket.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Shopping / Ticket + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Wallet.svg b/src/assets/media/icons/svg/Shopping/Wallet.svg new file mode 100644 index 0000000..0ccd823 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Wallet.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Shopping / Wallet + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Wallet2.svg b/src/assets/media/icons/svg/Shopping/Wallet2.svg new file mode 100644 index 0000000..9fb6f9b --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Wallet2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Shopping / Wallet2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Shopping/Wallet3.svg b/src/assets/media/icons/svg/Shopping/Wallet3.svg new file mode 100644 index 0000000..c98fc54 --- /dev/null +++ b/src/assets/media/icons/svg/Shopping/Wallet3.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Shopping / Wallet3 + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/Align-auto.svg b/src/assets/media/icons/svg/Text/Align-auto.svg new file mode 100644 index 0000000..2a92aaa --- /dev/null +++ b/src/assets/media/icons/svg/Text/Align-auto.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Text / Align-auto + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/Align-center.svg b/src/assets/media/icons/svg/Text/Align-center.svg new file mode 100644 index 0000000..32d0122 --- /dev/null +++ b/src/assets/media/icons/svg/Text/Align-center.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Text / Align-center + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/Align-justify.svg b/src/assets/media/icons/svg/Text/Align-justify.svg new file mode 100644 index 0000000..59a195a --- /dev/null +++ b/src/assets/media/icons/svg/Text/Align-justify.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Text / Align-justify + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/Align-left.svg b/src/assets/media/icons/svg/Text/Align-left.svg new file mode 100644 index 0000000..3e56fe6 --- /dev/null +++ b/src/assets/media/icons/svg/Text/Align-left.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Text / Align-left + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/Align-right.svg b/src/assets/media/icons/svg/Text/Align-right.svg new file mode 100644 index 0000000..4095017 --- /dev/null +++ b/src/assets/media/icons/svg/Text/Align-right.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Text / Align-right + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/Article.svg b/src/assets/media/icons/svg/Text/Article.svg new file mode 100644 index 0000000..803106e --- /dev/null +++ b/src/assets/media/icons/svg/Text/Article.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Text / Article + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/Bold.svg b/src/assets/media/icons/svg/Text/Bold.svg new file mode 100644 index 0000000..f48e1ff --- /dev/null +++ b/src/assets/media/icons/svg/Text/Bold.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Text / Bold + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/Bullet-list.svg b/src/assets/media/icons/svg/Text/Bullet-list.svg new file mode 100644 index 0000000..000c8b7 --- /dev/null +++ b/src/assets/media/icons/svg/Text/Bullet-list.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Text / Bullet-list + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/Code.svg b/src/assets/media/icons/svg/Text/Code.svg new file mode 100644 index 0000000..22ca48d --- /dev/null +++ b/src/assets/media/icons/svg/Text/Code.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Text / Code + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/Edit-text.svg b/src/assets/media/icons/svg/Text/Edit-text.svg new file mode 100644 index 0000000..39be36b --- /dev/null +++ b/src/assets/media/icons/svg/Text/Edit-text.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Text / Edit-text + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/Filter.svg b/src/assets/media/icons/svg/Text/Filter.svg new file mode 100644 index 0000000..8f02aff --- /dev/null +++ b/src/assets/media/icons/svg/Text/Filter.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Text / Filter + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/Font.svg b/src/assets/media/icons/svg/Text/Font.svg new file mode 100644 index 0000000..3452d43 --- /dev/null +++ b/src/assets/media/icons/svg/Text/Font.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Text / Font + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/H1.svg b/src/assets/media/icons/svg/Text/H1.svg new file mode 100644 index 0000000..3c58e0e --- /dev/null +++ b/src/assets/media/icons/svg/Text/H1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Text / H1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/H2.svg b/src/assets/media/icons/svg/Text/H2.svg new file mode 100644 index 0000000..7b042a4 --- /dev/null +++ b/src/assets/media/icons/svg/Text/H2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Text / H2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/Itallic.svg b/src/assets/media/icons/svg/Text/Itallic.svg new file mode 100644 index 0000000..38bf68c --- /dev/null +++ b/src/assets/media/icons/svg/Text/Itallic.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Text / Itallic + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/Menu.svg b/src/assets/media/icons/svg/Text/Menu.svg new file mode 100644 index 0000000..76ae9fe --- /dev/null +++ b/src/assets/media/icons/svg/Text/Menu.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Text / Menu + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/Paragraph.svg b/src/assets/media/icons/svg/Text/Paragraph.svg new file mode 100644 index 0000000..2f2d420 --- /dev/null +++ b/src/assets/media/icons/svg/Text/Paragraph.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Text / Paragraph + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/Quote1.svg b/src/assets/media/icons/svg/Text/Quote1.svg new file mode 100644 index 0000000..8d81313 --- /dev/null +++ b/src/assets/media/icons/svg/Text/Quote1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Text / Quote1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/Quote2.svg b/src/assets/media/icons/svg/Text/Quote2.svg new file mode 100644 index 0000000..97c543b --- /dev/null +++ b/src/assets/media/icons/svg/Text/Quote2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Text / Quote2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/Redo.svg b/src/assets/media/icons/svg/Text/Redo.svg new file mode 100644 index 0000000..17746d4 --- /dev/null +++ b/src/assets/media/icons/svg/Text/Redo.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Text / Redo + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/Strikethrough.svg b/src/assets/media/icons/svg/Text/Strikethrough.svg new file mode 100644 index 0000000..a631f77 --- /dev/null +++ b/src/assets/media/icons/svg/Text/Strikethrough.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Text / Strikethrough + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/Text-height.svg b/src/assets/media/icons/svg/Text/Text-height.svg new file mode 100644 index 0000000..4a934fc --- /dev/null +++ b/src/assets/media/icons/svg/Text/Text-height.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Text / Text-height + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/Text-width.svg b/src/assets/media/icons/svg/Text/Text-width.svg new file mode 100644 index 0000000..e76ae33 --- /dev/null +++ b/src/assets/media/icons/svg/Text/Text-width.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Text / Text-width + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/Text.svg b/src/assets/media/icons/svg/Text/Text.svg new file mode 100644 index 0000000..9b64d10 --- /dev/null +++ b/src/assets/media/icons/svg/Text/Text.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Text / Text + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/Underline.svg b/src/assets/media/icons/svg/Text/Underline.svg new file mode 100644 index 0000000..5236a8c --- /dev/null +++ b/src/assets/media/icons/svg/Text/Underline.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Text / Underline + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Text/Undo.svg b/src/assets/media/icons/svg/Text/Undo.svg new file mode 100644 index 0000000..eaadbc6 --- /dev/null +++ b/src/assets/media/icons/svg/Text/Undo.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Text / Undo + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Tools/Angle Grinder.svg b/src/assets/media/icons/svg/Tools/Angle Grinder.svg new file mode 100644 index 0000000..fe5bbe8 --- /dev/null +++ b/src/assets/media/icons/svg/Tools/Angle Grinder.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Tools / Angle Grinder + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Tools/Axe.svg b/src/assets/media/icons/svg/Tools/Axe.svg new file mode 100644 index 0000000..3a94597 --- /dev/null +++ b/src/assets/media/icons/svg/Tools/Axe.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Tools / Axe + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Tools/Brush.svg b/src/assets/media/icons/svg/Tools/Brush.svg new file mode 100644 index 0000000..11169e6 --- /dev/null +++ b/src/assets/media/icons/svg/Tools/Brush.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Tools / Brush + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Tools/Compass.svg b/src/assets/media/icons/svg/Tools/Compass.svg new file mode 100644 index 0000000..de9ed08 --- /dev/null +++ b/src/assets/media/icons/svg/Tools/Compass.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Tools / Compass + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Tools/Hummer.svg b/src/assets/media/icons/svg/Tools/Hummer.svg new file mode 100644 index 0000000..66a9a5e --- /dev/null +++ b/src/assets/media/icons/svg/Tools/Hummer.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Tools / Hummer + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Tools/Hummer2.svg b/src/assets/media/icons/svg/Tools/Hummer2.svg new file mode 100644 index 0000000..c6d4b86 --- /dev/null +++ b/src/assets/media/icons/svg/Tools/Hummer2.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Tools / Hummer2 + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Tools/Pantone.svg b/src/assets/media/icons/svg/Tools/Pantone.svg new file mode 100644 index 0000000..5d506a4 --- /dev/null +++ b/src/assets/media/icons/svg/Tools/Pantone.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Tools / Pantone + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Tools/Road-Cone.svg b/src/assets/media/icons/svg/Tools/Road-Cone.svg new file mode 100644 index 0000000..85d009e --- /dev/null +++ b/src/assets/media/icons/svg/Tools/Road-Cone.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Tools / Road-Cone + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Tools/Roller.svg b/src/assets/media/icons/svg/Tools/Roller.svg new file mode 100644 index 0000000..fbcd30a --- /dev/null +++ b/src/assets/media/icons/svg/Tools/Roller.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Tools / Roller + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Tools/Roulette.svg b/src/assets/media/icons/svg/Tools/Roulette.svg new file mode 100644 index 0000000..dfba78c --- /dev/null +++ b/src/assets/media/icons/svg/Tools/Roulette.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Tools / Roulette + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Tools/Screwdriver.svg b/src/assets/media/icons/svg/Tools/Screwdriver.svg new file mode 100644 index 0000000..5aa6e2f --- /dev/null +++ b/src/assets/media/icons/svg/Tools/Screwdriver.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Tools / Screwdriver + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Tools/Shovel.svg b/src/assets/media/icons/svg/Tools/Shovel.svg new file mode 100644 index 0000000..9bd1aaa --- /dev/null +++ b/src/assets/media/icons/svg/Tools/Shovel.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Tools / Shovel + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Tools/Spatula.svg b/src/assets/media/icons/svg/Tools/Spatula.svg new file mode 100644 index 0000000..1fef5a2 --- /dev/null +++ b/src/assets/media/icons/svg/Tools/Spatula.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Tools / Spatula + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Tools/Swiss-knife.svg b/src/assets/media/icons/svg/Tools/Swiss-knife.svg new file mode 100644 index 0000000..40a634b --- /dev/null +++ b/src/assets/media/icons/svg/Tools/Swiss-knife.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Tools / Swiss-knife + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Tools/Tools.svg b/src/assets/media/icons/svg/Tools/Tools.svg new file mode 100644 index 0000000..44115c9 --- /dev/null +++ b/src/assets/media/icons/svg/Tools/Tools.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Tools / Tools + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Celcium.svg b/src/assets/media/icons/svg/Weather/Celcium.svg new file mode 100644 index 0000000..0e1d816 --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Celcium.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Celcium + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Cloud-fog.svg b/src/assets/media/icons/svg/Weather/Cloud-fog.svg new file mode 100644 index 0000000..7150ee8 --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Cloud-fog.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Cloud-fog + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Cloud-sun.svg b/src/assets/media/icons/svg/Weather/Cloud-sun.svg new file mode 100644 index 0000000..25045fd --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Cloud-sun.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Cloud-sun + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Cloud-wind.svg b/src/assets/media/icons/svg/Weather/Cloud-wind.svg new file mode 100644 index 0000000..39c768d --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Cloud-wind.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Weather / Cloud-wind + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Cloud1.svg b/src/assets/media/icons/svg/Weather/Cloud1.svg new file mode 100644 index 0000000..ee8b8c6 --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Cloud1.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Weather / Cloud1 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Cloud2.svg b/src/assets/media/icons/svg/Weather/Cloud2.svg new file mode 100644 index 0000000..0e3e99a --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Cloud2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Cloud2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Cloudy-night.svg b/src/assets/media/icons/svg/Weather/Cloudy-night.svg new file mode 100644 index 0000000..180fe4d --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Cloudy-night.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Cloudy-night + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Cloudy.svg b/src/assets/media/icons/svg/Weather/Cloudy.svg new file mode 100644 index 0000000..8ec7ee6 --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Cloudy.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Cloudy + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Day-rain.svg b/src/assets/media/icons/svg/Weather/Day-rain.svg new file mode 100644 index 0000000..919502a --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Day-rain.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Day-rain + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Fahrenheit.svg b/src/assets/media/icons/svg/Weather/Fahrenheit.svg new file mode 100644 index 0000000..ef74e20 --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Fahrenheit.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Fahrenheit + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Fog.svg b/src/assets/media/icons/svg/Weather/Fog.svg new file mode 100644 index 0000000..e9bf37d --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Fog.svg @@ -0,0 +1,16 @@ + + + + Stockholm-icons / Weather / Fog + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Moon.svg b/src/assets/media/icons/svg/Weather/Moon.svg new file mode 100644 index 0000000..f6a77a3 --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Moon.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Weather / Moon + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Night-fog.svg b/src/assets/media/icons/svg/Weather/Night-fog.svg new file mode 100644 index 0000000..df98d1d --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Night-fog.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Night-fog + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Night-rain.svg b/src/assets/media/icons/svg/Weather/Night-rain.svg new file mode 100644 index 0000000..71a5904 --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Night-rain.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Night-rain + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Rain1.svg b/src/assets/media/icons/svg/Weather/Rain1.svg new file mode 100644 index 0000000..d5aa4de --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Rain1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Rain1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Rain2.svg b/src/assets/media/icons/svg/Weather/Rain2.svg new file mode 100644 index 0000000..0491e00 --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Rain2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Rain2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Rain5.svg b/src/assets/media/icons/svg/Weather/Rain5.svg new file mode 100644 index 0000000..db497ce --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Rain5.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Rain5 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Rainbow.svg b/src/assets/media/icons/svg/Weather/Rainbow.svg new file mode 100644 index 0000000..78fc805 --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Rainbow.svg @@ -0,0 +1,13 @@ + + + + Stockholm-icons / Weather / Rainbow + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Snow.svg b/src/assets/media/icons/svg/Weather/Snow.svg new file mode 100644 index 0000000..ab92291 --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Snow.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Snow + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Snow1.svg b/src/assets/media/icons/svg/Weather/Snow1.svg new file mode 100644 index 0000000..b5887fb --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Snow1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Snow1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Snow2.svg b/src/assets/media/icons/svg/Weather/Snow2.svg new file mode 100644 index 0000000..00f516e --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Snow2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Snow2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Snow3.svg b/src/assets/media/icons/svg/Weather/Snow3.svg new file mode 100644 index 0000000..a51ad11 --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Snow3.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Snow3 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Storm.svg b/src/assets/media/icons/svg/Weather/Storm.svg new file mode 100644 index 0000000..e76a8a2 --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Storm.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Storm + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Sun-fog.svg b/src/assets/media/icons/svg/Weather/Sun-fog.svg new file mode 100644 index 0000000..a30b6f5 --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Sun-fog.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Sun-fog + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Sun.svg b/src/assets/media/icons/svg/Weather/Sun.svg new file mode 100644 index 0000000..07cb0df --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Sun.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Sun + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Suset1.svg b/src/assets/media/icons/svg/Weather/Suset1.svg new file mode 100644 index 0000000..8cdb953 --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Suset1.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Suset1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Suset2.svg b/src/assets/media/icons/svg/Weather/Suset2.svg new file mode 100644 index 0000000..eb61445 --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Suset2.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Suset2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Temperature-empty.svg b/src/assets/media/icons/svg/Weather/Temperature-empty.svg new file mode 100644 index 0000000..81e129d --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Temperature-empty.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Weather / Temperature-empty + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Temperature-full.svg b/src/assets/media/icons/svg/Weather/Temperature-full.svg new file mode 100644 index 0000000..e73c3ad --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Temperature-full.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Weather / Temperature-full + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Temperature-half.svg b/src/assets/media/icons/svg/Weather/Temperature-half.svg new file mode 100644 index 0000000..2c9e229 --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Temperature-half.svg @@ -0,0 +1,11 @@ + + + + Stockholm-icons / Weather / Temperature-half + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Thunder-night.svg b/src/assets/media/icons/svg/Weather/Thunder-night.svg new file mode 100644 index 0000000..8b9a91b --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Thunder-night.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Thunder-night + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Thunder.svg b/src/assets/media/icons/svg/Weather/Thunder.svg new file mode 100644 index 0000000..d79865b --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Thunder.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Thunder + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Umbrella.svg b/src/assets/media/icons/svg/Weather/Umbrella.svg new file mode 100644 index 0000000..9454d51 --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Umbrella.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Umbrella + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/svg/Weather/Wind.svg b/src/assets/media/icons/svg/Weather/Wind.svg new file mode 100644 index 0000000..35c4d70 --- /dev/null +++ b/src/assets/media/icons/svg/Weather/Wind.svg @@ -0,0 +1,12 @@ + + + + Stockholm-icons / Weather / Wind + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/assets/media/icons/warning.svg b/src/assets/media/icons/warning.svg new file mode 100644 index 0000000..4b32e50 --- /dev/null +++ b/src/assets/media/icons/warning.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/media/illustrations/contact.svg b/src/assets/media/illustrations/contact.svg new file mode 100644 index 0000000..5dca3f8 --- /dev/null +++ b/src/assets/media/illustrations/contact.svg @@ -0,0 +1 @@ +contact us \ No newline at end of file diff --git a/src/assets/media/illustrations/data-points.svg b/src/assets/media/illustrations/data-points.svg new file mode 100644 index 0000000..f0ef9f6 --- /dev/null +++ b/src/assets/media/illustrations/data-points.svg @@ -0,0 +1 @@ +Data points \ No newline at end of file diff --git a/src/assets/media/illustrations/working.svg b/src/assets/media/illustrations/working.svg new file mode 100644 index 0000000..d29b860 --- /dev/null +++ b/src/assets/media/illustrations/working.svg @@ -0,0 +1 @@ +Working \ No newline at end of file diff --git a/src/assets/media/logos/favicon.ico b/src/assets/media/logos/favicon.ico new file mode 100644 index 0000000..0b56cb2 Binary files /dev/null and b/src/assets/media/logos/favicon.ico differ diff --git a/src/assets/media/logos/logo-10-sm.png b/src/assets/media/logos/logo-10-sm.png new file mode 100644 index 0000000..b09b183 Binary files /dev/null and b/src/assets/media/logos/logo-10-sm.png differ diff --git a/src/assets/media/logos/logo-10.png b/src/assets/media/logos/logo-10.png new file mode 100644 index 0000000..7320ba7 Binary files /dev/null and b/src/assets/media/logos/logo-10.png differ diff --git a/src/assets/media/logos/logo-11-sm.png b/src/assets/media/logos/logo-11-sm.png new file mode 100644 index 0000000..6a0b614 Binary files /dev/null and b/src/assets/media/logos/logo-11-sm.png differ diff --git a/src/assets/media/logos/logo-11.png b/src/assets/media/logos/logo-11.png new file mode 100644 index 0000000..6a0b614 Binary files /dev/null and b/src/assets/media/logos/logo-11.png differ diff --git a/src/assets/media/logos/logo-12.png b/src/assets/media/logos/logo-12.png new file mode 100644 index 0000000..1cb3eee Binary files /dev/null and b/src/assets/media/logos/logo-12.png differ diff --git a/src/assets/media/logos/logo-2-sm.png b/src/assets/media/logos/logo-2-sm.png new file mode 100644 index 0000000..bea9840 Binary files /dev/null and b/src/assets/media/logos/logo-2-sm.png differ diff --git a/src/assets/media/logos/logo-2.png b/src/assets/media/logos/logo-2.png new file mode 100644 index 0000000..e561ef9 Binary files /dev/null and b/src/assets/media/logos/logo-2.png differ diff --git a/src/assets/media/logos/logo-3.png b/src/assets/media/logos/logo-3.png new file mode 100644 index 0000000..c8971b9 Binary files /dev/null and b/src/assets/media/logos/logo-3.png differ diff --git a/src/assets/media/logos/logo-4-sm.png b/src/assets/media/logos/logo-4-sm.png new file mode 100644 index 0000000..5aac583 Binary files /dev/null and b/src/assets/media/logos/logo-4-sm.png differ diff --git a/src/assets/media/logos/logo-4.png b/src/assets/media/logos/logo-4.png new file mode 100644 index 0000000..612b4a1 Binary files /dev/null and b/src/assets/media/logos/logo-4.png differ diff --git a/src/assets/media/logos/logo-5-sm.png b/src/assets/media/logos/logo-5-sm.png new file mode 100644 index 0000000..54e17b5 Binary files /dev/null and b/src/assets/media/logos/logo-5-sm.png differ diff --git a/src/assets/media/logos/logo-5.png b/src/assets/media/logos/logo-5.png new file mode 100644 index 0000000..727bdff Binary files /dev/null and b/src/assets/media/logos/logo-5.png differ diff --git a/src/assets/media/logos/logo-6-sm.png b/src/assets/media/logos/logo-6-sm.png new file mode 100644 index 0000000..858d09d Binary files /dev/null and b/src/assets/media/logos/logo-6-sm.png differ diff --git a/src/assets/media/logos/logo-6.png b/src/assets/media/logos/logo-6.png new file mode 100644 index 0000000..b2551f9 Binary files /dev/null and b/src/assets/media/logos/logo-6.png differ diff --git a/src/assets/media/logos/logo-7-sm.png b/src/assets/media/logos/logo-7-sm.png new file mode 100644 index 0000000..858d09d Binary files /dev/null and b/src/assets/media/logos/logo-7-sm.png differ diff --git a/src/assets/media/logos/logo-7.png b/src/assets/media/logos/logo-7.png new file mode 100644 index 0000000..b2551f9 Binary files /dev/null and b/src/assets/media/logos/logo-7.png differ diff --git a/src/assets/media/logos/logo-8-inverse.png b/src/assets/media/logos/logo-8-inverse.png new file mode 100644 index 0000000..fbca3ac Binary files /dev/null and b/src/assets/media/logos/logo-8-inverse.png differ diff --git a/src/assets/media/logos/logo-8-sm.png b/src/assets/media/logos/logo-8-sm.png new file mode 100644 index 0000000..5aac583 Binary files /dev/null and b/src/assets/media/logos/logo-8-sm.png differ diff --git a/src/assets/media/logos/logo-8.png b/src/assets/media/logos/logo-8.png new file mode 100644 index 0000000..903cb05 Binary files /dev/null and b/src/assets/media/logos/logo-8.png differ diff --git a/src/assets/media/logos/logo-9-sm.png b/src/assets/media/logos/logo-9-sm.png new file mode 100644 index 0000000..0380384 Binary files /dev/null and b/src/assets/media/logos/logo-9-sm.png differ diff --git a/src/assets/media/logos/logo-9.png b/src/assets/media/logos/logo-9.png new file mode 100644 index 0000000..b206dab Binary files /dev/null and b/src/assets/media/logos/logo-9.png differ diff --git a/src/assets/media/logos/logo-dark-sm.png b/src/assets/media/logos/logo-dark-sm.png new file mode 100644 index 0000000..9d79742 Binary files /dev/null and b/src/assets/media/logos/logo-dark-sm.png differ diff --git a/src/assets/media/logos/logo-dark.png b/src/assets/media/logos/logo-dark.png new file mode 100644 index 0000000..7bf2dc8 Binary files /dev/null and b/src/assets/media/logos/logo-dark.png differ diff --git a/src/assets/media/logos/logo-light-sm.png b/src/assets/media/logos/logo-light-sm.png new file mode 100644 index 0000000..826d674 Binary files /dev/null and b/src/assets/media/logos/logo-light-sm.png differ diff --git a/src/assets/media/logos/logo-light.png b/src/assets/media/logos/logo-light.png new file mode 100644 index 0000000..fbf25c5 Binary files /dev/null and b/src/assets/media/logos/logo-light.png differ diff --git a/src/assets/media/logos/logo-mini-2-md.png b/src/assets/media/logos/logo-mini-2-md.png new file mode 100644 index 0000000..922df23 Binary files /dev/null and b/src/assets/media/logos/logo-mini-2-md.png differ diff --git a/src/assets/media/logos/logo-mini-lg.png b/src/assets/media/logos/logo-mini-lg.png new file mode 100644 index 0000000..48318a0 Binary files /dev/null and b/src/assets/media/logos/logo-mini-lg.png differ diff --git a/src/assets/media/logos/logo-mini-md.png b/src/assets/media/logos/logo-mini-md.png new file mode 100644 index 0000000..7652688 Binary files /dev/null and b/src/assets/media/logos/logo-mini-md.png differ diff --git a/src/assets/media/logos/logo-mini-sm.png b/src/assets/media/logos/logo-mini-sm.png new file mode 100644 index 0000000..5d4259c Binary files /dev/null and b/src/assets/media/logos/logo-mini-sm.png differ diff --git a/src/assets/media/logos/warning.jpg b/src/assets/media/logos/warning.jpg new file mode 100644 index 0000000..8d2edbe Binary files /dev/null and b/src/assets/media/logos/warning.jpg differ diff --git a/src/assets/media/logos/warning.png b/src/assets/media/logos/warning.png new file mode 100644 index 0000000..9775241 Binary files /dev/null and b/src/assets/media/logos/warning.png differ diff --git a/src/assets/media/misc/bg-1.jpg b/src/assets/media/misc/bg-1.jpg new file mode 100644 index 0000000..447eea1 Binary files /dev/null and b/src/assets/media/misc/bg-1.jpg differ diff --git a/src/assets/media/misc/bg-2.jpg b/src/assets/media/misc/bg-2.jpg new file mode 100644 index 0000000..9ed31e9 Binary files /dev/null and b/src/assets/media/misc/bg-2.jpg differ diff --git a/src/assets/media/plugins/jstree/32px.png b/src/assets/media/plugins/jstree/32px.png new file mode 100644 index 0000000..4bc79e6 Binary files /dev/null and b/src/assets/media/plugins/jstree/32px.png differ diff --git a/src/assets/media/products/product1.jpg b/src/assets/media/products/product1.jpg new file mode 100644 index 0000000..a4cf1c7 Binary files /dev/null and b/src/assets/media/products/product1.jpg differ diff --git a/src/assets/media/products/product10.jpg b/src/assets/media/products/product10.jpg new file mode 100644 index 0000000..a43517e Binary files /dev/null and b/src/assets/media/products/product10.jpg differ diff --git a/src/assets/media/products/product11.jpg b/src/assets/media/products/product11.jpg new file mode 100644 index 0000000..9a7e2f6 Binary files /dev/null and b/src/assets/media/products/product11.jpg differ diff --git a/src/assets/media/products/product12.jpg b/src/assets/media/products/product12.jpg new file mode 100644 index 0000000..7e88d26 Binary files /dev/null and b/src/assets/media/products/product12.jpg differ diff --git a/src/assets/media/products/product13.jpg b/src/assets/media/products/product13.jpg new file mode 100644 index 0000000..e3301fa Binary files /dev/null and b/src/assets/media/products/product13.jpg differ diff --git a/src/assets/media/products/product14.jpg b/src/assets/media/products/product14.jpg new file mode 100644 index 0000000..4a118c1 Binary files /dev/null and b/src/assets/media/products/product14.jpg differ diff --git a/src/assets/media/products/product15.jpg b/src/assets/media/products/product15.jpg new file mode 100644 index 0000000..6d2b247 Binary files /dev/null and b/src/assets/media/products/product15.jpg differ diff --git a/src/assets/media/products/product16.jpg b/src/assets/media/products/product16.jpg new file mode 100644 index 0000000..caa20dc Binary files /dev/null and b/src/assets/media/products/product16.jpg differ diff --git a/src/assets/media/products/product17.jpg b/src/assets/media/products/product17.jpg new file mode 100644 index 0000000..fb7539d Binary files /dev/null and b/src/assets/media/products/product17.jpg differ diff --git a/src/assets/media/products/product18.jpg b/src/assets/media/products/product18.jpg new file mode 100644 index 0000000..11c69e0 Binary files /dev/null and b/src/assets/media/products/product18.jpg differ diff --git a/src/assets/media/products/product19.jpg b/src/assets/media/products/product19.jpg new file mode 100644 index 0000000..459f1f6 Binary files /dev/null and b/src/assets/media/products/product19.jpg differ diff --git a/src/assets/media/products/product2.jpg b/src/assets/media/products/product2.jpg new file mode 100644 index 0000000..fd538bf Binary files /dev/null and b/src/assets/media/products/product2.jpg differ diff --git a/src/assets/media/products/product20.jpg b/src/assets/media/products/product20.jpg new file mode 100644 index 0000000..633399a Binary files /dev/null and b/src/assets/media/products/product20.jpg differ diff --git a/src/assets/media/products/product21.jpg b/src/assets/media/products/product21.jpg new file mode 100644 index 0000000..d3c78be Binary files /dev/null and b/src/assets/media/products/product21.jpg differ diff --git a/src/assets/media/products/product22.jpg b/src/assets/media/products/product22.jpg new file mode 100644 index 0000000..6729e7f Binary files /dev/null and b/src/assets/media/products/product22.jpg differ diff --git a/src/assets/media/products/product23.jpg b/src/assets/media/products/product23.jpg new file mode 100644 index 0000000..83d69b1 Binary files /dev/null and b/src/assets/media/products/product23.jpg differ diff --git a/src/assets/media/products/product24.jpg b/src/assets/media/products/product24.jpg new file mode 100644 index 0000000..11091ed Binary files /dev/null and b/src/assets/media/products/product24.jpg differ diff --git a/src/assets/media/products/product25.jpg b/src/assets/media/products/product25.jpg new file mode 100644 index 0000000..bd94d35 Binary files /dev/null and b/src/assets/media/products/product25.jpg differ diff --git a/src/assets/media/products/product26.jpg b/src/assets/media/products/product26.jpg new file mode 100644 index 0000000..ff2ee36 Binary files /dev/null and b/src/assets/media/products/product26.jpg differ diff --git a/src/assets/media/products/product27.jpg b/src/assets/media/products/product27.jpg new file mode 100644 index 0000000..408ebf2 Binary files /dev/null and b/src/assets/media/products/product27.jpg differ diff --git a/src/assets/media/products/product28.jpg b/src/assets/media/products/product28.jpg new file mode 100644 index 0000000..430cce7 Binary files /dev/null and b/src/assets/media/products/product28.jpg differ diff --git a/src/assets/media/products/product3.jpg b/src/assets/media/products/product3.jpg new file mode 100644 index 0000000..27901dd Binary files /dev/null and b/src/assets/media/products/product3.jpg differ diff --git a/src/assets/media/products/product4.jpg b/src/assets/media/products/product4.jpg new file mode 100644 index 0000000..7dc30c4 Binary files /dev/null and b/src/assets/media/products/product4.jpg differ diff --git a/src/assets/media/products/product5.jpg b/src/assets/media/products/product5.jpg new file mode 100644 index 0000000..8e7d59d Binary files /dev/null and b/src/assets/media/products/product5.jpg differ diff --git a/src/assets/media/products/product6.jpg b/src/assets/media/products/product6.jpg new file mode 100644 index 0000000..326d6e9 Binary files /dev/null and b/src/assets/media/products/product6.jpg differ diff --git a/src/assets/media/products/product7.jpg b/src/assets/media/products/product7.jpg new file mode 100644 index 0000000..8804a83 Binary files /dev/null and b/src/assets/media/products/product7.jpg differ diff --git a/src/assets/media/products/product8.jpg b/src/assets/media/products/product8.jpg new file mode 100644 index 0000000..81b15e7 Binary files /dev/null and b/src/assets/media/products/product8.jpg differ diff --git a/src/assets/media/products/product9.jpg b/src/assets/media/products/product9.jpg new file mode 100644 index 0000000..7b0013f Binary files /dev/null and b/src/assets/media/products/product9.jpg differ diff --git a/src/assets/media/project-logos/1.png b/src/assets/media/project-logos/1.png new file mode 100644 index 0000000..9a74b4c Binary files /dev/null and b/src/assets/media/project-logos/1.png differ diff --git a/src/assets/media/project-logos/2.png b/src/assets/media/project-logos/2.png new file mode 100644 index 0000000..83a2e4c Binary files /dev/null and b/src/assets/media/project-logos/2.png differ diff --git a/src/assets/media/project-logos/3.png b/src/assets/media/project-logos/3.png new file mode 100644 index 0000000..9175027 Binary files /dev/null and b/src/assets/media/project-logos/3.png differ diff --git a/src/assets/media/project-logos/4.png b/src/assets/media/project-logos/4.png new file mode 100644 index 0000000..a9f939e Binary files /dev/null and b/src/assets/media/project-logos/4.png differ diff --git a/src/assets/media/project-logos/5.png b/src/assets/media/project-logos/5.png new file mode 100644 index 0000000..4a710f6 Binary files /dev/null and b/src/assets/media/project-logos/5.png differ diff --git a/src/assets/media/project-logos/6.png b/src/assets/media/project-logos/6.png new file mode 100644 index 0000000..1ea303c Binary files /dev/null and b/src/assets/media/project-logos/6.png differ diff --git a/src/assets/media/project-logos/7.png b/src/assets/media/project-logos/7.png new file mode 100644 index 0000000..e3b368f Binary files /dev/null and b/src/assets/media/project-logos/7.png differ diff --git a/src/assets/media/users/100_1.jpg b/src/assets/media/users/100_1.jpg new file mode 100644 index 0000000..f689d39 Binary files /dev/null and b/src/assets/media/users/100_1.jpg differ diff --git a/src/assets/media/users/100_10.jpg b/src/assets/media/users/100_10.jpg new file mode 100644 index 0000000..a7eabb5 Binary files /dev/null and b/src/assets/media/users/100_10.jpg differ diff --git a/src/assets/media/users/100_11.jpg b/src/assets/media/users/100_11.jpg new file mode 100644 index 0000000..4478b13 Binary files /dev/null and b/src/assets/media/users/100_11.jpg differ diff --git a/src/assets/media/users/100_12.jpg b/src/assets/media/users/100_12.jpg new file mode 100644 index 0000000..c347bd0 Binary files /dev/null and b/src/assets/media/users/100_12.jpg differ diff --git a/src/assets/media/users/100_13.jpg b/src/assets/media/users/100_13.jpg new file mode 100644 index 0000000..1f66757 Binary files /dev/null and b/src/assets/media/users/100_13.jpg differ diff --git a/src/assets/media/users/100_14.jpg b/src/assets/media/users/100_14.jpg new file mode 100644 index 0000000..890ad8e Binary files /dev/null and b/src/assets/media/users/100_14.jpg differ diff --git a/src/assets/media/users/100_2.jpg b/src/assets/media/users/100_2.jpg new file mode 100644 index 0000000..4f7f714 Binary files /dev/null and b/src/assets/media/users/100_2.jpg differ diff --git a/src/assets/media/users/100_3.jpg b/src/assets/media/users/100_3.jpg new file mode 100644 index 0000000..1835940 Binary files /dev/null and b/src/assets/media/users/100_3.jpg differ diff --git a/src/assets/media/users/100_4.jpg b/src/assets/media/users/100_4.jpg new file mode 100644 index 0000000..7289a40 Binary files /dev/null and b/src/assets/media/users/100_4.jpg differ diff --git a/src/assets/media/users/100_5.jpg b/src/assets/media/users/100_5.jpg new file mode 100644 index 0000000..988a8df Binary files /dev/null and b/src/assets/media/users/100_5.jpg differ diff --git a/src/assets/media/users/100_6.jpg b/src/assets/media/users/100_6.jpg new file mode 100644 index 0000000..8773217 Binary files /dev/null and b/src/assets/media/users/100_6.jpg differ diff --git a/src/assets/media/users/100_7.jpg b/src/assets/media/users/100_7.jpg new file mode 100644 index 0000000..98b1bed Binary files /dev/null and b/src/assets/media/users/100_7.jpg differ diff --git a/src/assets/media/users/100_8.jpg b/src/assets/media/users/100_8.jpg new file mode 100644 index 0000000..5e56080 Binary files /dev/null and b/src/assets/media/users/100_8.jpg differ diff --git a/src/assets/media/users/100_9.jpg b/src/assets/media/users/100_9.jpg new file mode 100644 index 0000000..191c4e5 Binary files /dev/null and b/src/assets/media/users/100_9.jpg differ diff --git a/src/assets/media/users/300_1.jpg b/src/assets/media/users/300_1.jpg new file mode 100644 index 0000000..65345e3 Binary files /dev/null and b/src/assets/media/users/300_1.jpg differ diff --git a/src/assets/media/users/300_10.jpg b/src/assets/media/users/300_10.jpg new file mode 100644 index 0000000..c127d16 Binary files /dev/null and b/src/assets/media/users/300_10.jpg differ diff --git a/src/assets/media/users/300_11.jpg b/src/assets/media/users/300_11.jpg new file mode 100644 index 0000000..73111c8 Binary files /dev/null and b/src/assets/media/users/300_11.jpg differ diff --git a/src/assets/media/users/300_12.jpg b/src/assets/media/users/300_12.jpg new file mode 100644 index 0000000..306a230 Binary files /dev/null and b/src/assets/media/users/300_12.jpg differ diff --git a/src/assets/media/users/300_13.jpg b/src/assets/media/users/300_13.jpg new file mode 100644 index 0000000..3d48201 Binary files /dev/null and b/src/assets/media/users/300_13.jpg differ diff --git a/src/assets/media/users/300_14.jpg b/src/assets/media/users/300_14.jpg new file mode 100644 index 0000000..007b7db Binary files /dev/null and b/src/assets/media/users/300_14.jpg differ diff --git a/src/assets/media/users/300_15.jpg b/src/assets/media/users/300_15.jpg new file mode 100644 index 0000000..4218751 Binary files /dev/null and b/src/assets/media/users/300_15.jpg differ diff --git a/src/assets/media/users/300_16.jpg b/src/assets/media/users/300_16.jpg new file mode 100644 index 0000000..9cdb5ae Binary files /dev/null and b/src/assets/media/users/300_16.jpg differ diff --git a/src/assets/media/users/300_17.jpg b/src/assets/media/users/300_17.jpg new file mode 100644 index 0000000..414bd93 Binary files /dev/null and b/src/assets/media/users/300_17.jpg differ diff --git a/src/assets/media/users/300_18.jpg b/src/assets/media/users/300_18.jpg new file mode 100644 index 0000000..b99c62d Binary files /dev/null and b/src/assets/media/users/300_18.jpg differ diff --git a/src/assets/media/users/300_19.jpg b/src/assets/media/users/300_19.jpg new file mode 100644 index 0000000..dfcad21 Binary files /dev/null and b/src/assets/media/users/300_19.jpg differ diff --git a/src/assets/media/users/300_2.jpg b/src/assets/media/users/300_2.jpg new file mode 100644 index 0000000..db5bf8d Binary files /dev/null and b/src/assets/media/users/300_2.jpg differ diff --git a/src/assets/media/users/300_20.jpg b/src/assets/media/users/300_20.jpg new file mode 100644 index 0000000..aa159f0 Binary files /dev/null and b/src/assets/media/users/300_20.jpg differ diff --git a/src/assets/media/users/300_21.jpg b/src/assets/media/users/300_21.jpg new file mode 100644 index 0000000..70bfdc4 Binary files /dev/null and b/src/assets/media/users/300_21.jpg differ diff --git a/src/assets/media/users/300_22.jpg b/src/assets/media/users/300_22.jpg new file mode 100644 index 0000000..73002f7 Binary files /dev/null and b/src/assets/media/users/300_22.jpg differ diff --git a/src/assets/media/users/300_23.jpg b/src/assets/media/users/300_23.jpg new file mode 100644 index 0000000..05f3521 Binary files /dev/null and b/src/assets/media/users/300_23.jpg differ diff --git a/src/assets/media/users/300_24.jpg b/src/assets/media/users/300_24.jpg new file mode 100644 index 0000000..bdc7e61 Binary files /dev/null and b/src/assets/media/users/300_24.jpg differ diff --git a/src/assets/media/users/300_25.jpg b/src/assets/media/users/300_25.jpg new file mode 100644 index 0000000..3a1b26f Binary files /dev/null and b/src/assets/media/users/300_25.jpg differ diff --git a/src/assets/media/users/300_3.jpg b/src/assets/media/users/300_3.jpg new file mode 100644 index 0000000..ff254c3 Binary files /dev/null and b/src/assets/media/users/300_3.jpg differ diff --git a/src/assets/media/users/300_4.jpg b/src/assets/media/users/300_4.jpg new file mode 100644 index 0000000..aa97672 Binary files /dev/null and b/src/assets/media/users/300_4.jpg differ diff --git a/src/assets/media/users/300_5.jpg b/src/assets/media/users/300_5.jpg new file mode 100644 index 0000000..54efbb4 Binary files /dev/null and b/src/assets/media/users/300_5.jpg differ diff --git a/src/assets/media/users/300_6.jpg b/src/assets/media/users/300_6.jpg new file mode 100644 index 0000000..b00c8e4 Binary files /dev/null and b/src/assets/media/users/300_6.jpg differ diff --git a/src/assets/media/users/300_7.jpg b/src/assets/media/users/300_7.jpg new file mode 100644 index 0000000..080fd07 Binary files /dev/null and b/src/assets/media/users/300_7.jpg differ diff --git a/src/assets/media/users/300_8.jpg b/src/assets/media/users/300_8.jpg new file mode 100644 index 0000000..ae4c130 Binary files /dev/null and b/src/assets/media/users/300_8.jpg differ diff --git a/src/assets/media/users/300_9.jpg b/src/assets/media/users/300_9.jpg new file mode 100644 index 0000000..9bac32e Binary files /dev/null and b/src/assets/media/users/300_9.jpg differ diff --git a/src/assets/media/users/default.jpg b/src/assets/media/users/default.jpg new file mode 100644 index 0000000..04534d0 Binary files /dev/null and b/src/assets/media/users/default.jpg differ diff --git a/src/assets/media/users/user1.jpg b/src/assets/media/users/user1.jpg new file mode 100644 index 0000000..8450002 Binary files /dev/null and b/src/assets/media/users/user1.jpg differ diff --git a/src/assets/media/users/user2.jpg b/src/assets/media/users/user2.jpg new file mode 100644 index 0000000..3c5ad7f Binary files /dev/null and b/src/assets/media/users/user2.jpg differ diff --git a/src/assets/media/users/user3.jpg b/src/assets/media/users/user3.jpg new file mode 100644 index 0000000..a321d64 Binary files /dev/null and b/src/assets/media/users/user3.jpg differ diff --git a/src/assets/media/users/user4.jpg b/src/assets/media/users/user4.jpg new file mode 100644 index 0000000..532f028 Binary files /dev/null and b/src/assets/media/users/user4.jpg differ diff --git a/src/assets/media/users/user5.jpg b/src/assets/media/users/user5.jpg new file mode 100644 index 0000000..2b2f6fe Binary files /dev/null and b/src/assets/media/users/user5.jpg differ diff --git a/src/assets/plugins/bootstrap-multiselectsplitter/LICENCE b/src/assets/plugins/bootstrap-multiselectsplitter/LICENCE new file mode 100644 index 0000000..8b2a8e6 --- /dev/null +++ b/src/assets/plugins/bootstrap-multiselectsplitter/LICENCE @@ -0,0 +1,19 @@ +Copyright (c) Ing. Matúš Ferko + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/src/assets/plugins/bootstrap-multiselectsplitter/bootstrap-multiselectsplitter.js b/src/assets/plugins/bootstrap-multiselectsplitter/bootstrap-multiselectsplitter.js new file mode 100644 index 0000000..cc05046 --- /dev/null +++ b/src/assets/plugins/bootstrap-multiselectsplitter/bootstrap-multiselectsplitter.js @@ -0,0 +1,348 @@ +/** + * Bootstrap multiselectsplitter plugin + * Version: 1.0.1 + * License: MIT + * Homepage: https://github.com/poolerMF/bootstrap-multiselectsplitter + */ ++function ($) { + 'use strict'; + + // CLASS DEFINITION + // =============================== + + var MultiSelectSplitter = function (element, options) { + this.init('multiselectsplitter', element, options); + }; + + MultiSelectSplitter.DEFAULTS = { + selectSize: null, + maxSelectSize: null, + clearOnFirstChange: false, + onlySameGroup: false, // only if multiselect + groupCounter: false, // only if multiselect + maximumSelected: null, // only if multiselect, integer or function + afterInitialize: null, + maximumAlert: function (maximumSelected) { + alert("Only " + maximumSelected + " values can be selected"); + }, + createFirstSelect: function (label, $originalSelect) { + return ''; + }, + createSecondSelect: function (label, $firstSelect) { + return ''; + }, + template: '
    ' + + '
    ' + + '' + + '
    ' + + ' ' + + '
    ' + + '' + + '
    ' + + '
    ' + }; + + MultiSelectSplitter.prototype.init = function (type, element, options) { + + var self = this; + + self.type = type; + self.last$ElementSelected = []; + self.initialized = false; + + self.$element = $(element); + self.$element.hide(); + + self.options = $.extend({}, MultiSelectSplitter.DEFAULTS, options); + + // Add template. + self.$element.after(self.options.template); + + // Define selected elements. + self.$wrapper = self.$element.next('div[data-multiselectsplitter-wrapper-selector]'); + self.$firstSelect = $('select[data-multiselectsplitter-firstselect-selector]', self.$wrapper); + self.$secondSelect = $('select[data-multiselectsplitter-secondselect-selector]', self.$wrapper); + + var optgroupCount = 0; + var longestOptionCount = 0; + + if (self.$element.find('optgroup').length == 0) { + return; + } + + self.$element.find('optgroup').each(function () { + + var label = $(this).attr('label'); + var $option = $(self.options.createFirstSelect(label, self.$element)); + + $option.val(label); + $option.attr('data-current-label', $option.text()); + self.$firstSelect.append($option); + + var currentOptionCount = $(this).find('option').length; + + if (currentOptionCount > longestOptionCount) { + longestOptionCount = currentOptionCount; + } + optgroupCount++; + }); + + // Define $firstSelect and $secondSelect size attribute + var selectSize = Math.max(optgroupCount, longestOptionCount); + selectSize = Math.min(selectSize, 10); + if (self.options.selectSize) { + selectSize = self.options.selectSize; + } else if (self.options.maxSelectSize) { + selectSize = Math.min(selectSize, self.options.maxSelectSize); + } + self.$firstSelect.attr('size', selectSize); + self.$secondSelect.attr('size', selectSize); + + // Set multiple + if (self.$element.attr('multiple')) { + self.$secondSelect.attr('multiple', 'multiple'); + } + + // Set disabled + if (self.$element.is(":disabled")) { + self.disable(); + } + + // Define events. + self.$firstSelect.on('change', $.proxy(self.updateParentCategory, self)); + self.$secondSelect.on('click change', $.proxy(self.updateChildCategory, self)); + + self.update = function () { + if (self.$element.find('option').length < 1) { + return; + } + var selectedOptions = self.$element.find('option:selected:first'); + var selectedGroup; + + if (selectedOptions.length) { + selectedGroup = selectedOptions.parent().attr('label'); + } else { + selectedGroup = self.$element.find('option:first').parent().attr('label'); + } + + self.$firstSelect.find('option[value="' + selectedGroup + '"]').prop('selected', true); + self.$firstSelect.trigger('change'); + }; + + self.update(); + self.initialized = true; + + if (self.options.afterInitialize) { + self.options.afterInitialize(self.$firstSelect, self.$secondSelect); + } + }; + + MultiSelectSplitter.prototype.disable = function () { + this.$secondSelect.prop('disabled', true); + this.$firstSelect.prop('disabled', true); + }; + + MultiSelectSplitter.prototype.enable = function () { + this.$secondSelect.prop('disabled', false); + this.$firstSelect.prop('disabled', false); + }; + + MultiSelectSplitter.prototype.createSecondSelect = function () { + + var self = this; + + self.$secondSelect.empty(); + + $.each(self.$element.find('optgroup[label="' + self.$firstSelect.val() + '"] option'), function (index, element) { + var value = $(this).val(); + var label = $(this).text(); + + var $option = $(self.options.createSecondSelect(label, self.$firstSelect)); + $option.val(value); + + $.each(self.$element.find('option:selected'), function (index, element) { + if ($(element).val() == value) { + $option.prop('selected', true); + } + }); + + self.$secondSelect.append($option); + }); + }; + + MultiSelectSplitter.prototype.updateParentCategory = function () { + + var self = this; + + self.last$ElementSelected = self.$element.find('option:selected'); + + if (self.options.clearOnFirstChange && self.initialized) { + self.$element.find('option:selected').prop('selected', false); + } + + self.createSecondSelect(); + self.checkSelected(); + self.updateCounter(); + }; + + MultiSelectSplitter.prototype.updateCounter = function () { + + var self = this; + + if (!self.$element.attr('multiple') || !self.options.groupCounter) { + return; + } + + $.each(self.$firstSelect.find('option'), function (index, element) { + var originalLabel = $(element).val(); + var text = $(element).data('currentLabel'); + var count = self.$element.find('optgroup[label="' + originalLabel + '"] option:selected').length; + + if (count > 0) { + text += ' (' + count + ')'; + } + + $(element).html(text); + }); + }; + + MultiSelectSplitter.prototype.checkSelected = function () { + + var self = this; + + if (!self.$element.attr('multiple') || !self.options.maximumSelected) { + return; + } + + var maximumSelected = 0; + + if (typeof self.options.maximumSelected == 'function') { + maximumSelected = self.options.maximumSelected(self.$firstSelect, self.$secondSelect); + } else { + maximumSelected = self.options.maximumSelected; + } + + if (maximumSelected < 1) { + return; + } + + var $actualElementSelected = self.$element.find('option:selected'); + + if ($actualElementSelected.length > maximumSelected) { + self.$firstSelect.find('option:selected').prop('selected', false); + self.$secondSelect.find('option:selected').prop('selected', false); + + if (self.initialized) { + self.$element.find('option:selected').prop('selected', false); + self.last$ElementSelected.prop('selected', true); + } else { + // after init, there is no last value + $.each(self.$element.find('option:selected'), function (index, element) { + if (index > maximumSelected - 1) { + $(element).prop('selected', false); + } + }); + } + + var firstSelectedOptGroupLabel = self.last$ElementSelected.first().parent().attr('label'); + self.$firstSelect.find('option[value="' + firstSelectedOptGroupLabel + '"]').prop('selected', true); + + self.createSecondSelect(); + self.options.maximumAlert(maximumSelected); + } + }; + + MultiSelectSplitter.prototype.basicUpdateChildCategory = function (event, isCtrlKey) { + + var self = this; + + self.last$ElementSelected = self.$element.find('option:selected'); + var childValues = self.$secondSelect.val(); + + if (!$.isArray(childValues)) { + childValues = [childValues]; + } + + var parentLabel = self.$firstSelect.val(); + var removeActualSelected = false; + + if (!self.$element.attr('multiple')) { + removeActualSelected = true; + } else { + if (self.options.onlySameGroup) { + $.each(self.$element.find('option:selected'), function (index, element) { + if ($(element).parent().attr('label') != parentLabel) { + removeActualSelected = true; + return false; + } + }); + } else { + if (!isCtrlKey) { + removeActualSelected = true; + } + } + } + + if (removeActualSelected) { + self.$element.find('option:selected').prop('selected', false); + } else { + $.each(self.$element.find('option:selected'), function (index, element) { + if (parentLabel == $(element).parent().attr('label') && $.inArray($(element).val(), childValues) == -1) { + $(element).prop('selected', false); + } + }); + } + + $.each(childValues, function (index, value) { + self.$element.find('option[value="' + value + '"]').prop('selected', true); + }); + + self.checkSelected(); + self.updateCounter(); + self.$element.trigger('change'); // Required for external plugins. + }; + + MultiSelectSplitter.prototype.updateChildCategory = function (event) { + // There is no event.ctrlKey in event "change", so change function is called with timeout + if (event.type == "change") { + this.timeOut = setTimeout($.proxy(function () { + this.basicUpdateChildCategory(event, event.ctrlKey); + }, this), 10); + } else if (event.type == "click") { + clearTimeout(this.timeOut); + this.basicUpdateChildCategory(event, event.ctrlKey) + } + }; + + MultiSelectSplitter.prototype.destroy = function () { + this.$wrapper.remove(); + this.$element.removeData(this.type); + this.$element.show(); + }; + + // PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this); + var data = $this.data('multiselectsplitter'); + var options = typeof option === 'object' && option; + + if (!data && option == 'destroy') { + return; + } + if (!data) { + $this.data('multiselectsplitter', ( data = new MultiSelectSplitter(this, options) )); + } + if (typeof option == 'string') { + data[option](); + } + }); + } + + $.fn.multiselectsplitter = Plugin; + $.fn.multiselectsplitter.Constructor = MultiSelectSplitter; + $.fn.multiselectsplitter.VERSION = '1.0.1'; + +}(jQuery); \ No newline at end of file diff --git a/src/assets/plugins/bootstrap-multiselectsplitter/bootstrap-multiselectsplitter.min.js b/src/assets/plugins/bootstrap-multiselectsplitter/bootstrap-multiselectsplitter.min.js new file mode 100644 index 0000000..6d2a7c8 --- /dev/null +++ b/src/assets/plugins/bootstrap-multiselectsplitter/bootstrap-multiselectsplitter.min.js @@ -0,0 +1 @@ ++function(a){"use strict";function c(c){return this.each(function(){var d=a(this),e=d.data("multiselectsplitter"),f="object"==typeof c&&c;(e||"destroy"!=c)&&(e||d.data("multiselectsplitter",e=new b(this,f)),"string"==typeof c&&e[c]())})}var b=function(a,b){this.init("multiselectsplitter",a,b)};b.DEFAULTS={selectSize:null,maxSelectSize:null,clearOnFirstChange:!1,onlySameGroup:!1,groupCounter:!1,maximumSelected:null,afterInitialize:null,maximumAlert:function(a){alert("Only "+a+" values can be selected")},createFirstSelect:function(a,b){return""},createSecondSelect:function(a,b){return""},template:'
    '},b.prototype.init=function(c,d,e){var f=this;f.type=c,f.last$ElementSelected=[],f.initialized=!1,f.$element=a(d),f.$element.hide(),f.options=a.extend({},b.DEFAULTS,e),f.$element.after(f.options.template),f.$wrapper=f.$element.next("div[data-multiselectsplitter-wrapper-selector]"),f.$firstSelect=a("select[data-multiselectsplitter-firstselect-selector]",f.$wrapper),f.$secondSelect=a("select[data-multiselectsplitter-secondselect-selector]",f.$wrapper);var g=0,h=0;if(0!=f.$element.find("optgroup").length){f.$element.find("optgroup").each(function(){var b=a(this).attr("label"),c=a(f.options.createFirstSelect(b,f.$element));c.val(b),c.attr("data-current-label",c.text()),f.$firstSelect.append(c);var d=a(this).find("option").length;d>h&&(h=d),g++});var i=Math.max(g,h);i=Math.min(i,10),f.options.selectSize?i=f.options.selectSize:f.options.maxSelectSize&&(i=Math.min(i,f.options.maxSelectSize)),f.$firstSelect.attr("size",i),f.$secondSelect.attr("size",i),f.$element.attr("multiple")&&f.$secondSelect.attr("multiple","multiple"),f.$element.is(":disabled")&&f.disable(),f.$firstSelect.on("change",a.proxy(f.updateParentCategory,f)),f.$secondSelect.on("click change",a.proxy(f.updateChildCategory,f)),f.update=function(){if(!(f.$element.find("option").length<1)){var b,a=f.$element.find("option:selected:first");b=a.length?a.parent().attr("label"):f.$element.find("option:first").parent().attr("label"),f.$firstSelect.find('option[value="'+b+'"]').prop("selected",!0),f.$firstSelect.trigger("change")}},f.update(),f.initialized=!0,f.options.afterInitialize&&f.options.afterInitialize(f.$firstSelect,f.$secondSelect)}},b.prototype.disable=function(){this.$secondSelect.prop("disabled",!0),this.$firstSelect.prop("disabled",!0)},b.prototype.enable=function(){this.$secondSelect.prop("disabled",!1),this.$firstSelect.prop("disabled",!1)},b.prototype.createSecondSelect=function(){var b=this;b.$secondSelect.empty(),a.each(b.$element.find('optgroup[label="'+b.$firstSelect.val()+'"] option'),function(c,d){var e=a(this).val(),f=a(this).text(),g=a(b.options.createSecondSelect(f,b.$firstSelect));g.val(e),a.each(b.$element.find("option:selected"),function(b,c){a(c).val()==e&&g.prop("selected",!0)}),b.$secondSelect.append(g)})},b.prototype.updateParentCategory=function(){var a=this;a.last$ElementSelected=a.$element.find("option:selected"),a.options.clearOnFirstChange&&a.initialized&&a.$element.find("option:selected").prop("selected",!1),a.createSecondSelect(),a.checkSelected(),a.updateCounter()},b.prototype.updateCounter=function(){var b=this;b.$element.attr("multiple")&&b.options.groupCounter&&a.each(b.$firstSelect.find("option"),function(c,d){var e=a(d).val(),f=a(d).data("currentLabel"),g=b.$element.find('optgroup[label="'+e+'"] option:selected').length;g>0&&(f+=" ("+g+")"),a(d).html(f)})},b.prototype.checkSelected=function(){var b=this;if(b.$element.attr("multiple")&&b.options.maximumSelected){var c=0;if(c="function"==typeof b.options.maximumSelected?b.options.maximumSelected(b.$firstSelect,b.$secondSelect):b.options.maximumSelected,!(c<1)){var d=b.$element.find("option:selected");if(d.length>c){b.$firstSelect.find("option:selected").prop("selected",!1),b.$secondSelect.find("option:selected").prop("selected",!1),b.initialized?(b.$element.find("option:selected").prop("selected",!1),b.last$ElementSelected.prop("selected",!0)):a.each(b.$element.find("option:selected"),function(b,d){b>c-1&&a(d).prop("selected",!1)});var e=b.last$ElementSelected.first().parent().attr("label");b.$firstSelect.find('option[value="'+e+'"]').prop("selected",!0),b.createSecondSelect(),b.options.maximumAlert(c)}}}},b.prototype.basicUpdateChildCategory=function(b,c){var d=this;d.last$ElementSelected=d.$element.find("option:selected");var e=d.$secondSelect.val();a.isArray(e)||(e=[e]);var f=d.$firstSelect.val(),g=!1;d.$element.attr("multiple")?d.options.onlySameGroup?a.each(d.$element.find("option:selected"),function(b,c){if(a(c).parent().attr("label")!=f)return g=!0,!1}):c||(g=!0):g=!0,g?d.$element.find("option:selected").prop("selected",!1):a.each(d.$element.find("option:selected"),function(b,c){f==a(c).parent().attr("label")&&a.inArray(a(c).val(),e)==-1&&a(c).prop("selected",!1)}),a.each(e,function(a,b){d.$element.find('option[value="'+b+'"]').prop("selected",!0)}),d.checkSelected(),d.updateCounter(),d.$element.trigger("change")},b.prototype.updateChildCategory=function(b){"change"==b.type?this.timeOut=setTimeout(a.proxy(function(){this.basicUpdateChildCategory(b,b.ctrlKey)},this),10):"click"==b.type&&(clearTimeout(this.timeOut),this.basicUpdateChildCategory(b,b.ctrlKey))},b.prototype.destroy=function(){this.$wrapper.remove(),this.$element.removeData(this.type),this.$element.show()},a.fn.multiselectsplitter=c,a.fn.multiselectsplitter.Constructor=b,a.fn.multiselectsplitter.VERSION="1.0.1"}(jQuery); \ No newline at end of file diff --git a/src/assets/plugins/bootstrap-session-timeout/.gitignore b/src/assets/plugins/bootstrap-session-timeout/.gitignore new file mode 100644 index 0000000..dce1319 --- /dev/null +++ b/src/assets/plugins/bootstrap-session-timeout/.gitignore @@ -0,0 +1,4 @@ +/bower_components/ +/node_modules/ +*.sublime-project +*.sublime-workspace diff --git a/src/assets/plugins/bootstrap-session-timeout/.jshintrc b/src/assets/plugins/bootstrap-session-timeout/.jshintrc new file mode 100644 index 0000000..0b7ee56 --- /dev/null +++ b/src/assets/plugins/bootstrap-session-timeout/.jshintrc @@ -0,0 +1,20 @@ +{ + "curly": true, + "eqeqeq": true, + "immed": true, + "latedef": true, + "newcap": true, + "noarg": true, + "sub": true, + "undef": true, + "unused": true, + "boss": true, + "eqnull": true, + "node": true, + "globals": { + "document": true, + "window": true, + "jQuery": true, + "$": true + } +} diff --git a/src/assets/plugins/bootstrap-session-timeout/Gruntfile.js b/src/assets/plugins/bootstrap-session-timeout/Gruntfile.js new file mode 100644 index 0000000..470266d --- /dev/null +++ b/src/assets/plugins/bootstrap-session-timeout/Gruntfile.js @@ -0,0 +1,67 @@ +'use strict'; + +module.exports = function(grunt) { + // Show elapsed time at the end + require('time-grunt')(grunt); + // Load all grunt tasks + require('load-grunt-tasks')(grunt); + + // Project configuration. + grunt.initConfig({ + connect: { + options: { + port: 9000, + // Enable hostname '0.0.0.0' to access the server from outside. + hostname: '0.0.0.0', + livereload: 36729 + }, + livereload: { + options: { + open: 'http://localhost:9000', + middleware: function(connect) { + return [ + connect.static('./') + ]; + } + } + } + }, + jshint: { + options: { + jshintrc: '.jshintrc', + reporter: require('jshint-stylish') + }, + dist: { + src: ['dist/bootstrap-session-timeout.js'] + } + }, + watch: { + dist: { + files: '<%= jshint.dist.src %>', + tasks: ['jshint:dist'] + }, + livereload: { + options: { + livereload: '<%= connect.options.livereload %>' + }, + files: [ + '*.html', + 'examples/*.html', + 'dist/*.js' + ] + } + }, + uglify: { + dist: { + files: { + 'dist/bootstrap-session-timeout.min.js': ['<%= jshint.dist.src %>'] + } + } + } + }); + + // Default task. + grunt.registerTask('default', ['jshint']); + grunt.registerTask('dev', ['connect:livereload', 'watch']); + grunt.registerTask('min', ['jshint', 'uglify']); +}; diff --git a/src/assets/plugins/bootstrap-session-timeout/LICENSE.md b/src/assets/plugins/bootstrap-session-timeout/LICENSE.md new file mode 100644 index 0000000..aa40c24 --- /dev/null +++ b/src/assets/plugins/bootstrap-session-timeout/LICENSE.md @@ -0,0 +1,22 @@ +MIT License (MIT) + +Copyright (c) 2013 Travis Horn + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/src/assets/plugins/bootstrap-session-timeout/README.md b/src/assets/plugins/bootstrap-session-timeout/README.md new file mode 100644 index 0000000..9ffc25a --- /dev/null +++ b/src/assets/plugins/bootstrap-session-timeout/README.md @@ -0,0 +1,275 @@ +# bootstrap-session-timeout +Inspired by [jquery-sessionTimeout-bootstrap by maxfierke](https://github.com/maxfierke/jquery-sessionTimeout-bootstrap) + +There have been a number of major upgrades. For example, as long as the user is doing something on the page, he will never get a timeout. The original plugin launched a timeout warning dialog in a fixed amount of time regardless of user activity. See description and documentation for more information. + +You can easily upgrade from jquery-sessionTimeout-bootstrap to bootstrap-session-timeout, since the basic options have been inherited from jquery-sessionTimeout-bootstrap and have not been renamed. + +## Description +After a set amount of idle time, a Bootstrap warning dialog is shown to the user with the option to either log out, or stay connected. If "Logout" button is selected, the page is redirected to a logout URL. If "Stay Connected" is selected the dialog closes and the session is kept alive. If no option is selected after another set amount of idle time, the page is automatically redirected to a set timeout URL. + +Idle time is defined as no mouse, keyboard or touch event activity registered by the browser. + +As long as the user is active, the (optional) keep-alive URL keeps getting pinged and the session stays alive. If you have no need to keep the server-side session alive via the keep-alive URL, you can also use this plugin as a simple lock mechanism that redirects to your lock-session or log-out URL after a set amount of idle time. + + +## Getting Started + +1. Download or git clone. +2. Run `bower install` to install dependencies or if you prefer to do it manually: include jQuery, Bootstrap JS and CSS (required if you want to use Bootstrap modal window). +3. Include `bootstrap-session-timeout.js` or the minified version `bootstrap-session-timeout.min.js` +4. Call `$.sessionTimeout();` on document ready. See available options below or take a look at the examples. + + + +## Documentation +### Options +**title**
    + +Type: `String` + +Default: `'Your session is about to expire!'` + +This is the text shown to user via Bootstrap warning dialog after warning period. (modal title) + +**message**
    + +Type: `String` + +Default: `'Your session is about to expire.'` + +This is the text shown to user via Bootstrap warning dialog after warning period. + +**logoutButton**
    + +Type: `String` + +Default: `'Logout'` + +This is the text shown to user via Bootstrap warning dialog after warning period in the logout button. + +**keepAliveButton**
    + +Type: `String` + +Default: `'Stay Connected'` + +This is the text shown to user via Bootstrap warning dialog after warning period in the Keep Alive button. + +**keepAliveUrl** + +Type: `String` + +Default: `'/keep-alive'` + +URL to ping via AJAX POST to keep the session alive. This resource should do something innocuous that would keep the session alive, which will depend on your server-side platform. + +**keepAlive** + +Type: `Boolean` + +Default: `true` + +If `true`, the plugin keeps pinging the `keepAliveUrl` for as long as the user is active. The time between two pings is set by the `keepAliveInterval` option. If you have no server-side session timeout to worry about, feel free to set this one to `false` to prevent unnecessary network activity. + +**keepAliveInterval** + +Type: `Integer` + +Default: `5000` (5 seconds) + +Time in milliseconds between two keep-alive pings. + +**ajaxType** + +Type: `String` + +Default: `'POST'` + +If you need to specify the ajax method + +**ajaxData** + +Type: `String` + +Default: `''` + +If you need to send some data via AJAX POST to your `keepAliveUrl`, you can use this option. + +**redirUrl** + +Type: `String` + +Default: `'/timed-out'` + +URL to take browser to if no action is take after the warning. + +**logoutUrl** + +Type: `String` + +Default: `'/log-out'` + +URL to take browser to if user clicks "Logout" on the Bootstrap warning dialog. + +**warnAfter** + +Type: `Integer` + +Default: `900000` (15 minutes) + +Time in milliseconds after page is opened until warning dialog is opened. + +**redirAfter** + +Type: `Integer` + +Default: `1200000` (20 minutes) + +Time in milliseconds after page is opened until browser is redirected to `redirUrl`. + +**ignoreUserActivity** + +Type: `Boolean` + +Default: `false` + +If `true`, this will launch the Bootstrap warning dialog / redirect (or callback functions) in a set amounts of time regardless of user activity. This in turn makes the plugin act much like the [jquery-sessionTimeout-bootstrap by maxfierke](https://github.com/maxfierke/jquery-sessionTimeout-bootstrap) plugin. + +**countdownSmart** + +Type: `Boolean` + +Default: `false` + +If `true`, displays minutes as well as seconds in the countdown timer (e.g. "3m 14s"). +Displays only seconds when timer is under one minute (e.g. "42s"). + +**countdownMessage** + +Type: `String` or `Boolean` + +Default: `false` + +If you want a custom sentence to appear in the warning dialog with a timer showing the seconds remaining, use this option. Example: `countdownMessage: 'Redirecting in {timer}.'` Place the `{timer}` string where you want the numeric countdown to appear. Another example: `countdownMessage: '{timer} remaining.'`. Can be combined with countdownBar option or used independently. + +**countdownBar** + +Type: `Boolean` + +Default: `false` + +If `true`, ads a countdown bar (uses Bootstrap progress bar) to the warning dialog. Can be combined with countdownMessage option or used independently. + +**onStart** + +Type: `Function` or `Boolean` + +Default: `false` + +Optional callback fired when first calling the plugin and every time user refreshes the session (on any mouse, keyboard or touch action). Takes options object as the only argument. + + +**onWarn** + +Type: `Function` or `Boolean` + +Default: `false` + +Custom callback you can use instead of showing the Bootstrap warning dialog. Takes options object as the only argument. + +Redirect action will still occur unless you also add the `onRedir` callback. + +**onRedir** + +Type: `Function` or `Boolean` + +Default: `false` + +Custom callback you can use instead of redirecting the user to `redirUrl`. Takes options object as the only argument. + +## Examples + +You can play around with the examples in the `/examples` directory. + + +**Basic Usage** + +Shows the warning dialog after one minute. The dialog is visible for another minute. If user takes no action (interacts with the page in any way), browser is redirected to `redirUrl`. On any user action (mouse, keyboard or touch) the timeout timer is reset. Of course, you will still need to close the dialog. + +```js +$.sessionTimeout({ + message: 'Your session will be locked in one minute.', + keepAliveUrl: 'keep-alive.html', + logoutUrl: 'login.html', + redirUrl: 'locked.html', + warnAfter: 60000, + redirAfter: 120000 +}); +``` + +**With onWarn Callback** + +Shows the "Warning!" alert after one minute. If user takes no action (interacts with the page in any way), after one more minute the browser is redirected to `redirUrl`. On any user action (mouse, keyboard or touch) the timeout timer is reset. + +```js +$.sessionTimeout({ + redirUrl: 'locked.html', + warnAfter: 60000, + redirAfter: 120000, + onWarn: function () { + alert('Warning!'); + } +}); +``` + +**With both onWarn and onRedir Callback** + +Console logs the "Your session will soon expire!" text after one minute. If user takes no action (interacts with the page in any way), after two more minutes the "Your session has expired!" alert gets shown. No redirection occurs. On any user action (mouse, keyboard or touch) the timeout timer is reset. + +```js +$.sessionTimeout({ + warnAfter: 60000, + redirAfter: 180000, + onWarn: function () { + console.log('Your session will soon expire!'); + }, + onRedir: function () { + alert('Your session has expired!'); + } +}); +``` + +**With countdown message and bar displayed in warning dialog** + +Same as basic usage except you'll also see the countdown message and countdown bar in the warning dialog. Uses Bootstrap progress bar. In countdownMessage place the `{timer}` string where you want the numeric countdown (seconds) to appear. + +```js +$.sessionTimeout({ + keepAliveUrl: 'keep-alive.html', + logoutUrl: 'login.html', + redirUrl: 'locked.html', + warnAfter: 60000, + redirAfter: 120000, + countdownMessage: 'Redirecting in {timer} seconds.', + countdownBar: true +}); +``` + +## Contributing +In lieu of a formal styleguide, take care to maintain the existing coding style. Add comments for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com/). + +## Release History + * **1.0.3** `2015-07-17` + * Fixes various reported bugs + * **1.0.2** `2015-02-10` + * Added optional onStart callback. + * All custom callbacks nowreceive options object as argument. + * Added optional countdown message. Added optional countdown bar. + * **1.0.1** `2014-01-23` + * Added an option to send data to the keep-alive URL. + * **1.0.0** `2014-01-22` + * Initial release. + +## License +Copyright (c) 2014 [Orange Hill](http://www.orangehilldev.com). Licensed under the MIT license. diff --git a/src/assets/plugins/bootstrap-session-timeout/bower.json b/src/assets/plugins/bootstrap-session-timeout/bower.json new file mode 100644 index 0000000..c4273cc --- /dev/null +++ b/src/assets/plugins/bootstrap-session-timeout/bower.json @@ -0,0 +1,32 @@ +{ + "name": "bootstrap-session-timeout", + "version": "1.0.3", + "homepage": "https://github.com/orangehill/bootstrap-session-timeout", + "authors": [ + "Vedran Opacic " + ], + "description": "Session timeout and keep-alive control with a nice Bootstrap warning dialog.", + "keywords": [ + "timeout", + "time-out", + "keepalive", + "keep-alive", + "session", + "bootstrap", + "bootstrap 3", + "jquery", + "javascript", + "dialog" + ], + "license": "MIT", + "ignore": [ + "node_modules", + "bower_components", + "test", + "tests" + ], + "dependencies": { + "bootstrap": "~3.3.2", + "jquery": "~2.1.3" + } +} diff --git a/src/assets/plugins/bootstrap-session-timeout/examples/basic.html b/src/assets/plugins/bootstrap-session-timeout/examples/basic.html new file mode 100644 index 0000000..148ca4e --- /dev/null +++ b/src/assets/plugins/bootstrap-session-timeout/examples/basic.html @@ -0,0 +1,45 @@ + + + + + Bootstrap-session-timeout - Basic Usage + + + + + +
    +

    Bootstrap-session-timeout

    +

    Basic Usage

    +
    +

    Shows the warning dialog after 3 seconds. If user takes no action (interacts with the page in any way), browser is redirected to redirUrl. On any user action (mouse, keyboard or touch) the timeout timer is reset.

    + +
    +            $.sessionTimeout({
    +                keepAliveUrl: 'keep-alive.html',
    +                logoutUrl: 'login.html',
    +                redirUrl: 'locked.html',
    +                warnAfter: 3000,
    +                redirAfter: 10000
    +            });
    +        
    + + Back to Demo Index + +
    + + + + + + + + diff --git a/src/assets/plugins/bootstrap-session-timeout/examples/countdown-bar.html b/src/assets/plugins/bootstrap-session-timeout/examples/countdown-bar.html new file mode 100644 index 0000000..7a1a7df --- /dev/null +++ b/src/assets/plugins/bootstrap-session-timeout/examples/countdown-bar.html @@ -0,0 +1,48 @@ + + + + + Bootstrap-session-timeout - Countdown Timer + + + + + +
    +

    Bootstrap-session-timeout

    +

    Countdown Timer

    +
    +

    Shows the warning dialog with countdown bar after 3 seconds. If user takes no action (interacts with the page in any way), browser is redirected to redirUrl. On any user action (mouse, keyboard or touch) the timeout timer as well as the countdown timer are reset (visible if you don't close the warning dialog).

    +

    Note: you can also combine the countdown bar with a countdown timer message.

    + +
    +            $.sessionTimeout({
    +                keepAliveUrl: 'keep-alive.html',
    +                logoutUrl: 'login.html',
    +                redirUrl: 'locked.html',
    +                warnAfter: 3000,
    +                redirAfter: 10000,
    +                countdownBar: true
    +            });
    +        
    + + Back to Demo Index + +
    + + + + + + + + diff --git a/src/assets/plugins/bootstrap-session-timeout/examples/countdown-timer.html b/src/assets/plugins/bootstrap-session-timeout/examples/countdown-timer.html new file mode 100644 index 0000000..188e4a3 --- /dev/null +++ b/src/assets/plugins/bootstrap-session-timeout/examples/countdown-timer.html @@ -0,0 +1,47 @@ + + + + + Bootstrap-session-timeout - Countdown Timer + + + + + +
    +

    Bootstrap-session-timeout

    +

    Countdown Timer

    +
    +

    Shows the warning dialog with countdown timer after 3 seconds. If user takes no action (interacts with the page in any way), browser is redirected to redirUrl. On any user action (mouse, keyboard or touch) the timeout timer as well as the countdown timer are reset (visible if you don't close the warning dialog).

    + +
    +            $.sessionTimeout({
    +                keepAliveUrl: 'keep-alive.html',
    +                logoutUrl: 'login.html',
    +                redirUrl: 'locked.html',
    +                warnAfter: 3000,
    +                redirAfter: 10000,
    +                countdownMessage: 'Redirecting in {timer} seconds.'
    +            });
    +        
    + + Back to Demo Index + +
    + + + + + + + + diff --git a/src/assets/plugins/bootstrap-session-timeout/examples/custom-callback.html b/src/assets/plugins/bootstrap-session-timeout/examples/custom-callback.html new file mode 100644 index 0000000..ac81f85 --- /dev/null +++ b/src/assets/plugins/bootstrap-session-timeout/examples/custom-callback.html @@ -0,0 +1,71 @@ + + + + + Bootstrap-session-timeout - Countdown Timer + + + + + +
    +

    Bootstrap-session-timeout

    +

    Custom Callback

    +
    +

    Shows an example of using custom callback functions for warning and redirect.

    +
    +

    Session Status:

    + + +
    + + +
    +            $.sessionTimeout({
    +                keepAliveUrl: 'keep-alive.html',
    +                logoutUrl: 'login.html',
    +                warnAfter: 3000,
    +                redirAfter: 20000,
    +                onStart: function () {
    +                    $('.jumbotron').css('background', '#398439').find('p').addClass('hidden');
    +                    $('#fine').removeClass('hidden')
    +                },
    +                onWarn: function () {
    +                    $('.jumbotron').css('background', '#b92c28').find('p').addClass('hidden');
    +                    $('#warn').removeClass('hidden')
    +                },
    +                onRedir: function (opt) {
    +                    window.location = opt.logoutUrl;
    +                }
    +            });
    +        
    + + Back to Demo Index + +
    + + + + + + + + diff --git a/src/assets/plugins/bootstrap-session-timeout/examples/keep-alive.html b/src/assets/plugins/bootstrap-session-timeout/examples/keep-alive.html new file mode 100644 index 0000000..8c1a3bc --- /dev/null +++ b/src/assets/plugins/bootstrap-session-timeout/examples/keep-alive.html @@ -0,0 +1,19 @@ + + + + + Bootstrap-session-timeout - Basic Usage + + + + + +
    +

    Bootstrap-session-timeout

    +

    Dummy keep alive URL

    +
    +

    This would be your server-side URL to refresh user session.

    +
    + + + diff --git a/src/assets/plugins/bootstrap-session-timeout/examples/locked.html b/src/assets/plugins/bootstrap-session-timeout/examples/locked.html new file mode 100644 index 0000000..544ebbb --- /dev/null +++ b/src/assets/plugins/bootstrap-session-timeout/examples/locked.html @@ -0,0 +1,27 @@ + + + + + Bootstrap-session-timeout - Logged Out + + + + + +
    +

    Bootstrap-session-timeout

    +

    Logged Out

    +
    +

    You have been redirected to a logout URL.

    + + + +
    + + + + diff --git a/src/assets/plugins/bootstrap-session-timeout/examples/login.html b/src/assets/plugins/bootstrap-session-timeout/examples/login.html new file mode 100644 index 0000000..721afdb --- /dev/null +++ b/src/assets/plugins/bootstrap-session-timeout/examples/login.html @@ -0,0 +1,27 @@ + + + + + Bootstrap-session-timeout - Login Page + + + + + +
    +

    Bootstrap-session-timeout

    +

    Login

    +
    +

    This would be your login page.

    + + + +
    + + + + diff --git a/src/assets/plugins/bootstrap-session-timeout/index.html b/src/assets/plugins/bootstrap-session-timeout/index.html new file mode 100644 index 0000000..0886b6d --- /dev/null +++ b/src/assets/plugins/bootstrap-session-timeout/index.html @@ -0,0 +1,25 @@ + + + + + Bootstrap-session-timeout - Basic Usage + + + + + +
    +

    Bootstrap-session-timeout demo

    +
    + Basic Demo +
    + Countdown Message Demo +
    + Countdown Bar Demo +
    + Custom Callback Demo +
    +
    + + + diff --git a/src/assets/plugins/bootstrap-session-timeout/package.json b/src/assets/plugins/bootstrap-session-timeout/package.json new file mode 100644 index 0000000..cdc2c52 --- /dev/null +++ b/src/assets/plugins/bootstrap-session-timeout/package.json @@ -0,0 +1,40 @@ +{ + "name": "bootstrap-session-timeout", + "version": "1.0.3", + "main": "dist/bootstrap-session-timeout.js", + "description": "Session timeout and keep-alive control with a nice Bootstrap warning dialog.", + "homepage": "https://github.com/orangehill/bootstrap-session-timeout", + "bugs": "https://github.com/orangehill/bootstrap-session-timeout/issues", + "author": "Vedran Opacic, vedran.opacic@orangehilldev.com", + "repository": { + "type": "git", + "url": "https://github.com/orangehill/bootstrap-session-timeout" + }, + "licenses": [ + { + "type": "MIT" + } + ], + "keywords": [ + "timeout", + "time-out", + "keepalive", + "keep-alive", + "session", + "bootstrap", + "bootstrap 3", + "jquery", + "javascript", + "dialog" + ], + "devDependencies": { + "bower": "^1.3.5", + "grunt-contrib-connect": "*", + "grunt-contrib-jshint": "~0.7.0", + "grunt-contrib-uglify": "~0.3.1", + "grunt-contrib-watch": "~0.5.0", + "jshint-stylish": "~0.1.3", + "load-grunt-tasks": "~0.2.0", + "time-grunt": "~0.2.0" + } +} diff --git a/src/assets/plugins/flaticon/flaticon.css b/src/assets/plugins/flaticon/flaticon.css new file mode 100644 index 0000000..ecc8d02 --- /dev/null +++ b/src/assets/plugins/flaticon/flaticon.css @@ -0,0 +1,276 @@ + /* + Flaticon icon font: Flaticon + Creation date: 20/03/2017 20:02 + */ + +@font-face { + font-family: "Flaticon"; + src: url("./font/Flaticon.eot"); + src: url("./font/Flaticon.eot?#iefix") format("embedded-opentype"), + url("./font/Flaticon.woff") format("woff"), + url("./font/Flaticon.ttf") format("truetype"), + url("./font/Flaticon.svg#Flaticon") format("svg"); + font-weight: normal; + font-style: normal; +} + +@media screen and (-webkit-min-device-pixel-ratio:0) { + @font-face { + font-family: "Flaticon"; + src: url("./font/Flaticon.svg#Flaticon") format("svg"); + } +} + +[class^="flaticon-"]:before, +[class*=" flaticon-"]:before { + font-family: Flaticon; + font-style: normal; + font-weight: normal; + font-variant: normal; + line-height: 1; + text-decoration: inherit; + text-rendering: optimizeLegibility; + text-transform: none; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-smoothing: antialiased; +} + +.flaticon-email-black-circular-button:before { content: "\f100"; } +.flaticon-map:before { content: "\f101"; } +.flaticon-alert-off:before { content: "\f102"; } +.flaticon-alert:before { content: "\f103"; } +.flaticon-computer:before { content: "\f104"; } +.flaticon-responsive:before { content: "\f105"; } +.flaticon-presentation:before { content: "\f106"; } +.flaticon-arrows:before { content: "\f107"; } +.flaticon-rocket:before { content: "\f108"; } +.flaticon-reply:before { content: "\f109"; } +.flaticon-gift:before { content: "\f10a"; } +.flaticon-confetti:before { content: "\f10b"; } +.flaticon-piggy-bank:before { content: "\f10c"; } +.flaticon-support:before { content: "\f10d"; } +.flaticon-delete:before { content: "\f10e"; } +.flaticon-eye:before { content: "\f10f"; } +.flaticon-multimedia:before { content: "\f110"; } +.flaticon-whatsapp:before { content: "\f111"; } +.flaticon-multimedia-2:before { content: "\f112"; } +.flaticon-email:before { content: "\f113"; } +.flaticon-presentation-1:before { content: "\f114"; } +.flaticon-trophy:before { content: "\f115"; } +.flaticon-psd:before { content: "\f116"; } +.flaticon-layer:before { content: "\f117"; } +.flaticon-doc:before { content: "\f118"; } +.flaticon-file:before { content: "\f119"; } +.flaticon-network:before { content: "\f11a"; } +.flaticon-bus-stop:before { content: "\f11b"; } +.flaticon-globe:before { content: "\f11c"; } +.flaticon-upload:before { content: "\f11d"; } +.flaticon-squares:before { content: "\f11e"; } +.flaticon-technology:before { content: "\f11f"; } +.flaticon-up-arrow:before { content: "\f120"; } +.flaticon-browser:before { content: "\f121"; } +.flaticon-speech-bubble:before { content: "\f122"; } +.flaticon-coins:before { content: "\f123"; } +.flaticon-open-box:before { content: "\f124"; } +.flaticon-speech-bubble-1:before { content: "\f125"; } +.flaticon-attachment:before { content: "\f126"; } +.flaticon-photo-camera:before { content: "\f127"; } +.flaticon-skype-logo:before { content: "\f128"; } +.flaticon-linkedin-logo:before { content: "\f129"; } +.flaticon-twitter-logo:before { content: "\f12a"; } +.flaticon-facebook-letter-logo:before { content: "\f12b"; } +.flaticon-calendar-with-a-clock-time-tools:before { content: "\f12c"; } +.flaticon-youtube:before { content: "\f12d"; } +.flaticon-add-circular-button:before { content: "\f12e"; } +.flaticon-more-v2:before { content: "\f12f"; } +.flaticon-search:before { content: "\f130"; } +.flaticon-search-magnifier-interface-symbol:before { content: "\f131"; } +.flaticon-questions-circular-button:before { content: "\f132"; } +.flaticon-refresh:before { content: "\f133"; } +.flaticon-logout:before { content: "\f134"; } +.flaticon-event-calendar-symbol:before { content: "\f135"; } +.flaticon-laptop:before { content: "\f136"; } +.flaticon-tool:before { content: "\f137"; } +.flaticon-graphic:before { content: "\f138"; } +.flaticon-symbol:before { content: "\f139"; } +.flaticon-graphic-1:before { content: "\f13a"; } +.flaticon-clock:before { content: "\f13b"; } +.flaticon-squares-1:before { content: "\f13c"; } +.flaticon-black:before { content: "\f13d"; } +.flaticon-book:before { content: "\f13e"; } +.flaticon-cogwheel:before { content: "\f13f"; } +.flaticon-exclamation:before { content: "\f140"; } +.flaticon-add-label-button:before { content: "\f141"; } +.flaticon-delete-1:before { content: "\f142"; } +.flaticon-interface:before { content: "\f143"; } +.flaticon-more:before { content: "\f144"; } +.flaticon-warning-sign:before { content: "\f145"; } +.flaticon-calendar:before { content: "\f146"; } +.flaticon-instagram-logo:before { content: "\f147"; } +.flaticon-linkedin:before { content: "\f148"; } +.flaticon-facebook-logo-button:before { content: "\f149"; } +.flaticon-twitter-logo-button:before { content: "\f14a"; } +.flaticon-cancel:before { content: "\f14b"; } +.flaticon-exclamation-square:before { content: "\f14c"; } +.flaticon-buildings:before { content: "\f14d"; } +.flaticon-danger:before { content: "\f14e"; } +.flaticon-technology-1:before { content: "\f14f"; } +.flaticon-letter-g:before { content: "\f150"; } +.flaticon-interface-1:before { content: "\f151"; } +.flaticon-circle:before { content: "\f152"; } +.flaticon-pin:before { content: "\f153"; } +.flaticon-close:before { content: "\f154"; } +.flaticon-clock-1:before { content: "\f155"; } +.flaticon-apps:before { content: "\f156"; } +.flaticon-user:before { content: "\f157"; } +.flaticon-menu-button:before { content: "\f158"; } +.flaticon-settings:before { content: "\f159"; } +.flaticon-home:before { content: "\f15a"; } +.flaticon-clock-2:before { content: "\f15b"; } +.flaticon-lifebuoy:before { content: "\f15c"; } +.flaticon-cogwheel-1:before { content: "\f15d"; } +.flaticon-paper-plane:before { content: "\f15e"; } +.flaticon-statistics:before { content: "\f15f"; } +.flaticon-diagram:before { content: "\f160"; } +.flaticon-line-graph:before { content: "\f161"; } +.flaticon-customer:before { content: "\f162"; } +.flaticon-visible:before { content: "\f163"; } +.flaticon-shopping-basket:before { content: "\f164"; } +.flaticon-price-tag:before { content: "\f165"; } +.flaticon-businesswoman:before { content: "\f166"; } +.flaticon-medal:before { content: "\f167"; } +.flaticon-like:before { content: "\f168"; } +.flaticon-edit:before { content: "\f169"; } +.flaticon-avatar:before { content: "\f16a"; } +.flaticon-download:before { content: "\f16b"; } +.flaticon-home-1:before { content: "\f16c"; } +.flaticon-mail:before { content: "\f16d"; } +.flaticon-mail-1:before { content: "\f16e"; } +.flaticon-warning:before { content: "\f16f"; } +.flaticon-cart:before { content: "\f170"; } +.flaticon-bag:before { content: "\f171"; } +.flaticon-pie-chart:before { content: "\f172"; } +.flaticon-graph:before { content: "\f173"; } +.flaticon-interface-2:before { content: "\f174"; } +.flaticon-chat:before { content: "\f175"; } +.flaticon-envelope:before { content: "\f176"; } +.flaticon-chat-1:before { content: "\f177"; } +.flaticon-interface-3:before { content: "\f178"; } +.flaticon-background:before { content: "\f179"; } +.flaticon-file-1:before { content: "\f17a"; } +.flaticon-interface-4:before { content: "\f17b"; } +.flaticon-multimedia-3:before { content: "\f17c"; } +.flaticon-list:before { content: "\f17d"; } +.flaticon-time:before { content: "\f17e"; } +.flaticon-profile:before { content: "\f17f"; } +.flaticon-imac:before { content: "\f180"; } +.flaticon-medical:before { content: "\f181"; } +.flaticon-music:before { content: "\f182"; } +.flaticon-plus:before { content: "\f183"; } +.flaticon-exclamation-1:before { content: "\f184"; } +.flaticon-info:before { content: "\f185"; } +.flaticon-menu-1:before { content: "\f186"; } +.flaticon-menu-2:before { content: "\f187"; } +.flaticon-share:before { content: "\f188"; } +.flaticon-interface-5:before { content: "\f189"; } +.flaticon-signs:before { content: "\f18a"; } +.flaticon-tabs:before { content: "\f18b"; } +.flaticon-multimedia-4:before { content: "\f18c"; } +.flaticon-upload-1:before { content: "\f18d"; } +.flaticon-web:before { content: "\f18e"; } +.flaticon-placeholder:before { content: "\f18f"; } +.flaticon-placeholder-1:before { content: "\f190"; } +.flaticon-layers:before { content: "\f191"; } +.flaticon-interface-6:before { content: "\f192"; } +.flaticon-interface-7:before { content: "\f193"; } +.flaticon-interface-8:before { content: "\f194"; } +.flaticon-tool-1:before { content: "\f195"; } +.flaticon-settings-1:before { content: "\f196"; } +.flaticon-alarm:before { content: "\f197"; } +.flaticon-search-1:before { content: "\f198"; } +.flaticon-time-1:before { content: "\f199"; } +.flaticon-stopwatch:before { content: "\f19a"; } +.flaticon-folder:before { content: "\f19b"; } +.flaticon-folder-1:before { content: "\f19c"; } +.flaticon-folder-2:before { content: "\f19d"; } +.flaticon-folder-3:before { content: "\f19e"; } +.flaticon-file-2:before { content: "\f19f"; } +.flaticon-list-1:before { content: "\f1a0"; } +.flaticon-list-2:before { content: "\f1a1"; } +.flaticon-calendar-1:before { content: "\f1a2"; } +.flaticon-time-2:before { content: "\f1a3"; } +.flaticon-interface-9:before { content: "\f1a4"; } +.flaticon-app:before { content: "\f1a5"; } +.flaticon-suitcase:before { content: "\f1a6"; } +.flaticon-grid-menu-v2:before { content: "\f1a7"; } +.flaticon-more-v6:before { content: "\f1a8"; } +.flaticon-more-v5:before { content: "\f1a9"; } +.flaticon-add:before { content: "\f1aa"; } +.flaticon-multimedia-5:before { content: "\f1ab"; } +.flaticon-more-v4:before { content: "\f1ac"; } +.flaticon-placeholder-2:before { content: "\f1ad"; } +.flaticon-map-location:before { content: "\f1ae"; } +.flaticon-users:before { content: "\f1af"; } +.flaticon-profile-1:before { content: "\f1b0"; } +.flaticon-lock:before { content: "\f1b1"; } +.flaticon-sound:before { content: "\f1b2"; } +.flaticon-star:before { content: "\f1b3"; } +.flaticon-placeholder-3:before { content: "\f1b4"; } +.flaticon-bell:before { content: "\f1b5"; } +.flaticon-paper-plane-1:before { content: "\f1b6"; } +.flaticon-users-1:before { content: "\f1b7"; } +.flaticon-more-1:before { content: "\f1b8"; } +.flaticon-up-arrow-1:before { content: "\f1b9"; } +.flaticon-grid-menu:before { content: "\f1ba"; } +.flaticon-alarm-1:before { content: "\f1bb"; } +.flaticon-earth-globe:before { content: "\f1bc"; } +.flaticon-alert-1:before { content: "\f1bd"; } +.flaticon-internet:before { content: "\f1be"; } +.flaticon-user-ok:before { content: "\f1bf"; } +.flaticon-user-add:before { content: "\f1c0"; } +.flaticon-user-settings:before { content: "\f1c1"; } +.flaticon-truck:before { content: "\f1c2"; } +.flaticon-analytics:before { content: "\f1c3"; } +.flaticon-notes:before { content: "\f1c4"; } +.flaticon-tea-cup:before { content: "\f1c5"; } +.flaticon-exclamation-2:before { content: "\f1c6"; } +.flaticon-technology-2:before { content: "\f1c7"; } +.flaticon-location:before { content: "\f1c8"; } +.flaticon-edit-1:before { content: "\f1c9"; } +.flaticon-home-2:before { content: "\f1ca"; } +.flaticon-dashboard:before { content: "\f1cb"; } +.flaticon-information:before { content: "\f1cc"; } +.flaticon-light:before { content: "\f1cd"; } +.flaticon-car:before { content: "\f1ce"; } +.flaticon-business:before { content: "\f1cf"; } +.flaticon-squares-2:before { content: "\f1d0"; } +.flaticon-signs-1:before { content: "\f1d1"; } +.flaticon-mark:before { content: "\f1d2"; } +.flaticon-squares-3:before { content: "\f1d3"; } +.flaticon-comment:before { content: "\f1d4"; } +.flaticon-shapes:before { content: "\f1d5"; } +.flaticon-clipboard:before { content: "\f1d6"; } +.flaticon-squares-4:before { content: "\f1d7"; } +.flaticon-delete-2:before { content: "\f1d8"; } +.flaticon-bell-1:before { content: "\f1d9"; } +.flaticon-list-3:before { content: "\f1da"; } +.flaticon-infinity:before { content: "\f1db"; } +.flaticon-chat-2:before { content: "\f1dc"; } +.flaticon-calendar-2:before { content: "\f1dd"; } +.flaticon-signs-2:before { content: "\f1de"; } +.flaticon-time-3:before { content: "\f1df"; } +.flaticon-calendar-3:before { content: "\f1e0"; } +.flaticon-interface-10:before { content: "\f1e1"; } +.flaticon-interface-11:before { content: "\f1e2"; } +.flaticon-folder-4:before { content: "\f1e3"; } +.flaticon-alert-2:before { content: "\f1e4"; } +.flaticon-cogwheel-2:before { content: "\f1e5"; } +.flaticon-graphic-2:before { content: "\f1e6"; } +.flaticon-rotate:before { content: "\f1e7"; } +.flaticon-feed:before { content: "\f1e8"; } +.flaticon-safe-shield-protection:before { content: "\f1e9"; } +.flaticon-security:before { content: "\f1ea"; } +.flaticon-download-1:before { content: "\f1eb"; } +.flaticon-pie-chart-1:before { content: "\f1ec"; } +.flaticon-notepad:before { content: "\f1ed"; } \ No newline at end of file diff --git a/src/assets/plugins/flaticon/font/Flaticon.eot b/src/assets/plugins/flaticon/font/Flaticon.eot new file mode 100644 index 0000000..024b03b Binary files /dev/null and b/src/assets/plugins/flaticon/font/Flaticon.eot differ diff --git a/src/assets/plugins/flaticon/font/Flaticon.svg b/src/assets/plugins/flaticon/font/Flaticon.svg new file mode 100644 index 0000000..e45921d --- /dev/null +++ b/src/assets/plugins/flaticon/font/Flaticon.svg @@ -0,0 +1,2702 @@ + + + + + +Created by FontForge 20160405 at Wed Oct 10 13:37:03 2018 + By Apache +Copyright (c) 2018, Apache + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/plugins/flaticon/font/Flaticon.ttf b/src/assets/plugins/flaticon/font/Flaticon.ttf new file mode 100644 index 0000000..c68a315 Binary files /dev/null and b/src/assets/plugins/flaticon/font/Flaticon.ttf differ diff --git a/src/assets/plugins/flaticon/font/Flaticon.woff b/src/assets/plugins/flaticon/font/Flaticon.woff new file mode 100644 index 0000000..73ef42b Binary files /dev/null and b/src/assets/plugins/flaticon/font/Flaticon.woff differ diff --git a/src/assets/plugins/flaticon/license.html b/src/assets/plugins/flaticon/license.html new file mode 100644 index 0000000..7d8341b --- /dev/null +++ b/src/assets/plugins/flaticon/license.html @@ -0,0 +1,90 @@ + + + + + User License + + + + + + +
    +
    + +
    +
    +

    Thank you!

    +

    Here you have your license!

    + +

    + If you are not redirected automatically, please click this link to get your license +

    +
    +
    + + + \ No newline at end of file diff --git a/src/assets/plugins/flaticon2/flaticon.css b/src/assets/plugins/flaticon2/flaticon.css new file mode 100644 index 0000000..3494f3d --- /dev/null +++ b/src/assets/plugins/flaticon2/flaticon.css @@ -0,0 +1,267 @@ + /* + Flaticon icon font: Flaticon + Creation date: 20/03/2017 20:02 + */ + +@font-face { + font-family: "Flaticon2"; + src: url("./font/Flaticon2.eot"); + src: url("./font/Flaticon2.eot?#iefix") format("embedded-opentype"), + url("./font/Flaticon2.woff") format("woff"), + url("./font/Flaticon2.ttf") format("truetype"), + url("./font/Flaticon2.svg#Flaticon2") format("svg"); + font-weight: normal; + font-style: normal; +} + +@media screen and (-webkit-min-device-pixel-ratio:0) { + @font-face { + font-family: "Flaticon2"; + src: url("./font/Flaticon2.svg#Flaticon2") format("svg"); + } +} + +[class^="flaticon2-"]:before, +[class*=" flaticon2-"]:before { + font-family: Flaticon2; + font-style: normal; + font-weight: normal; + font-variant: normal; + line-height: 1; + text-decoration: inherit; + text-rendering: optimizeLegibility; + text-transform: none; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-smoothing: antialiased; +} + +.flaticon2-notification:before { content: "\f100"; } +.flaticon2-settings:before { content: "\f101"; } +.flaticon2-search:before { content: "\f102"; } +.flaticon2-delete:before { content: "\f103"; } +.flaticon2-psd:before { content: "\f104"; } +.flaticon2-list:before { content: "\f105"; } +.flaticon2-box:before { content: "\f106"; } +.flaticon2-download:before { content: "\f107"; } +.flaticon2-shield:before { content: "\f108"; } +.flaticon2-paperplane:before { content: "\f109"; } +.flaticon2-avatar:before { content: "\f10a"; } +.flaticon2-bell:before { content: "\f10b"; } +.flaticon2-fax:before { content: "\f10c"; } +.flaticon2-chart2:before { content: "\f10d"; } +.flaticon2-supermarket:before { content: "\f10e"; } +.flaticon2-phone:before { content: "\f10f"; } +.flaticon2-envelope:before { content: "\f110"; } +.flaticon2-pin:before { content: "\f111"; } +.flaticon2-chat:before { content: "\f112"; } +.flaticon2-chart:before { content: "\f113"; } +.flaticon2-infographic:before { content: "\f114"; } +.flaticon2-grids:before { content: "\f115"; } +.flaticon2-menu:before { content: "\f116"; } +.flaticon2-plus:before { content: "\f117"; } +.flaticon2-list-1:before { content: "\f118"; } +.flaticon2-talk:before { content: "\f119"; } +.flaticon2-file:before { content: "\f11a"; } +.flaticon2-user:before { content: "\f11b"; } +.flaticon2-line-chart:before { content: "\f11c"; } +.flaticon2-percentage:before { content: "\f11d"; } +.flaticon2-menu-1:before { content: "\f11e"; } +.flaticon2-paper-plane:before { content: "\f11f"; } +.flaticon2-menu-2:before { content: "\f120"; } +.flaticon2-shopping-cart:before { content: "\f121"; } +.flaticon2-pie-chart:before { content: "\f122"; } +.flaticon2-box-1:before { content: "\f123"; } +.flaticon2-map:before { content: "\f124"; } +.flaticon2-favourite:before { content: "\f125"; } +.flaticon2-checking:before { content: "\f126"; } +.flaticon2-safe:before { content: "\f127"; } +.flaticon2-heart-rate-monitor:before { content: "\f128"; } +.flaticon2-layers:before { content: "\f129"; } +.flaticon2-delivery-package:before { content: "\f12a"; } +.flaticon2-sms:before { content: "\f12b"; } +.flaticon2-image-file:before { content: "\f12c"; } +.flaticon2-plus-1:before { content: "\f12d"; } +.flaticon2-send:before { content: "\f12e"; } +.flaticon2-graphic-design:before { content: "\f12f"; } +.flaticon2-cup:before { content: "\f130"; } +.flaticon2-website:before { content: "\f131"; } +.flaticon2-gift:before { content: "\f132"; } +.flaticon2-chronometer:before { content: "\f133"; } +.flaticon2-browser:before { content: "\f134"; } +.flaticon2-digital-marketing:before { content: "\f135"; } +.flaticon2-calendar:before { content: "\f136"; } +.flaticon2-calendar-1:before { content: "\f137"; } +.flaticon2-rocket:before { content: "\f138"; } +.flaticon2-analytics:before { content: "\f139"; } +.flaticon2-pie-chart-1:before { content: "\f13a"; } +.flaticon2-pie-chart-2:before { content: "\f13b"; } +.flaticon2-analytics-1:before { content: "\f13c"; } +.flaticon2-google-drive-file:before { content: "\f13d"; } +.flaticon2-pie-chart-3:before { content: "\f13e"; } +.flaticon2-poll-symbol:before { content: "\f13f"; } +.flaticon2-gear:before { content: "\f140"; } +.flaticon2-magnifier-tool:before { content: "\f141"; } +.flaticon2-add:before { content: "\f142"; } +.flaticon2-cube:before { content: "\f143"; } +.flaticon2-gift-1:before { content: "\f144"; } +.flaticon2-list-2:before { content: "\f145"; } +.flaticon2-shopping-cart-1:before { content: "\f146"; } +.flaticon2-calendar-2:before { content: "\f147"; } +.flaticon2-laptop:before { content: "\f148"; } +.flaticon2-cube-1:before { content: "\f149"; } +.flaticon2-layers-1:before { content: "\f14a"; } +.flaticon2-chat-1:before { content: "\f14b"; } +.flaticon2-copy:before { content: "\f14c"; } +.flaticon2-paper:before { content: "\f14d"; } +.flaticon2-hospital:before { content: "\f14e"; } +.flaticon2-calendar-3:before { content: "\f14f"; } +.flaticon2-speaker:before { content: "\f150"; } +.flaticon2-pie-chart-4:before { content: "\f151"; } +.flaticon2-schedule:before { content: "\f152"; } +.flaticon2-expand:before { content: "\f153"; } +.flaticon2-menu-3:before { content: "\f154"; } +.flaticon2-download-1:before { content: "\f155"; } +.flaticon2-help:before { content: "\f156"; } +.flaticon2-list-3:before { content: "\f157"; } +.flaticon2-notepad:before { content: "\f158"; } +.flaticon2-graph:before { content: "\f159"; } +.flaticon2-browser-1:before { content: "\f15a"; } +.flaticon2-photograph:before { content: "\f15b"; } +.flaticon2-browser-2:before { content: "\f15c"; } +.flaticon2-hourglass:before { content: "\f15d"; } +.flaticon2-mail:before { content: "\f15e"; } +.flaticon2-cardiogram:before { content: "\f15f"; } +.flaticon2-document:before { content: "\f160"; } +.flaticon2-contract:before { content: "\f161"; } +.flaticon2-graph-1:before { content: "\f162"; } +.flaticon2-graphic:before { content: "\f163"; } +.flaticon2-position:before { content: "\f164"; } +.flaticon2-soft-icons:before { content: "\f165"; } +.flaticon2-circle-vol-2:before { content: "\f166"; } +.flaticon2-rocket-1:before { content: "\f167"; } +.flaticon2-lorry:before { content: "\f168"; } +.flaticon2-cd:before { content: "\f169"; } +.flaticon2-file-1:before { content: "\f16a"; } +.flaticon2-reload:before { content: "\f16b"; } +.flaticon2-placeholder:before { content: "\f16c"; } +.flaticon2-refresh:before { content: "\f16d"; } +.flaticon2-medical-records:before { content: "\f16e"; } +.flaticon2-rectangular:before { content: "\f16f"; } +.flaticon2-medical-records-1:before { content: "\f170"; } +.flaticon2-indent-dots:before { content: "\f171"; } +.flaticon2-search-1:before { content: "\f172"; } +.flaticon2-edit:before { content: "\f173"; } +.flaticon2-new-email:before { content: "\f174"; } +.flaticon2-calendar-4:before { content: "\f175"; } +.flaticon2-console:before { content: "\f176"; } +.flaticon2-open-text-book:before { content: "\f177"; } +.flaticon2-download-2:before { content: "\f178"; } +.flaticon2-zig-zag-line-sign:before { content: "\f179"; } +.flaticon2-tools-and-utensils:before { content: "\f17a"; } +.flaticon2-crisp-icons:before { content: "\f17b"; } +.flaticon2-trash:before { content: "\f17c"; } +.flaticon2-lock:before { content: "\f17d"; } +.flaticon2-bell-1:before { content: "\f17e"; } +.flaticon2-setup:before { content: "\f17f"; } +.flaticon2-menu-4:before { content: "\f180"; } +.flaticon2-architecture-and-city:before { content: "\f181"; } +.flaticon2-shelter:before { content: "\f182"; } +.flaticon2-add-1:before { content: "\f183"; } +.flaticon2-checkmark:before { content: "\f184"; } +.flaticon2-circular-arrow:before { content: "\f185"; } +.flaticon2-user-outline-symbol:before { content: "\f186"; } +.flaticon2-rhombus:before { content: "\f187"; } +.flaticon2-crisp-icons-1:before { content: "\f188"; } +.flaticon2-soft-icons-1:before { content: "\f189"; } +.flaticon2-hexagonal:before { content: "\f18a"; } +.flaticon2-time:before { content: "\f18b"; } +.flaticon2-contrast:before { content: "\f18c"; } +.flaticon2-telegram-logo:before { content: "\f18d"; } +.flaticon2-hangouts-logo:before { content: "\f18e"; } +.flaticon2-analytics-2:before { content: "\f18f"; } +.flaticon2-wifi:before { content: "\f190"; } +.flaticon2-protected:before { content: "\f191"; } +.flaticon2-drop:before { content: "\f192"; } +.flaticon2-mail-1:before { content: "\f193"; } +.flaticon2-delivery-truck:before { content: "\f194"; } +.flaticon2-writing:before { content: "\f195"; } +.flaticon2-calendar-5:before { content: "\f196"; } +.flaticon2-protection:before { content: "\f197"; } +.flaticon2-calendar-6:before { content: "\f198"; } +.flaticon2-calendar-7:before { content: "\f199"; } +.flaticon2-calendar-8:before { content: "\f19a"; } +.flaticon2-bell-2:before { content: "\f19b"; } +.flaticon2-hourglass-1:before { content: "\f19c"; } +.flaticon2-next:before { content: "\f19d"; } +.flaticon2-chat-2:before { content: "\f19e"; } +.flaticon2-correct:before { content: "\f19f"; } +.flaticon2-photo-camera:before { content: "\f1a0"; } +.flaticon2-fast-next:before { content: "\f1a1"; } +.flaticon2-fast-back:before { content: "\f1a2"; } +.flaticon2-down:before { content: "\f1a3"; } +.flaticon2-back:before { content: "\f1a4"; } +.flaticon2-up:before { content: "\f1a5"; } +.flaticon2-arrow-down:before { content: "\f1a6"; } +.flaticon2-arrow-up:before { content: "\f1a7"; } +.flaticon2-accept:before { content: "\f1a8"; } +.flaticon2-sort:before { content: "\f1a9"; } +.flaticon2-arrow:before { content: "\f1aa"; } +.flaticon2-back-1:before { content: "\f1ab"; } +.flaticon2-add-square:before { content: "\f1ac"; } +.flaticon2-quotation-mark:before { content: "\f1ad"; } +.flaticon2-clip-symbol:before { content: "\f1ae"; } +.flaticon2-check-mark:before { content: "\f1af"; } +.flaticon2-folder:before { content: "\f1b0"; } +.flaticon2-cancel-music:before { content: "\f1b1"; } +.flaticon2-cross:before { content: "\f1b2"; } +.flaticon2-pen:before { content: "\f1b3"; } +.flaticon2-email:before { content: "\f1b4"; } +.flaticon2-graph-2:before { content: "\f1b5"; } +.flaticon2-open-box:before { content: "\f1b6"; } +.flaticon2-files-and-folders:before { content: "\f1b7"; } +.flaticon2-ui:before { content: "\f1b8"; } +.flaticon2-sheet:before { content: "\f1b9"; } +.flaticon2-dashboard:before { content: "\f1ba"; } +.flaticon2-user-1:before { content: "\f1bb"; } +.flaticon2-group:before { content: "\f1bc"; } +.flaticon2-black-back-closed-envelope-shape:before { content: "\f1bd"; } +.flaticon2-left-arrow:before { content: "\f1be"; } +.flaticon2-sort-alphabetically:before { content: "\f1bf"; } +.flaticon2-sort-down:before { content: "\f1c0"; } +.flaticon2-rubbish-bin:before { content: "\f1c1"; } +.flaticon2-rubbish-bin-delete-button:before { content: "\f1c2"; } +.flaticon2-calendar-9:before { content: "\f1c3"; } +.flaticon2-tag:before { content: "\f1c4"; } +.flaticon2-refresh-button:before { content: "\f1c5"; } +.flaticon2-refresh-arrow:before { content: "\f1c6"; } +.flaticon2-reload-1:before { content: "\f1c7"; } +.flaticon2-refresh-1:before { content: "\f1c8"; } +.flaticon2-left-arrow-1:before { content: "\f1c9"; } +.flaticon2-reply:before { content: "\f1ca"; } +.flaticon2-reply-1:before { content: "\f1cb"; } +.flaticon2-printer:before { content: "\f1cc"; } +.flaticon2-print:before { content: "\f1cd"; } +.flaticon2-shrink:before { content: "\f1ce"; } +.flaticon2-resize:before { content: "\f1cf"; } +.flaticon2-arrow-1:before { content: "\f1d0"; } +.flaticon2-size:before { content: "\f1d1"; } +.flaticon2-arrow-2:before { content: "\f1d2"; } +.flaticon2-cancel:before { content: "\f1d3"; } +.flaticon2-exclamation:before { content: "\f1d4"; } +.flaticon2-line:before { content: "\f1d5"; } +.flaticon2-warning:before { content: "\f1d6"; } +.flaticon2-information:before { content: "\f1d7"; } +.flaticon2-layers-2:before { content: "\f1d8"; } +.flaticon2-file-2:before { content: "\f1d9"; } +.flaticon2-bell-3:before { content: "\f1da"; } +.flaticon2-bell-4:before { content: "\f1db"; } +.flaticon2-bell-5:before { content: "\f1dc"; } +.flaticon2-bell-alarm-symbol:before { content: "\f1dd"; } +.flaticon2-world:before { content: "\f1de"; } +.flaticon2-graphic-1:before { content: "\f1df"; } +.flaticon2-send-1:before { content: "\f1e0"; } +.flaticon2-location:before { content: "\f1e1"; } +.flaticon2-pin-1:before { content: "\f1e2"; } +.flaticon2-start-up:before { content: "\f1e3"; } +.flaticon2-right-arrow:before { content: "\f1e4"; } diff --git a/src/assets/plugins/flaticon2/font/Flaticon2.eot b/src/assets/plugins/flaticon2/font/Flaticon2.eot new file mode 100644 index 0000000..81cbd5a Binary files /dev/null and b/src/assets/plugins/flaticon2/font/Flaticon2.eot differ diff --git a/src/assets/plugins/flaticon2/font/Flaticon2.svg b/src/assets/plugins/flaticon2/font/Flaticon2.svg new file mode 100644 index 0000000..9bb005a --- /dev/null +++ b/src/assets/plugins/flaticon2/font/Flaticon2.svg @@ -0,0 +1,1491 @@ + + + + + +Created by FontForge 20170731 at Mon Aug 12 13:35:22 2019 + By root + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/plugins/flaticon2/font/Flaticon2.ttf b/src/assets/plugins/flaticon2/font/Flaticon2.ttf new file mode 100644 index 0000000..7e28879 Binary files /dev/null and b/src/assets/plugins/flaticon2/font/Flaticon2.ttf differ diff --git a/src/assets/plugins/flaticon2/font/Flaticon2.woff b/src/assets/plugins/flaticon2/font/Flaticon2.woff new file mode 100644 index 0000000..19b562d Binary files /dev/null and b/src/assets/plugins/flaticon2/font/Flaticon2.woff differ diff --git a/src/assets/plugins/flaticon2/font/Flaticon2.woff2 b/src/assets/plugins/flaticon2/font/Flaticon2.woff2 new file mode 100644 index 0000000..1301234 Binary files /dev/null and b/src/assets/plugins/flaticon2/font/Flaticon2.woff2 differ diff --git a/src/assets/plugins/flaticon2/license.html b/src/assets/plugins/flaticon2/license.html new file mode 100644 index 0000000..615ec48 --- /dev/null +++ b/src/assets/plugins/flaticon2/license.html @@ -0,0 +1,90 @@ + + + + + User License + + + + + + +
    +
    + +
    +
    +

    Thank you!

    +

    Here you have your license!

    + +

    + If you are not redirected automatically, please click this link to get your license +

    +
    +
    + + + \ No newline at end of file diff --git a/src/assets/plugins/jquery-idletimer/LICENSE-MIT b/src/assets/plugins/jquery-idletimer/LICENSE-MIT new file mode 100644 index 0000000..ffca956 --- /dev/null +++ b/src/assets/plugins/jquery-idletimer/LICENSE-MIT @@ -0,0 +1,22 @@ +Copyright (c) 2013 Paul Irish + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/src/assets/plugins/jquery-idletimer/idle-timer.js b/src/assets/plugins/jquery-idletimer/idle-timer.js new file mode 100644 index 0000000..9aad1b1 --- /dev/null +++ b/src/assets/plugins/jquery-idletimer/idle-timer.js @@ -0,0 +1,314 @@ +/*! Idle Timer - v1.1.0 - 2016-03-21 +* https://github.com/thorst/jquery-idletimer +* Copyright (c) 2016 Paul Irish; Licensed MIT */ +/* + mousewheel (deprecated) -> IE6.0, Chrome, Opera, Safari + DOMMouseScroll (deprecated) -> Firefox 1.0 + wheel (standard) -> Chrome 31, Firefox 17, IE9, Firefox Mobile 17.0 + + //No need to use, use DOMMouseScroll + MozMousePixelScroll -> Firefox 3.5, Firefox Mobile 1.0 + + //Events + WheelEvent -> see wheel + MouseWheelEvent -> see mousewheel + MouseScrollEvent -> Firefox 3.5, Firefox Mobile 1.0 +*/ +(function ($) { + + $.idleTimer = function (firstParam, elem) { + var opts; + if ( typeof firstParam === "object" ) { + opts = firstParam; + firstParam = null; + } else if (typeof firstParam === "number") { + opts = { timeout: firstParam }; + firstParam = null; + } + + // element to watch + elem = elem || document; + + // defaults that are to be stored as instance props on the elem + opts = $.extend({ + idle: false, // indicates if the user is idle + timeout: 30000, // the amount of time (ms) before the user is considered idle + events: "mousemove keydown wheel DOMMouseScroll mousewheel mousedown touchstart touchmove MSPointerDown MSPointerMove" // define active events + }, opts); + + var jqElem = $(elem), + obj = jqElem.data("idleTimerObj") || {}, + + /* (intentionally not documented) + * Toggles the idle state and fires an appropriate event. + * @return {void} + */ + toggleIdleState = function (e) { + var obj = $.data(elem, "idleTimerObj") || {}; + + // toggle the state + obj.idle = !obj.idle; + + // store toggle state date time + obj.olddate = +new Date(); + + // create a custom event, with state and name space + var event = $.Event((obj.idle ? "idle" : "active") + ".idleTimer"); + + // trigger event on object with elem and copy of obj + $(elem).trigger(event, [elem, $.extend({}, obj), e]); + }, + /** + * Handle event triggers + * @return {void} + * @method event + * @static + */ + handleEvent = function (e) { + var obj = $.data(elem, "idleTimerObj") || {}; + + if (e.type === "storage" && e.originalEvent.key !== obj.timerSyncId) { + return; + } + + // this is already paused, ignore events for now + if (obj.remaining != null) { return; } + + /* + mousemove is kinda buggy, it can be triggered when it should be idle. + Typically is happening between 115 - 150 milliseconds after idle triggered. + @psyafter & @kaellis report "always triggered if using modal (jQuery ui, with overlay)" + @thorst has similar issues on ios7 "after $.scrollTop() on text area" + */ + if (e.type === "mousemove") { + // if coord are same, it didn't move + if (e.pageX === obj.pageX && e.pageY === obj.pageY) { + return; + } + // if coord don't exist how could it move + if (typeof e.pageX === "undefined" && typeof e.pageY === "undefined") { + return; + } + // under 200 ms is hard to do, and you would have to stop, as continuous activity will bypass this + var elapsed = (+new Date()) - obj.olddate; + if (elapsed < 200) { + return; + } + } + + // clear any existing timeout + clearTimeout(obj.tId); + + // if the idle timer is enabled, flip + if (obj.idle) { + toggleIdleState(e); + } + + // store when user was last active + obj.lastActive = +new Date(); + + // update mouse coord + obj.pageX = e.pageX; + obj.pageY = e.pageY; + + // sync lastActive + if (e.type !== "storage" && obj.timerSyncId) { + if (typeof(localStorage) !== "undefined") { + localStorage.setItem(obj.timerSyncId, obj.lastActive); + } + } + + // set a new timeout + obj.tId = setTimeout(toggleIdleState, obj.timeout); + }, + /** + * Restore initial settings and restart timer + * @return {void} + * @method reset + * @static + */ + reset = function () { + + var obj = $.data(elem, "idleTimerObj") || {}; + + // reset settings + obj.idle = obj.idleBackup; + obj.olddate = +new Date(); + obj.lastActive = obj.olddate; + obj.remaining = null; + + // reset Timers + clearTimeout(obj.tId); + if (!obj.idle) { + obj.tId = setTimeout(toggleIdleState, obj.timeout); + } + + }, + /** + * Store remaining time, stop timer + * You can pause from an idle OR active state + * @return {void} + * @method pause + * @static + */ + pause = function () { + + var obj = $.data(elem, "idleTimerObj") || {}; + + // this is already paused + if ( obj.remaining != null ) { return; } + + // define how much is left on the timer + obj.remaining = obj.timeout - ((+new Date()) - obj.olddate); + + // clear any existing timeout + clearTimeout(obj.tId); + }, + /** + * Start timer with remaining value + * @return {void} + * @method resume + * @static + */ + resume = function () { + + var obj = $.data(elem, "idleTimerObj") || {}; + + // this isn't paused yet + if ( obj.remaining == null ) { return; } + + // start timer + if ( !obj.idle ) { + obj.tId = setTimeout(toggleIdleState, obj.remaining); + } + + // clear remaining + obj.remaining = null; + }, + /** + * Stops the idle timer. This removes appropriate event handlers + * and cancels any pending timeouts. + * @return {void} + * @method destroy + * @static + */ + destroy = function () { + + var obj = $.data(elem, "idleTimerObj") || {}; + + //clear any pending timeouts + clearTimeout(obj.tId); + + //Remove data + jqElem.removeData("idleTimerObj"); + + //detach the event handlers + jqElem.off("._idleTimer"); + }, + /** + * Returns the time until becoming idle + * @return {number} + * @method remainingtime + * @static + */ + remainingtime = function () { + + var obj = $.data(elem, "idleTimerObj") || {}; + + //If idle there is no time remaining + if ( obj.idle ) { return 0; } + + //If its paused just return that + if ( obj.remaining != null ) { return obj.remaining; } + + //Determine remaining, if negative idle didn't finish flipping, just return 0 + var remaining = obj.timeout - ((+new Date()) - obj.lastActive); + if (remaining < 0) { remaining = 0; } + + //If this is paused return that number, else return current remaining + return remaining; + }; + + + // determine which function to call + if (firstParam === null && typeof obj.idle !== "undefined") { + // they think they want to init, but it already is, just reset + reset(); + return jqElem; + } else if (firstParam === null) { + // they want to init + } else if (firstParam !== null && typeof obj.idle === "undefined") { + // they want to do something, but it isnt init + // not sure the best way to handle this + return false; + } else if (firstParam === "destroy") { + destroy(); + return jqElem; + } else if (firstParam === "pause") { + pause(); + return jqElem; + } else if (firstParam === "resume") { + resume(); + return jqElem; + } else if (firstParam === "reset") { + reset(); + return jqElem; + } else if (firstParam === "getRemainingTime") { + return remainingtime(); + } else if (firstParam === "getElapsedTime") { + return (+new Date()) - obj.olddate; + } else if (firstParam === "getLastActiveTime") { + return obj.lastActive; + } else if (firstParam === "isIdle") { + return obj.idle; + } + + /* (intentionally not documented) + * Handles a user event indicating that the user isn't idle. namespaced with internal idleTimer + * @param {Event} event A DOM2-normalized event object. + * @return {void} + */ + jqElem.on($.trim((opts.events + " ").split(" ").join("._idleTimer ")), function (e) { + handleEvent(e); + }); + + if (opts.timerSyncId) { + $(window).bind("storage", handleEvent); + } + + // Internal Object Properties, This isn't all necessary, but we + // explicitly define all keys here so we know what we are working with + obj = $.extend({}, { + olddate : +new Date(), // the last time state changed + lastActive: +new Date(), // the last time timer was active + idle : opts.idle, // current state + idleBackup : opts.idle, // backup of idle parameter since it gets modified + timeout : opts.timeout, // the interval to change state + remaining : null, // how long until state changes + timerSyncId : opts.timerSyncId, // localStorage key to use for syncing this timer + tId : null, // the idle timer setTimeout + pageX : null, // used to store the mouse coord + pageY : null + }); + + // set a timeout to toggle state. May wish to omit this in some situations + if (!obj.idle) { + obj.tId = setTimeout(toggleIdleState, obj.timeout); + } + + // store our instance on the object + $.data(elem, "idleTimerObj", obj); + + return jqElem; + }; + + // This allows binding to element + $.fn.idleTimer = function (firstParam) { + if (this[0]) { + return $.idleTimer(firstParam, this[0]); + } + + return this; + }; + +})(jQuery); diff --git a/src/assets/plugins/jquery-idletimer/idle-timer.min.js b/src/assets/plugins/jquery-idletimer/idle-timer.min.js new file mode 100644 index 0000000..e4031ed --- /dev/null +++ b/src/assets/plugins/jquery-idletimer/idle-timer.min.js @@ -0,0 +1,2 @@ +/*! Idle Timer v1.1.0 2016-03-21 | https://github.com/thorst/jquery-idletimer | (c) 2016 Paul Irish | Licensed MIT */ +!function(a){a.idleTimer=function(b,c){var d;"object"==typeof b?(d=b,b=null):"number"==typeof b&&(d={timeout:b},b=null),c=c||document,d=a.extend({idle:!1,timeout:3e4,events:"mousemove keydown wheel DOMMouseScroll mousewheel mousedown touchstart touchmove MSPointerDown MSPointerMove"},d);var e=a(c),f=e.data("idleTimerObj")||{},g=function(b){var d=a.data(c,"idleTimerObj")||{};d.idle=!d.idle,d.olddate=+new Date;var e=a.Event((d.idle?"idle":"active")+".idleTimer");a(c).trigger(e,[c,a.extend({},d),b])},h=function(b){var d=a.data(c,"idleTimerObj")||{};if(("storage"!==b.type||b.originalEvent.key===d.timerSyncId)&&null==d.remaining){if("mousemove"===b.type){if(b.pageX===d.pageX&&b.pageY===d.pageY)return;if("undefined"==typeof b.pageX&&"undefined"==typeof b.pageY)return;var e=+new Date-d.olddate;if(200>e)return}clearTimeout(d.tId),d.idle&&g(b),d.lastActive=+new Date,d.pageX=b.pageX,d.pageY=b.pageY,"storage"!==b.type&&d.timerSyncId&&"undefined"!=typeof localStorage&&localStorage.setItem(d.timerSyncId,d.lastActive),d.tId=setTimeout(g,d.timeout)}},i=function(){var b=a.data(c,"idleTimerObj")||{};b.idle=b.idleBackup,b.olddate=+new Date,b.lastActive=b.olddate,b.remaining=null,clearTimeout(b.tId),b.idle||(b.tId=setTimeout(g,b.timeout))},j=function(){var b=a.data(c,"idleTimerObj")||{};null==b.remaining&&(b.remaining=b.timeout-(+new Date-b.olddate),clearTimeout(b.tId))},k=function(){var b=a.data(c,"idleTimerObj")||{};null!=b.remaining&&(b.idle||(b.tId=setTimeout(g,b.remaining)),b.remaining=null)},l=function(){var b=a.data(c,"idleTimerObj")||{};clearTimeout(b.tId),e.removeData("idleTimerObj"),e.off("._idleTimer")},m=function(){var b=a.data(c,"idleTimerObj")||{};if(b.idle)return 0;if(null!=b.remaining)return b.remaining;var d=b.timeout-(+new Date-b.lastActive);return 0>d&&(d=0),d};if(null===b&&"undefined"!=typeof f.idle)return i(),e;if(null===b);else{if(null!==b&&"undefined"==typeof f.idle)return!1;if("destroy"===b)return l(),e;if("pause"===b)return j(),e;if("resume"===b)return k(),e;if("reset"===b)return i(),e;if("getRemainingTime"===b)return m();if("getElapsedTime"===b)return+new Date-f.olddate;if("getLastActiveTime"===b)return f.lastActive;if("isIdle"===b)return f.idle}return e.on(a.trim((d.events+" ").split(" ").join("._idleTimer ")),function(a){h(a)}),d.timerSyncId&&a(window).bind("storage",h),f=a.extend({},{olddate:+new Date,lastActive:+new Date,idle:d.idle,idleBackup:d.idle,timeout:d.timeout,remaining:null,timerSyncId:d.timerSyncId,tId:null,pageX:null,pageY:null}),f.idle||(f.tId=setTimeout(g,f.timeout)),a.data(c,"idleTimerObj",f),e},a.fn.idleTimer=function(b){return this[0]?a.idleTimer(b,this[0]):this}}(jQuery); \ No newline at end of file diff --git a/src/assets/plugins/jquery-ui/LICENSE.txt b/src/assets/plugins/jquery-ui/LICENSE.txt new file mode 100644 index 0000000..4819e54 --- /dev/null +++ b/src/assets/plugins/jquery-ui/LICENSE.txt @@ -0,0 +1,43 @@ +Copyright jQuery Foundation and other contributors, https://jquery.org/ + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/jquery/jquery-ui + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code contained within the demos directory. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +All files located in the node_modules and external directories are +externally maintained libraries used by this software which have their +own licenses; we recommend you read them, as their terms may differ from +the terms above. diff --git a/src/assets/plugins/jquery-ui/images/ui-icons_444444_256x240.png b/src/assets/plugins/jquery-ui/images/ui-icons_444444_256x240.png new file mode 100644 index 0000000..19f664d Binary files /dev/null and b/src/assets/plugins/jquery-ui/images/ui-icons_444444_256x240.png differ diff --git a/src/assets/plugins/jquery-ui/images/ui-icons_555555_256x240.png b/src/assets/plugins/jquery-ui/images/ui-icons_555555_256x240.png new file mode 100644 index 0000000..e965f6d Binary files /dev/null and b/src/assets/plugins/jquery-ui/images/ui-icons_555555_256x240.png differ diff --git a/src/assets/plugins/jquery-ui/images/ui-icons_777620_256x240.png b/src/assets/plugins/jquery-ui/images/ui-icons_777620_256x240.png new file mode 100644 index 0000000..9785948 Binary files /dev/null and b/src/assets/plugins/jquery-ui/images/ui-icons_777620_256x240.png differ diff --git a/src/assets/plugins/jquery-ui/images/ui-icons_777777_256x240.png b/src/assets/plugins/jquery-ui/images/ui-icons_777777_256x240.png new file mode 100644 index 0000000..323c456 Binary files /dev/null and b/src/assets/plugins/jquery-ui/images/ui-icons_777777_256x240.png differ diff --git a/src/assets/plugins/jquery-ui/images/ui-icons_cc0000_256x240.png b/src/assets/plugins/jquery-ui/images/ui-icons_cc0000_256x240.png new file mode 100644 index 0000000..45ac778 Binary files /dev/null and b/src/assets/plugins/jquery-ui/images/ui-icons_cc0000_256x240.png differ diff --git a/src/assets/plugins/jquery-ui/images/ui-icons_ffffff_256x240.png b/src/assets/plugins/jquery-ui/images/ui-icons_ffffff_256x240.png new file mode 100644 index 0000000..fe41d2d Binary files /dev/null and b/src/assets/plugins/jquery-ui/images/ui-icons_ffffff_256x240.png differ diff --git a/src/assets/plugins/jquery-ui/jquery-ui.min.css b/src/assets/plugins/jquery-ui/jquery-ui.min.css new file mode 100644 index 0000000..47b7aeb --- /dev/null +++ b/src/assets/plugins/jquery-ui/jquery-ui.min.css @@ -0,0 +1,7 @@ +/*! jQuery UI - v1.12.1 - 2019-06-14 +* http://jqueryui.com +* Includes: draggable.css, core.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, dialog.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=base&cornerRadiusShadow=8px&offsetLeftShadow=0px&offsetTopShadow=0px&thicknessShadow=5px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=666666&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cc0000&fcError=5f3f3f&borderColorError=f1a899&bgTextureError=flat&bgColorError=fddfdf&iconColorHighlight=777620&fcHighlight=777620&borderColorHighlight=dad55e&bgTextureHighlight=flat&bgColorHighlight=fffa90&iconColorActive=ffffff&fcActive=ffffff&borderColorActive=003eff&bgTextureActive=flat&bgColorActive=007fff&iconColorHover=555555&fcHover=2b2b2b&borderColorHover=cccccc&bgTextureHover=flat&bgColorHover=ededed&iconColorDefault=777777&fcDefault=454545&borderColorDefault=c5c5c5&bgTextureDefault=flat&bgColorDefault=f6f6f6&iconColorContent=444444&fcContent=333333&borderColorContent=dddddd&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=444444&fcHeader=333333&borderColorHeader=dddddd&bgTextureHeader=flat&bgColorHeader=e9e9e9&cornerRadius=3px&fwDefault=normal&fsDefault=1em&ffDefault=Arial%2CHelvetica%2Csans-serif +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #c5c5c5}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#2b2b2b;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#003eff;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-checked{border:1px solid #dad55e;background:#fffa90}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:0 0 5px #666;box-shadow:0 0 5px #666} \ No newline at end of file diff --git a/src/assets/plugins/jquery-ui/jquery-ui.min.js b/src/assets/plugins/jquery-ui/jquery-ui.min.js new file mode 100644 index 0000000..1425ed0 --- /dev/null +++ b/src/assets/plugins/jquery-ui/jquery-ui.min.js @@ -0,0 +1,12 @@ +/*! jQuery UI - v1.12.1 - 2019-06-14 +* http://jqueryui.com +* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/draggable.js, widgets/droppable.js, widgets/resizable.js, widgets/selectable.js, widgets/sortable.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/dialog.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/selectmenu.js, widgets/slider.js, widgets/spinner.js, widgets/tabs.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){function e(t){for(var e=t.css("visibility");"inherit"===e;)t=t.parent(),e=t.css("visibility");return"hidden"!==e}function i(t){return function(){var e=this.element.val();t.apply(this,arguments),this._refresh(),e!==this.element.val()&&this._trigger("change")}}t.ui=t.ui||{},t.ui.version="1.12.1";var s=0,n=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},l=e.split(".")[0];e=e.split(".")[1];var h=l+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][h.toLowerCase()]=function(e){return!!t.data(e,h)},t[l]=t[l]||{},n=t[l][e],o=t[l][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:l,widgetName:e,widgetFullName:h}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var i,s,o=n.call(arguments,1),a=0,r=o.length;r>a;a++)for(i in o[a])s=o[a][i],o[a].hasOwnProperty(i)&&void 0!==s&&(e[i]=t.isPlainObject(s)?t.isPlainObject(e[i])?t.widget.extend({},e[i],s):t.widget.extend({},s):s);return e},t.widget.bridge=function(e,i){var s=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=n.call(arguments,1),l=this;return a?this.length||"instance"!==o?this.each(function(){var i,n=t.data(this,s);return"instance"===o?(l=n,!1):n?t.isFunction(n[o])&&"_"!==o.charAt(0)?(i=n[o].apply(n,r),i!==n&&void 0!==i?(l=i&&i.jquery?l.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):l=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,s);e?(e.option(o||{}),e._init&&e._init()):t.data(this,s,new i(o,this))})),l}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,i){i=t(i||this.defaultElement||this)[0],this.element=t(i),this.uuid=s++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},i!==this&&(t.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===i&&this.destroy()}}),this.document=t(i.style?i.ownerDocument:i.document||i),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var l=s.match(/^([\w:-]*)\s*(.*)$/),h=l[1]+o.eventNamespace,c=l[2];c?n.on(h,c,r):i.on(h,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,l=/top|center|bottom/,h=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};h>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),l.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,l=n-r,h=r+e.collisionWidth-a-n;e.collisionWidth>a?l>0&&0>=h?(i=t.left+l+e.collisionWidth-a-n,t.left+=l-i):t.left=h>0&&0>=l?n:l>h?n+a-e.collisionWidth:n:l>0?t.left+=l:h>0?t.left-=h:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,l=n-r,h=r+e.collisionHeight-a-n;e.collisionHeight>a?l>0&&0>=h?(i=t.top+l+e.collisionHeight-a-n,t.top+=l-i):t.top=h>0&&0>=l?n:l>h?n+a-e.collisionHeight:n:l>0?t.top+=l:h>0?t.top-=h:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,l=n.isWindow?n.scrollLeft:n.offset.left,h=t.left-e.collisionPosition.marginLeft,c=h-l,u=h+e.collisionWidth-r-l,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-l,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,l=n.isWindow?n.scrollTop:n.offset.top,h=t.top-e.collisionPosition.marginTop,c=h-l,u=h+e.collisionHeight-r-l,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-l,(i>0||u>a(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,l,h=i.nodeName.toLowerCase();return"area"===h?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(h)?(r=!i.disabled,r&&(l=t(i).closest("fieldset")[0],l&&(r=!l.disabled))):r="a"===h?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var o=!1;t(document).on("mouseup",function(){o=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!o){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,n="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),o=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,o=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.ui.safeActiveElement=function(t){var e;try{e=t.activeElement}catch(i){e=t.body}return e||(e=t.body),e.nodeName||(e=t.body),e},t.ui.safeBlur=function(e){e&&"body"!==e.nodeName.toLowerCase()&&t(e).trigger("blur")},t.widget("ui.draggable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this._addClass("ui-draggable"),this._setHandleClassName(),this._mouseInit()},_setOption:function(t,e){this._super(t,e),"handle"===t&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(e){var i=this.options;return this.helper||i.disabled||t(e.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(e),this.handle?(this._blurActiveElement(e),this._blockFrames(i.iframeFix===!0?"iframe":i.iframeFix),!0):!1)},_blockFrames:function(e){this.iframeBlocks=this.document.find(e).map(function(){var e=t(this);return t("
    ").css("position","absolute").appendTo(e.parent()).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(e){var i=t.ui.safeActiveElement(this.document[0]),s=t(e.target);s.closest(i).length||t.ui.safeBlur(i)},_mouseStart:function(e){var i=this.options;return this.helper=this._createHelper(e),this._addClass(this.helper,"ui-draggable-dragging"),this._cacheHelperProportions(),t.ui.ddmanager&&(t.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=this.helper.parents().filter(function(){return"fixed"===t(this).css("position")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(e),this.originalPosition=this.position=this._generatePosition(e,!1),this.originalPageX=e.pageX,this.originalPageY=e.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",e)===!1?(this._clear(),!1):(this._cacheHelperProportions(),t.ui.ddmanager&&!i.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this._mouseDrag(e,!0),t.ui.ddmanager&&t.ui.ddmanager.dragStart(this,e),!0)},_refreshOffsets:function(t){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:t.pageX-this.offset.left,top:t.pageY-this.offset.top}},_mouseDrag:function(e,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(e,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",e,s)===!1)return this._mouseUp(new t.Event("mouseup",e)),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),!1},_mouseStop:function(e){var i=this,s=!1;return t.ui.ddmanager&&!this.options.dropBehaviour&&(s=t.ui.ddmanager.drop(this,e)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||t.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?t(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",e)!==!1&&i._clear()}):this._trigger("stop",e)!==!1&&this._clear(),!1},_mouseUp:function(e){return this._unblockFrames(),t.ui.ddmanager&&t.ui.ddmanager.dragStop(this,e),this.handleElement.is(e.target)&&this.element.trigger("focus"),t.ui.mouse.prototype._mouseUp.call(this,e)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp(new t.Event("mouseup",{target:this.element[0]})):this._clear(),this},_getHandle:function(e){return this.options.handle?!!t(e.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this._addClass(this.handleElement,"ui-draggable-handle")},_removeHandleClassName:function(){this._removeClass(this.handleElement,"ui-draggable-handle")},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper),n=s?t(i.helper.apply(this.element[0],[e])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return n.parents("body").length||n.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s&&n[0]===this.element[0]&&this._setPositionRelative(),n[0]===this.element[0]||/(fixed|absolute)/.test(n.css("position"))||n.css("position","absolute"),n},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative")},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_isRootNode:function(t){return/(html|body)/i.test(t.tagName)||t===this.document[0]},_getParentOffset:function(){var e=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var t=this.element.position(),e=this._isRootNode(this.scrollParent[0]);return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+(e?0:this.scrollParent.scrollTop()),left:t.left-(parseInt(this.helper.css("left"),10)||0)+(e?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options,o=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[t(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,t(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,t(window).scrollLeft()+t(window).width()-this.helperProportions.width-this.margins.left,t(window).scrollTop()+(t(window).height()||o.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,t(o).width()-this.helperProportions.width-this.margins.left,(t(o).height()||o.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=t(n.containment),s=i[0],s&&(e=/(scroll|auto)/.test(i.css("overflow")),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(e?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(e?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0)},_convertPositionTo:function(t,e){e||(e=this.position);var i="absolute"===t?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:e.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:e.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(t,e){var i,s,n,o,a=this.options,r=this._isRootNode(this.scrollParent[0]),l=t.pageX,h=t.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),e&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,t.pageX-this.offset.click.lefti[2]&&(l=i[2]+this.offset.click.left),t.pageY-this.offset.click.top>i[3]&&(h=i[3]+this.offset.click.top)),a.grid&&(n=a.grid[1]?this.originalPageY+Math.round((h-this.originalPageY)/a.grid[1])*a.grid[1]:this.originalPageY,h=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-a.grid[1]:n+a.grid[1]:n,o=a.grid[0]?this.originalPageX+Math.round((l-this.originalPageX)/a.grid[0])*a.grid[0]:this.originalPageX,l=i?o-this.offset.click.left>=i[0]||o-this.offset.click.left>i[2]?o:o-this.offset.click.left>=i[0]?o-a.grid[0]:o+a.grid[0]:o),"y"===a.axis&&(l=this.originalPageX),"x"===a.axis&&(h=this.originalPageY)),{top:h-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:l-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)} +},_clear:function(){this._removeClass(this.helper,"ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_trigger:function(e,i,s){return s=s||this._uiHash(),t.ui.plugin.call(this,e,[i,s,this],!0),/^(drag|start|stop)/.test(e)&&(this.positionAbs=this._convertPositionTo("absolute"),s.offset=this.positionAbs),t.Widget.prototype._trigger.call(this,e,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),t.ui.plugin.add("draggable","connectToSortable",{start:function(e,i,s){var n=t.extend({},i,{item:s.element});s.sortables=[],t(s.options.connectToSortable).each(function(){var i=t(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push(i),i.refreshPositions(),i._trigger("activate",e,n))})},stop:function(e,i,s){var n=t.extend({},i,{item:s.element});s.cancelHelperRemoval=!1,t.each(s.sortables,function(){var t=this;t.isOver?(t.isOver=0,s.cancelHelperRemoval=!0,t.cancelHelperRemoval=!1,t._storedCSS={position:t.placeholder.css("position"),top:t.placeholder.css("top"),left:t.placeholder.css("left")},t._mouseStop(e),t.options.helper=t.options._helper):(t.cancelHelperRemoval=!0,t._trigger("deactivate",e,n))})},drag:function(e,i,s){t.each(s.sortables,function(){var n=!1,o=this;o.positionAbs=s.positionAbs,o.helperProportions=s.helperProportions,o.offset.click=s.offset.click,o._intersectsWith(o.containerCache)&&(n=!0,t.each(s.sortables,function(){return this.positionAbs=s.positionAbs,this.helperProportions=s.helperProportions,this.offset.click=s.offset.click,this!==o&&this._intersectsWith(this.containerCache)&&t.contains(o.element[0],this.element[0])&&(n=!1),n})),n?(o.isOver||(o.isOver=1,s._parent=i.helper.parent(),o.currentItem=i.helper.appendTo(o.element).data("ui-sortable-item",!0),o.options._helper=o.options.helper,o.options.helper=function(){return i.helper[0]},e.target=o.currentItem[0],o._mouseCapture(e,!0),o._mouseStart(e,!0,!0),o.offset.click.top=s.offset.click.top,o.offset.click.left=s.offset.click.left,o.offset.parent.left-=s.offset.parent.left-o.offset.parent.left,o.offset.parent.top-=s.offset.parent.top-o.offset.parent.top,s._trigger("toSortable",e),s.dropped=o.element,t.each(s.sortables,function(){this.refreshPositions()}),s.currentItem=s.element,o.fromOutside=s),o.currentItem&&(o._mouseDrag(e),i.position=o.position)):o.isOver&&(o.isOver=0,o.cancelHelperRemoval=!0,o.options._revert=o.options.revert,o.options.revert=!1,o._trigger("out",e,o._uiHash(o)),o._mouseStop(e,!0),o.options.revert=o.options._revert,o.options.helper=o.options._helper,o.placeholder&&o.placeholder.remove(),i.helper.appendTo(s._parent),s._refreshOffsets(e),i.position=s._generatePosition(e,!0),s._trigger("fromSortable",e),s.dropped=!1,t.each(s.sortables,function(){this.refreshPositions()}))})}}),t.ui.plugin.add("draggable","cursor",{start:function(e,i,s){var n=t("body"),o=s.options;n.css("cursor")&&(o._cursor=n.css("cursor")),n.css("cursor",o.cursor)},stop:function(e,i,s){var n=s.options;n._cursor&&t("body").css("cursor",n._cursor)}}),t.ui.plugin.add("draggable","opacity",{start:function(e,i,s){var n=t(i.helper),o=s.options;n.css("opacity")&&(o._opacity=n.css("opacity")),n.css("opacity",o.opacity)},stop:function(e,i,s){var n=s.options;n._opacity&&t(i.helper).css("opacity",n._opacity)}}),t.ui.plugin.add("draggable","scroll",{start:function(t,e,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(e,i,s){var n=s.options,o=!1,a=s.scrollParentNotHidden[0],r=s.document[0];a!==r&&"HTML"!==a.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+a.offsetHeight-e.pageY=0;d--)l=s.snapElements[d].left-s.margins.left,h=l+s.snapElements[d].width,c=s.snapElements[d].top-s.margins.top,u=c+s.snapElements[d].height,l-g>_||m>h+g||c-g>b||v>u+g||!t.contains(s.snapElements[d].item.ownerDocument,s.snapElements[d].item)?(s.snapElements[d].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,e,t.extend(s._uiHash(),{snapItem:s.snapElements[d].item})),s.snapElements[d].snapping=!1):("inner"!==f.snapMode&&(n=g>=Math.abs(c-b),o=g>=Math.abs(u-v),a=g>=Math.abs(l-_),r=g>=Math.abs(h-m),n&&(i.position.top=s._convertPositionTo("relative",{top:c-s.helperProportions.height,left:0}).top),o&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top),a&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left)),p=n||o||a||r,"outer"!==f.snapMode&&(n=g>=Math.abs(c-v),o=g>=Math.abs(u-b),a=g>=Math.abs(l-m),r=g>=Math.abs(h-_),n&&(i.position.top=s._convertPositionTo("relative",{top:c,left:0}).top),o&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top),a&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left)),!s.snapElements[d].snapping&&(n||o||a||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,e,t.extend(s._uiHash(),{snapItem:s.snapElements[d].item})),s.snapElements[d].snapping=n||o||a||r||p)}}),t.ui.plugin.add("draggable","stack",{start:function(e,i,s){var n,o=s.options,a=t.makeArray(t(o.stack)).sort(function(e,i){return(parseInt(t(e).css("zIndex"),10)||0)-(parseInt(t(i).css("zIndex"),10)||0)});a.length&&(n=parseInt(t(a[0]).css("zIndex"),10)||0,t(a).each(function(e){t(this).css("zIndex",n+e)}),this.css("zIndex",n+a.length))}}),t.ui.plugin.add("draggable","zIndex",{start:function(e,i,s){var n=t(i.helper),o=s.options;n.css("zIndex")&&(o._zIndex=n.css("zIndex")),n.css("zIndex",o.zIndex)},stop:function(e,i,s){var n=s.options;n._zIndex&&t(i.helper).css("zIndex",n._zIndex)}}),t.ui.draggable,t.widget("ui.droppable",{version:"1.12.1",widgetEventPrefix:"drop",options:{accept:"*",addClasses:!0,greedy:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var e,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=t.isFunction(s)?s:function(t){return t.is(s)},this.proportions=function(){return arguments.length?(e=arguments[0],void 0):e?e:e={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},this._addToManager(i.scope),i.addClasses&&this._addClass("ui-droppable")},_addToManager:function(e){t.ui.ddmanager.droppables[e]=t.ui.ddmanager.droppables[e]||[],t.ui.ddmanager.droppables[e].push(this)},_splice:function(t){for(var e=0;t.length>e;e++)t[e]===this&&t.splice(e,1)},_destroy:function(){var e=t.ui.ddmanager.droppables[this.options.scope];this._splice(e)},_setOption:function(e,i){if("accept"===e)this.accept=t.isFunction(i)?i:function(t){return t.is(i)};else if("scope"===e){var s=t.ui.ddmanager.droppables[this.options.scope];this._splice(s),this._addToManager(i)}this._super(e,i)},_activate:function(e){var i=t.ui.ddmanager.current;this._addActiveClass(),i&&this._trigger("activate",e,this.ui(i))},_deactivate:function(e){var i=t.ui.ddmanager.current;this._removeActiveClass(),i&&this._trigger("deactivate",e,this.ui(i))},_over:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this._addHoverClass(),this._trigger("over",e,this.ui(i)))},_out:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this._removeHoverClass(),this._trigger("out",e,this.ui(i)))},_drop:function(e,i){var s=i||t.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var i=t(this).droppable("instance");return i.options.greedy&&!i.options.disabled&&i.options.scope===s.options.scope&&i.accept.call(i.element[0],s.currentItem||s.element)&&a(s,t.extend(i,{offset:i.element.offset()}),i.options.tolerance,e)?(n=!0,!1):void 0}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this._removeActiveClass(),this._removeHoverClass(),this._trigger("drop",e,this.ui(s)),this.element):!1):!1},ui:function(t){return{draggable:t.currentItem||t.element,helper:t.helper,position:t.position,offset:t.positionAbs}},_addHoverClass:function(){this._addClass("ui-droppable-hover")},_removeHoverClass:function(){this._removeClass("ui-droppable-hover")},_addActiveClass:function(){this._addClass("ui-droppable-active")},_removeActiveClass:function(){this._removeClass("ui-droppable-active")}});var a=t.ui.intersect=function(){function t(t,e,i){return t>=e&&e+i>t}return function(e,i,s,n){if(!i.offset)return!1;var o=(e.positionAbs||e.position.absolute).left+e.margins.left,a=(e.positionAbs||e.position.absolute).top+e.margins.top,r=o+e.helperProportions.width,l=a+e.helperProportions.height,h=i.offset.left,c=i.offset.top,u=h+i.proportions().width,d=c+i.proportions().height;switch(s){case"fit":return o>=h&&u>=r&&a>=c&&d>=l;case"intersect":return o+e.helperProportions.width/2>h&&u>r-e.helperProportions.width/2&&a+e.helperProportions.height/2>c&&d>l-e.helperProportions.height/2;case"pointer":return t(n.pageY,c,i.proportions().height)&&t(n.pageX,h,i.proportions().width);case"touch":return(a>=c&&d>=a||l>=c&&d>=l||c>a&&l>d)&&(o>=h&&u>=o||r>=h&&u>=r||h>o&&r>u);default:return!1}}}();t.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(e,i){var s,n,o=t.ui.ddmanager.droppables[e.options.scope]||[],a=i?i.type:null,r=(e.currentItem||e.element).find(":data(ui-droppable)").addBack();t:for(s=0;o.length>s;s++)if(!(o[s].options.disabled||e&&!o[s].accept.call(o[s].element[0],e.currentItem||e.element))){for(n=0;r.length>n;n++)if(r[n]===o[s].element[0]){o[s].proportions().height=0;continue t}o[s].visible="none"!==o[s].element.css("display"),o[s].visible&&("mousedown"===a&&o[s]._activate.call(o[s],i),o[s].offset=o[s].element.offset(),o[s].proportions({width:o[s].element[0].offsetWidth,height:o[s].element[0].offsetHeight}))}},drop:function(e,i){var s=!1;return t.each((t.ui.ddmanager.droppables[e.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&a(e,this,this.options.tolerance,i)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],e.currentItem||e.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(e,i){e.element.parentsUntil("body").on("scroll.droppable",function(){e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)})},drag:function(e,i){e.options.refreshPositions&&t.ui.ddmanager.prepareOffsets(e,i),t.each(t.ui.ddmanager.droppables[e.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,o,r=a(e,this,this.options.tolerance,i),l=!r&&this.isover?"isout":r&&!this.isover?"isover":null;l&&(this.options.greedy&&(n=this.options.scope,o=this.element.parents(":data(ui-droppable)").filter(function(){return t(this).droppable("instance").options.scope===n}),o.length&&(s=t(o[0]).droppable("instance"),s.greedyChild="isover"===l)),s&&"isover"===l&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[l]=!0,this["isout"===l?"isover":"isout"]=!1,this["isover"===l?"_over":"_out"].call(this,i),s&&"isout"===l&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(e,i){e.element.parentsUntil("body").off("scroll.droppable"),e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)}},t.uiBackCompat!==!1&&t.widget("ui.droppable",t.ui.droppable,{options:{hoverClass:!1,activeClass:!1},_addActiveClass:function(){this._super(),this.options.activeClass&&this.element.addClass(this.options.activeClass)},_removeActiveClass:function(){this._super(),this.options.activeClass&&this.element.removeClass(this.options.activeClass)},_addHoverClass:function(){this._super(),this.options.hoverClass&&this.element.addClass(this.options.hoverClass)},_removeHoverClass:function(){this._super(),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass)}}),t.ui.droppable,t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,l=this._change[o];return this._updatePrevProperties(),l?(i=l.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,l,h=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,l=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,h.animate||this.element.css(t.extend(a,{top:l,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!h.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,l=this.originalPosition.top+this.originalSize.height,h=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&h&&(t.left=r-e.minWidth),s&&h&&(t.left=r-e.maxWidth),a&&c&&(t.top=l-e.minHeight),n&&c&&(t.top=l-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,l={width:i.size.width-r,height:i.size.height-a},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(l,c&&h?{top:c,left:h}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,l=t(this).resizable("instance"),h=l.options,c=l.element,u=h.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(l.containerElement=t(d),/document/.test(u)||u===document?(l.containerOffset={left:0,top:0},l.containerPosition={left:0,top:0},l.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=l._num(e.css("padding"+s))}),l.containerOffset=e.offset(),l.containerPosition=e.position(),l.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=l.containerOffset,n=l.containerSize.height,o=l.containerSize.width,a=l._hasScroll(d,"left")?d.scrollWidth:o,r=l._hasScroll(d)?d.scrollHeight:n,l.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,l=a.containerOffset,h=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=l),h.left<(a._helper?l.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-l.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?l.left:0),h.top<(a._helper?l.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-l.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?l.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-l.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-l.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),l=a.outerWidth()-e.sizeDiff.width,h=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:l,height:h}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:l,height:h})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,l="number"==typeof s.grid?[s.grid,s.grid]:s.grid,h=l[0]||1,c=l[1]||1,u=Math.round((n.width-o.width)/h)*h,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,g=s.maxWidth&&p>s.maxWidth,m=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=l,_&&(p+=h),v&&(f+=c),g&&(p-=h),m&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-h)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-h>0?(i.size.width=p,i.position.left=a.left-u):(p=h-e.width,i.size.width=p,i.position.left=a.left+o.width-p)) +}}),t.ui.resizable,t.widget("ui.selectable",t.ui.mouse,{version:"1.12.1",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var e=this;this._addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){e.elementPos=t(e.element[0]).offset(),e.selectees=t(e.options.filter,e.element[0]),e._addClass(e.selectees,"ui-selectee"),e.selectees.each(function(){var i=t(this),s=i.offset(),n={left:s.left-e.elementPos.left,top:s.top-e.elementPos.top};t.data(this,"selectable-item",{element:this,$element:i,left:n.left,top:n.top,right:n.left+i.outerWidth(),bottom:n.top+i.outerHeight(),startselected:!1,selected:i.hasClass("ui-selected"),selecting:i.hasClass("ui-selecting"),unselecting:i.hasClass("ui-unselecting")})})},this.refresh(),this._mouseInit(),this.helper=t("
    "),this._addClass(this.helper,"ui-selectable-helper")},_destroy:function(){this.selectees.removeData("selectable-item"),this._mouseDestroy()},_mouseStart:function(e){var i=this,s=this.options;this.opos=[e.pageX,e.pageY],this.elementPos=t(this.element[0]).offset(),this.options.disabled||(this.selectees=t(s.filter,this.element[0]),this._trigger("start",e),t(s.appendTo).append(this.helper),this.helper.css({left:e.pageX,top:e.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=t.data(this,"selectable-item");s.startselected=!0,e.metaKey||e.ctrlKey||(i._removeClass(s.$element,"ui-selected"),s.selected=!1,i._addClass(s.$element,"ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",e,{unselecting:s.element}))}),t(e.target).parents().addBack().each(function(){var s,n=t.data(this,"selectable-item");return n?(s=!e.metaKey&&!e.ctrlKey||!n.$element.hasClass("ui-selected"),i._removeClass(n.$element,s?"ui-unselecting":"ui-selected")._addClass(n.$element,s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",e,{selecting:n.element}):i._trigger("unselecting",e,{unselecting:n.element}),!1):void 0}))},_mouseDrag:function(e){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,o=this.opos[0],a=this.opos[1],r=e.pageX,l=e.pageY;return o>r&&(i=r,r=o,o=i),a>l&&(i=l,l=a,a=i),this.helper.css({left:o,top:a,width:r-o,height:l-a}),this.selectees.each(function(){var i=t.data(this,"selectable-item"),h=!1,c={};i&&i.element!==s.element[0]&&(c.left=i.left+s.elementPos.left,c.right=i.right+s.elementPos.left,c.top=i.top+s.elementPos.top,c.bottom=i.bottom+s.elementPos.top,"touch"===n.tolerance?h=!(c.left>r||o>c.right||c.top>l||a>c.bottom):"fit"===n.tolerance&&(h=c.left>o&&r>c.right&&c.top>a&&l>c.bottom),h?(i.selected&&(s._removeClass(i.$element,"ui-selected"),i.selected=!1),i.unselecting&&(s._removeClass(i.$element,"ui-unselecting"),i.unselecting=!1),i.selecting||(s._addClass(i.$element,"ui-selecting"),i.selecting=!0,s._trigger("selecting",e,{selecting:i.element}))):(i.selecting&&((e.metaKey||e.ctrlKey)&&i.startselected?(s._removeClass(i.$element,"ui-selecting"),i.selecting=!1,s._addClass(i.$element,"ui-selected"),i.selected=!0):(s._removeClass(i.$element,"ui-selecting"),i.selecting=!1,i.startselected&&(s._addClass(i.$element,"ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",e,{unselecting:i.element}))),i.selected&&(e.metaKey||e.ctrlKey||i.startselected||(s._removeClass(i.$element,"ui-selected"),i.selected=!1,s._addClass(i.$element,"ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",e,{unselecting:i.element})))))}),!1}},_mouseStop:function(e){var i=this;return this.dragged=!1,t(".ui-unselecting",this.element[0]).each(function(){var s=t.data(this,"selectable-item");i._removeClass(s.$element,"ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",e,{unselected:s.element})}),t(".ui-selecting",this.element[0]).each(function(){var s=t.data(this,"selectable-item");i._removeClass(s.$element,"ui-selecting")._addClass(s.$element,"ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",e,{selected:s.element})}),this._trigger("stop",e),this.helper.remove(),!1}}),t.widget("ui.sortable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(t,e,i){return t>=e&&e+i>t},_isFloating:function(t){return/left|right/.test(t.css("float"))||/inline|table-cell/.test(t.css("display"))},_create:function(){this.containerCache={},this._addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(t,e){this._super(t,e),"handle"===t&&this._setHandleClassName()},_setHandleClassName:function(){var e=this;this._removeClass(this.element.find(".ui-sortable-handle"),"ui-sortable-handle"),t.each(this.items,function(){e._addClass(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item,"ui-sortable-handle")})},_destroy:function(){this._mouseDestroy();for(var t=this.items.length-1;t>=0;t--)this.items[t].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(e,i){var s=null,n=!1,o=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(e),t(e.target).parents().each(function(){return t.data(this,o.widgetName+"-item")===o?(s=t(this),!1):void 0}),t.data(e.target,o.widgetName+"-item")===o&&(s=t(e.target)),s?!this.options.handle||i||(t(this.options.handle,s).find("*").addBack().each(function(){this===e.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(e,i,s){var n,o,a=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(e),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,a.cursorAt&&this._adjustOffsetFromHelper(a.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),a.containment&&this._setContainment(),a.cursor&&"auto"!==a.cursor&&(o=this.document.find("body"),this.storedCursor=o.css("cursor"),o.css("cursor",a.cursor),this.storedStylesheet=t("").appendTo(o)),a.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",a.opacity)),a.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",a.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",e,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",e,this._uiHash(this));return t.ui.ddmanager&&(t.ui.ddmanager.current=this),t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this.dragging=!0,this._addClass(this.helper,"ui-sortable-helper"),this._mouseDrag(e),!0},_mouseDrag:function(e){var i,s,n,o,a=this.options,r=!1;for(this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-e.pageY=0;i--)if(s=this.items[i],n=s.item[0],o=this._intersectsWithPointer(s),o&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===o?"next":"prev"]()[0]!==n&&!t.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!t.contains(this.element[0],n):!0)){if(this.direction=1===o?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(e,s),this._trigger("change",e,this._uiHash());break}return this._contactContainers(e),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),this._trigger("sort",e,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(e,i){if(e){if(t.ui.ddmanager&&!this.options.dropBehaviour&&t.ui.ddmanager.drop(this,e),this.options.revert){var s=this,n=this.placeholder.offset(),o=this.options.axis,a={};o&&"x"!==o||(a.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),o&&"y"!==o||(a.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,t(this.helper).animate(a,parseInt(this.options.revert,10)||500,function(){s._clear(e)})}else this._clear(e,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp(new t.Event("mouseup",{target:null})),"original"===this.options.helper?(this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")):this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--)this.containers[e]._trigger("deactivate",null,this._uiHash(this)),this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",null,this._uiHash(this)),this.containers[e].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),t.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?t(this.domPosition.prev).after(this.currentItem):t(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},t(i).each(function(){var i=(t(e.item||this).attr(e.attribute||"id")||"").match(e.expression||/(.+)[\-=_](.+)/);i&&s.push((e.key||i[1]+"[]")+"="+(e.key&&e.expression?i[1]:i[2]))}),!s.length&&e.key&&s.push(e.key+"="),s.join("&")},toArray:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},i.each(function(){s.push(t(e.item||this).attr(e.attribute||"id")||"")}),s},_intersectsWith:function(t){var e=this.positionAbs.left,i=e+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,o=t.left,a=o+t.width,r=t.top,l=r+t.height,h=this.offset.click.top,c=this.offset.click.left,u="x"===this.options.axis||s+h>r&&l>s+h,d="y"===this.options.axis||e+c>o&&a>e+c,p=u&&d;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>t[this.floating?"width":"height"]?p:e+this.helperProportions.width/2>o&&a>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&l>n-this.helperProportions.height/2},_intersectsWithPointer:function(t){var e,i,s="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top,t.height),n="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left,t.width),o=s&&n;return o?(e=this._getDragVerticalDirection(),i=this._getDragHorizontalDirection(),this.floating?"right"===i||"down"===e?2:1:e&&("down"===e?2:1)):!1},_intersectsWithSides:function(t){var e=this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&e||"up"===s&&!e)},_getDragVerticalDirection:function(){var t=this.positionAbs.top-this.lastPositionAbs.top;return 0!==t&&(t>0?"down":"up")},_getDragHorizontalDirection:function(){var t=this.positionAbs.left-this.lastPositionAbs.left;return 0!==t&&(t>0?"right":"left")},refresh:function(t){return this._refreshItems(t),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var t=this.options;return t.connectWith.constructor===String?[t.connectWith]:t.connectWith},_getItemsAsjQuery:function(e){function i(){r.push(this)}var s,n,o,a,r=[],l=[],h=this._connectWith();if(h&&e)for(s=h.length-1;s>=0;s--)for(o=t(h[s],this.document[0]),n=o.length-1;n>=0;n--)a=t.data(o[n],this.widgetFullName),a&&a!==this&&!a.options.disabled&&l.push([t.isFunction(a.options.items)?a.options.items.call(a.element):t(a.options.items,a.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),a]);for(l.push([t.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):t(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=l.length-1;s>=0;s--)l[s][0].each(i);return t(r)},_removeCurrentsFromItems:function(){var e=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=t.grep(this.items,function(t){for(var i=0;e.length>i;i++)if(e[i]===t.item[0])return!1;return!0})},_refreshItems:function(e){this.items=[],this.containers=[this];var i,s,n,o,a,r,l,h,c=this.items,u=[[t.isFunction(this.options.items)?this.options.items.call(this.element[0],e,{item:this.currentItem}):t(this.options.items,this.element),this]],d=this._connectWith();if(d&&this.ready)for(i=d.length-1;i>=0;i--)for(n=t(d[i],this.document[0]),s=n.length-1;s>=0;s--)o=t.data(n[s],this.widgetFullName),o&&o!==this&&!o.options.disabled&&(u.push([t.isFunction(o.options.items)?o.options.items.call(o.element[0],e,{item:this.currentItem}):t(o.options.items,o.element),o]),this.containers.push(o));for(i=u.length-1;i>=0;i--)for(a=u[i][1],r=u[i][0],s=0,h=r.length;h>s;s++)l=t(r[s]),l.data(this.widgetName+"-item",a),c.push({item:l,instance:a,width:0,height:0,left:0,top:0})},refreshPositions:function(e){this.floating=this.items.length?"x"===this.options.axis||this._isFloating(this.items[0].item):!1,this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,o;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?t(this.options.toleranceElement,s.item):s.item,e||(s.width=n.outerWidth(),s.height=n.outerHeight()),o=n.offset(),s.left=o.left,s.top=o.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)o=this.containers[i].element.offset(),this.containers[i].containerCache.left=o.left,this.containers[i].containerCache.top=o.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(e){e=e||this;var i,s=e.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=e.currentItem[0].nodeName.toLowerCase(),n=t("<"+s+">",e.document[0]);return e._addClass(n,"ui-sortable-placeholder",i||e.currentItem[0].className)._removeClass(n,"ui-sortable-helper"),"tbody"===s?e._createTrPlaceholder(e.currentItem.find("tr").eq(0),t("",e.document[0]).appendTo(n)):"tr"===s?e._createTrPlaceholder(e.currentItem,n):"img"===s&&n.attr("src",e.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(t,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10)))}}),e.placeholder=t(s.placeholder.element.call(e.element,e.currentItem)),e.currentItem.after(e.placeholder),s.placeholder.update(e,e.placeholder)},_createTrPlaceholder:function(e,i){var s=this;e.children().each(function(){t(" ",s.document[0]).attr("colspan",t(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(e){var i,s,n,o,a,r,l,h,c,u,d=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!t.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(d&&t.contains(this.containers[i].element[0],d.element[0]))continue;d=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",e,this._uiHash(this)),this.containers[i].containerCache.over=0);if(d)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,o=null,c=d.floating||this._isFloating(this.currentItem),a=c?"left":"top",r=c?"width":"height",u=c?"pageX":"pageY",s=this.items.length-1;s>=0;s--)t.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(l=this.items[s].item.offset()[a],h=!1,e[u]-l>this.items[s][r]/2&&(h=!0),n>Math.abs(e[u]-l)&&(n=Math.abs(e[u]-l),o=this.items[s],this.direction=h?"up":"down"));if(!o&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return this.currentContainer.containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash()),this.currentContainer.containerCache.over=1),void 0;o?this._rearrange(e,o,null,!0):this._rearrange(e,null,this.containers[p].element,!0),this._trigger("change",e,this._uiHash()),this.containers[p]._trigger("change",e,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||t("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.currentItem.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===n.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===n.containment?this.document.height()||document.body.parentNode.scrollHeight:this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(e=t(n.containment)[0],i=t(n.containment).offset(),s="hidden"!==t(e).css("overflow"),this.containment=[i.left+(parseInt(t(e).css("borderLeftWidth"),10)||0)+(parseInt(t(e).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(t(e).css("borderTopWidth"),10)||0)+(parseInt(t(e).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(t(e).css("borderLeftWidth"),10)||0)-(parseInt(t(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(t(e).css("borderTopWidth"),10)||0)-(parseInt(t(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():o?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():o?0:n.scrollLeft())*s}},_generatePosition:function(e){var i,s,n=this.options,o=e.pageX,a=e.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,l=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(e.pageX-this.offset.click.leftthis.containment[2]&&(o=this.containment[2]+this.offset.click.left),e.pageY-this.offset.click.top>this.containment[3]&&(a=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((a-this.originalPageY)/n.grid[1])*n.grid[1],a=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((o-this.originalPageX)/n.grid[0])*n.grid[0],o=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:a-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():l?0:r.scrollTop()),left:o-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():l?0:r.scrollLeft())}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(t,e){function i(t,e,i){return function(s){i._trigger(t,s,e._uiHash(e))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!e&&n.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||n.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(n.push(function(t){this._trigger("remove",t,this._uiHash())}),n.push(function(t){return function(e){t._trigger("receive",e,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(t){return function(e){t._trigger("update",e,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)e||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!e){for(s=0;n.length>s;s++)n[s].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){t.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(e){var i=e||this;return{helper:i.helper,placeholder:i.placeholder||t([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:e?e.element:null}}}),t.widget("ui.accordion",{version:"1.12.1",options:{active:0,animate:{},classes:{"ui-accordion-header":"ui-corner-top","ui-accordion-header-collapsed":"ui-corner-all","ui-accordion-content":"ui-corner-bottom"},collapsible:!1,event:"click",header:"> li > :first-child, > :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var e=this.options;this.prevShow=this.prevHide=t(),this._addClass("ui-accordion","ui-widget ui-helper-reset"),this.element.attr("role","tablist"),e.collapsible||e.active!==!1&&null!=e.active||(e.active=0),this._processPanels(),0>e.active&&(e.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():t()}},_createIcons:function(){var e,i,s=this.options.icons;s&&(e=t(""),this._addClass(e,"ui-accordion-header-icon","ui-icon "+s.header),e.prependTo(this.headers),i=this.active.children(".ui-accordion-header-icon"),this._removeClass(i,s.header)._addClass(i,null,s.activeHeader)._addClass(this.headers,"ui-accordion-icons"))},_destroyIcons:function(){this._removeClass(this.headers,"ui-accordion-icons"),this.headers.children(".ui-accordion-header-icon").remove()},_destroy:function(){var t;this.element.removeAttr("role"),this.headers.removeAttr("role aria-expanded aria-selected aria-controls tabIndex").removeUniqueId(),this._destroyIcons(),t=this.headers.next().css("display","").removeAttr("role aria-hidden aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&t.css("height","")},_setOption:function(t,e){return"active"===t?(this._activate(e),void 0):("event"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),"collapsible"!==t||e||this.options.active!==!1||this._activate(0),"icons"===t&&(this._destroyIcons(),e&&this._createIcons()),void 0)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t),this._toggleClass(this.headers.add(this.headers.next()),null,"ui-state-disabled",!!t)},_keydown:function(e){if(!e.altKey&&!e.ctrlKey){var i=t.ui.keyCode,s=this.headers.length,n=this.headers.index(e.target),o=!1;switch(e.keyCode){case i.RIGHT:case i.DOWN:o=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:o=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(e);break;case i.HOME:o=this.headers[0];break;case i.END:o=this.headers[s-1]}o&&(t(e.target).attr("tabIndex",-1),t(o).attr("tabIndex",0),t(o).trigger("focus"),e.preventDefault())}},_panelKeyDown:function(e){e.keyCode===t.ui.keyCode.UP&&e.ctrlKey&&t(e.currentTarget).prev().trigger("focus")},refresh:function(){var e=this.options;this._processPanels(),e.active===!1&&e.collapsible===!0||!this.headers.length?(e.active=!1,this.active=t()):e.active===!1?this._activate(0):this.active.length&&!t.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(e.active=!1,this.active=t()):this._activate(Math.max(0,e.active-1)):e.active=this.headers.index(this.active),this._destroyIcons(),this._refresh() +},_processPanels:function(){var t=this.headers,e=this.panels;this.headers=this.element.find(this.options.header),this._addClass(this.headers,"ui-accordion-header ui-accordion-header-collapsed","ui-state-default"),this.panels=this.headers.next().filter(":not(.ui-accordion-content-active)").hide(),this._addClass(this.panels,"ui-accordion-content","ui-helper-reset ui-widget-content"),e&&(this._off(t.not(this.headers)),this._off(e.not(this.panels)))},_refresh:function(){var e,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active),this._addClass(this.active,"ui-accordion-header-active","ui-state-active")._removeClass(this.active,"ui-accordion-header-collapsed"),this._addClass(this.active.next(),"ui-accordion-content-active"),this.active.next().show(),this.headers.attr("role","tab").each(function(){var e=t(this),i=e.uniqueId().attr("id"),s=e.next(),n=s.uniqueId().attr("id");e.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(e=n.height(),this.element.siblings(":visible").each(function(){var i=t(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(e-=i.outerHeight(!0))}),this.headers.each(function(){e-=t(this).outerHeight(!0)}),this.headers.next().each(function(){t(this).height(Math.max(0,e-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===s&&(e=0,this.headers.next().each(function(){var i=t(this).is(":visible");i||t(this).show(),e=Math.max(e,t(this).css("height","").height()),i||t(this).hide()}).height(e))},_activate:function(e){var i=this._findActive(e)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return"number"==typeof e?this.headers.eq(e):t()},_setupEvents:function(e){var i={keydown:"_keydown"};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(e){var i,s,n=this.options,o=this.active,a=t(e.currentTarget),r=a[0]===o[0],l=r&&n.collapsible,h=l?t():a.next(),c=o.next(),u={oldHeader:o,oldPanel:c,newHeader:l?t():a,newPanel:h};e.preventDefault(),r&&!n.collapsible||this._trigger("beforeActivate",e,u)===!1||(n.active=l?!1:this.headers.index(a),this.active=r?t():a,this._toggle(u),this._removeClass(o,"ui-accordion-header-active","ui-state-active"),n.icons&&(i=o.children(".ui-accordion-header-icon"),this._removeClass(i,null,n.icons.activeHeader)._addClass(i,null,n.icons.header)),r||(this._removeClass(a,"ui-accordion-header-collapsed")._addClass(a,"ui-accordion-header-active","ui-state-active"),n.icons&&(s=a.children(".ui-accordion-header-icon"),this._removeClass(s,null,n.icons.header)._addClass(s,null,n.icons.activeHeader)),this._addClass(a.next(),"ui-accordion-content-active")))},_toggle:function(e){var i=e.newPanel,s=this.prevShow.length?this.prevShow:e.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,e):(s.hide(),i.show(),this._toggleComplete(e)),s.attr({"aria-hidden":"true"}),s.prev().attr({"aria-selected":"false","aria-expanded":"false"}),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===parseInt(t(this).attr("tabIndex"),10)}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(t,e,i){var s,n,o,a=this,r=0,l=t.css("box-sizing"),h=t.length&&(!e.length||t.index()",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault()},"click .ui-menu-item":function(e){var i=t(e.target),s=t(t.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(e),e.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(e):!this.element.is(":focus")&&s.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(e){if(!this.previousFilter){var i=t(e.target).closest(".ui-menu-item"),s=t(e.currentTarget);i[0]===s[0]&&(this._removeClass(s.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(e,s))}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.find(this.options.items).eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){var i=!t.contains(this.element[0],t.ui.safeActiveElement(this.document[0]));i&&this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t),this.mouseHandled=!1}})},_destroy:function(){var e=this.element.find(".ui-menu-item").removeAttr("role aria-disabled"),i=e.children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),i.children().each(function(){var e=t(this);e.data("ui-menu-submenu-caret")&&e.remove()})},_keydown:function(e){var i,s,n,o,a=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:a=!1,s=this.previousFilter||"",o=!1,n=e.keyCode>=96&&105>=e.keyCode?""+(e.keyCode-96):String.fromCharCode(e.keyCode),clearTimeout(this.filterTimer),n===s?o=!0:n=s+n,i=this._filterMenuItems(n),i=o&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(e.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(e,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}a&&e.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var e,i,s,n,o,a=this,r=this.options.icons.submenu,l=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),s=l.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),i=e.prev(),s=t("").data("ui-menu-submenu-caret",!0);a._addClass(s,"ui-menu-icon","ui-icon "+r),i.attr("aria-haspopup","true").prepend(s),e.attr("aria-labelledby",i.attr("id"))}),this._addClass(s,"ui-menu","ui-widget ui-widget-content ui-front"),e=l.add(this.element),i=e.find(this.options.items),i.not(".ui-menu-item").each(function(){var e=t(this);a._isDivider(e)&&a._addClass(e,"ui-menu-divider","ui-widget-content")}),n=i.not(".ui-menu-item, .ui-menu-divider"),o=n.children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(n,"ui-menu-item")._addClass(o,"ui-menu-item-wrapper"),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){if("icons"===t){var i=this.element.find(".ui-menu-icon");this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)}this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t+""),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i,s,n;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),s=this.active.children(".ui-menu-item-wrapper"),this._addClass(s,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),n=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(n,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=e.children(".ui-menu"),i.length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var i,s,n,o,a,r;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,n=e.offset().top-this.activeMenu.offset().top-i-s,o=this.activeMenu.scrollTop(),a=this.activeMenu.height(),r=e.outerHeight(),0>n?this.activeMenu.scrollTop(o+n):n+r>a&&this.activeMenu.scrollTop(o+n-a+r))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this._removeClass(this.active.children(".ui-menu-item-wrapper"),null,"ui-state-active"),this._trigger("blur",t,{item:this.active}),this.active=null)},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(e){var i=t.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true"),e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:t(e&&e.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(e),this._removeClass(s.find(".ui-state-active"),null,"ui-state-active"),this.activeMenu=s},this.delay)},_close:function(t){t||(t=this.active?this.active.parent():this.element),t.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false")},_closeOnDocumentClick:function(e){return!t(e.target).closest(".ui-menu").length},_isDivider:function(t){return!/[^\-\u2014\u2013\s]/.test(t.text())},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(t,e,i){var s;this.active&&(s="first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[t+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[e]()),this.focus(i,s)},nextPage:function(e){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=t(this),0>i.offset().top-s-n}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(e),void 0)},previousPage:function(e){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=t(this),i.offset().top-s+n>0}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items).first())),void 0):(this.next(e),void 0)},_hasScroll:function(){return this.element.outerHeight()",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var e,i,s,n=this.element[0].nodeName.toLowerCase(),o="textarea"===n,a="input"===n;this.isMultiLine=o||!a&&this._isContentEditable(this.element),this.valueMethod=this.element[o||a?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return e=!0,s=!0,i=!0,void 0;e=!1,s=!1,i=!1;var o=t.ui.keyCode;switch(n.keyCode){case o.PAGE_UP:e=!0,this._move("previousPage",n);break;case o.PAGE_DOWN:e=!0,this._move("nextPage",n);break;case o.UP:e=!0,this._keyEvent("previous",n);break;case o.DOWN:e=!0,this._keyEvent("next",n);break;case o.ENTER:this.menu.active&&(e=!0,n.preventDefault(),this.menu.select(n));break;case o.TAB:this.menu.active&&this.menu.select(n);break;case o.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(e)return e=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=t.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(t){return s?(s=!1,t.preventDefault(),void 0):(this._searchTimeout(t),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(t),this._change(t),void 0)}}),this._initSource(),this.menu=t("
      ").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._addClass(this.menu.element,"ui-autocomplete","ui-front"),this._on(this.menu.element,{mousedown:function(e){e.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,this.element[0]!==t.ui.safeActiveElement(this.document[0])&&this.element.trigger("focus")})},menufocus:function(e,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,e.originalEvent&&/^mouse/.test(e.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){t(e.target).trigger(e.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",e,{item:n})&&e.originalEvent&&/^key/.test(e.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&t.trim(s).length&&(this.liveRegion.children().hide(),t("
      ").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,i){var s=i.item.data("ui-autocomplete-item"),n=this.previous;this.element[0]!==t.ui.safeActiveElement(this.document[0])&&(this.element.trigger("focus"),this.previous=n,this._delay(function(){this.previous=n,this.selectedItem=s})),!1!==this._trigger("select",e,{item:s})&&this._value(s.value),this.term=this._value(),this.close(e),this.selectedItem=s}}),this.liveRegion=t("
      ",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(t,e){this._super(t,e),"source"===t&&this._initSource(),"appendTo"===t&&this.menu.element.appendTo(this._appendTo()),"disabled"===t&&e&&this.xhr&&this.xhr.abort()},_isEventTargetInWidget:function(e){var i=this.menu.element[0];return e.target===this.element[0]||e.target===i||t.contains(i,e.target)},_closeOnClickOutside:function(t){this._isEventTargetInWidget(t)||this.close()},_appendTo:function(){var e=this.options.appendTo;return e&&(e=e.jquery||e.nodeType?t(e):this.document.find(e).eq(0)),e&&e[0]||(e=this.element.closest(".ui-front, dialog")),e.length||(e=this.document[0].body),e},_initSource:function(){var e,i,s=this;t.isArray(this.options.source)?(e=this.options.source,this.source=function(i,s){s(t.ui.autocomplete.filter(e,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(e,n){s.xhr&&s.xhr.abort(),s.xhr=t.ajax({url:i,data:e,dataType:"json",success:function(t){n(t)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(t){clearTimeout(this.searching),this.searching=this._delay(function(){var e=this.term===this._value(),i=this.menu.element.is(":visible"),s=t.altKey||t.ctrlKey||t.metaKey||t.shiftKey;(!e||e&&!i&&!s)&&(this.selectedItem=null,this.search(null,t))},this.options.delay)},search:function(t,e){return t=null!=t?t:this._value(),this.term=this._value(),t.length").append(t("
      ").text(i.label)).appendTo(e)},_move:function(t,e){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[t](e),void 0):(this.search(null,e),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(t,e),e.preventDefault())},_isContentEditable:function(t){if(!t.length)return!1;var e=t.prop("contentEditable");return"inherit"===e?this._isContentEditable(t.parent()):"true"===e}}),t.extend(t.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(e,i){var s=RegExp(t.ui.autocomplete.escapeRegex(i),"i");return t.grep(e,function(t){return s.test(t.label||t.value||t)})}}),t.widget("ui.autocomplete",t.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(t>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(e){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=e&&e.length?this.options.messages.results(e.length):this.options.messages.noResults,this.liveRegion.children().hide(),t("
      ").text(i).appendTo(this.liveRegion))}}),t.ui.autocomplete;var r=/ui-corner-([a-z]){2,6}/g;t.widget("ui.controlgroup",{version:"1.12.1",defaultElement:"
      ",options:{direction:"horizontal",disabled:null,onlyVisible:!0,items:{button:"input[type=button], input[type=submit], input[type=reset], button, a",controlgroupLabel:".ui-controlgroup-label",checkboxradio:"input[type='checkbox'], input[type='radio']",selectmenu:"select",spinner:".ui-spinner-input"}},_create:function(){this._enhance()},_enhance:function(){this.element.attr("role","toolbar"),this.refresh()},_destroy:function(){this._callChildMethod("destroy"),this.childWidgets.removeData("ui-controlgroup-data"),this.element.removeAttr("role"),this.options.items.controlgroupLabel&&this.element.find(this.options.items.controlgroupLabel).find(".ui-controlgroup-label-contents").contents().unwrap()},_initWidgets:function(){var e=this,i=[];t.each(this.options.items,function(s,n){var o,a={};return n?"controlgroupLabel"===s?(o=e.element.find(n),o.each(function(){var e=t(this);e.children(".ui-controlgroup-label-contents").length||e.contents().wrapAll("")}),e._addClass(o,null,"ui-widget ui-widget-content ui-state-default"),i=i.concat(o.get()),void 0):(t.fn[s]&&(a=e["_"+s+"Options"]?e["_"+s+"Options"]("middle"):{classes:{}},e.element.find(n).each(function(){var n=t(this),o=n[s]("instance"),r=t.widget.extend({},a);if("button"!==s||!n.parent(".ui-spinner").length){o||(o=n[s]()[s]("instance")),o&&(r.classes=e._resolveClassesValues(r.classes,o)),n[s](r);var l=n[s]("widget");t.data(l[0],"ui-controlgroup-data",o?o:n[s]("instance")),i.push(l[0])}})),void 0):void 0}),this.childWidgets=t(t.unique(i)),this._addClass(this.childWidgets,"ui-controlgroup-item")},_callChildMethod:function(e){this.childWidgets.each(function(){var i=t(this),s=i.data("ui-controlgroup-data");s&&s[e]&&s[e]()})},_updateCornerClass:function(t,e){var i="ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all",s=this._buildSimpleOptions(e,"label").classes.label;this._removeClass(t,null,i),this._addClass(t,null,s)},_buildSimpleOptions:function(t,e){var i="vertical"===this.options.direction,s={classes:{}};return s.classes[e]={middle:"",first:"ui-corner-"+(i?"top":"left"),last:"ui-corner-"+(i?"bottom":"right"),only:"ui-corner-all"}[t],s},_spinnerOptions:function(t){var e=this._buildSimpleOptions(t,"ui-spinner");return e.classes["ui-spinner-up"]="",e.classes["ui-spinner-down"]="",e},_buttonOptions:function(t){return this._buildSimpleOptions(t,"ui-button")},_checkboxradioOptions:function(t){return this._buildSimpleOptions(t,"ui-checkboxradio-label")},_selectmenuOptions:function(t){var e="vertical"===this.options.direction;return{width:e?"auto":!1,classes:{middle:{"ui-selectmenu-button-open":"","ui-selectmenu-button-closed":""},first:{"ui-selectmenu-button-open":"ui-corner-"+(e?"top":"tl"),"ui-selectmenu-button-closed":"ui-corner-"+(e?"top":"left")},last:{"ui-selectmenu-button-open":e?"":"ui-corner-tr","ui-selectmenu-button-closed":"ui-corner-"+(e?"bottom":"right")},only:{"ui-selectmenu-button-open":"ui-corner-top","ui-selectmenu-button-closed":"ui-corner-all"}}[t]}},_resolveClassesValues:function(e,i){var s={};return t.each(e,function(n){var o=i.options.classes[n]||"";o=t.trim(o.replace(r,"")),s[n]=(o+" "+e[n]).replace(/\s+/g," ")}),s},_setOption:function(t,e){return"direction"===t&&this._removeClass("ui-controlgroup-"+this.options.direction),this._super(t,e),"disabled"===t?(this._callChildMethod(e?"disable":"enable"),void 0):(this.refresh(),void 0)},refresh:function(){var e,i=this;this._addClass("ui-controlgroup ui-controlgroup-"+this.options.direction),"horizontal"===this.options.direction&&this._addClass(null,"ui-helper-clearfix"),this._initWidgets(),e=this.childWidgets,this.options.onlyVisible&&(e=e.filter(":visible")),e.length&&(t.each(["first","last"],function(t,s){var n=e[s]().data("ui-controlgroup-data");if(n&&i["_"+n.widgetName+"Options"]){var o=i["_"+n.widgetName+"Options"](1===e.length?"only":s);o.classes=i._resolveClassesValues(o.classes,n),n.element[n.widgetName](o)}else i._updateCornerClass(e[s](),s)}),this._callChildMethod("refresh"))}}),t.widget("ui.checkboxradio",[t.ui.formResetMixin,{version:"1.12.1",options:{disabled:null,label:null,icon:!0,classes:{"ui-checkboxradio-label":"ui-corner-all","ui-checkboxradio-icon":"ui-corner-all"}},_getCreateOptions:function(){var e,i,s=this,n=this._super()||{};return this._readType(),i=this.element.labels(),this.label=t(i[i.length-1]),this.label.length||t.error("No label found for checkboxradio widget"),this.originalLabel="",this.label.contents().not(this.element[0]).each(function(){s.originalLabel+=3===this.nodeType?t(this).text():this.outerHTML}),this.originalLabel&&(n.label=this.originalLabel),e=this.element[0].disabled,null!=e&&(n.disabled=e),n},_create:function(){var t=this.element[0].checked;this._bindFormResetHandler(),null==this.options.disabled&&(this.options.disabled=this.element[0].disabled),this._setOption("disabled",this.options.disabled),this._addClass("ui-checkboxradio","ui-helper-hidden-accessible"),this._addClass(this.label,"ui-checkboxradio-label","ui-button ui-widget"),"radio"===this.type&&this._addClass(this.label,"ui-checkboxradio-radio-label"),this.options.label&&this.options.label!==this.originalLabel?this._updateLabel():this.originalLabel&&(this.options.label=this.originalLabel),this._enhance(),t&&(this._addClass(this.label,"ui-checkboxradio-checked","ui-state-active"),this.icon&&this._addClass(this.icon,null,"ui-state-hover")),this._on({change:"_toggleClasses",focus:function(){this._addClass(this.label,null,"ui-state-focus ui-visual-focus")},blur:function(){this._removeClass(this.label,null,"ui-state-focus ui-visual-focus")}})},_readType:function(){var e=this.element[0].nodeName.toLowerCase();this.type=this.element[0].type,"input"===e&&/radio|checkbox/.test(this.type)||t.error("Can't create checkboxradio on element.nodeName="+e+" and element.type="+this.type)},_enhance:function(){this._updateIcon(this.element[0].checked)},widget:function(){return this.label},_getRadioGroup:function(){var e,i=this.element[0].name,s="input[name='"+t.ui.escapeSelector(i)+"']";return i?(e=this.form.length?t(this.form[0].elements).filter(s):t(s).filter(function(){return 0===t(this).form().length}),e.not(this.element)):t([])},_toggleClasses:function(){var e=this.element[0].checked;this._toggleClass(this.label,"ui-checkboxradio-checked","ui-state-active",e),this.options.icon&&"checkbox"===this.type&&this._toggleClass(this.icon,null,"ui-icon-check ui-state-checked",e)._toggleClass(this.icon,null,"ui-icon-blank",!e),"radio"===this.type&&this._getRadioGroup().each(function(){var e=t(this).checkboxradio("instance");e&&e._removeClass(e.label,"ui-checkboxradio-checked","ui-state-active")})},_destroy:function(){this._unbindFormResetHandler(),this.icon&&(this.icon.remove(),this.iconSpace.remove())},_setOption:function(t,e){return"label"!==t||e?(this._super(t,e),"disabled"===t?(this._toggleClass(this.label,null,"ui-state-disabled",e),this.element[0].disabled=e,void 0):(this.refresh(),void 0)):void 0},_updateIcon:function(e){var i="ui-icon ui-icon-background ";this.options.icon?(this.icon||(this.icon=t(""),this.iconSpace=t(" "),this._addClass(this.iconSpace,"ui-checkboxradio-icon-space")),"checkbox"===this.type?(i+=e?"ui-icon-check ui-state-checked":"ui-icon-blank",this._removeClass(this.icon,null,e?"ui-icon-blank":"ui-icon-check")):i+="ui-icon-blank",this._addClass(this.icon,"ui-checkboxradio-icon",i),e||this._removeClass(this.icon,null,"ui-icon-check ui-state-checked"),this.icon.prependTo(this.label).after(this.iconSpace)):void 0!==this.icon&&(this.icon.remove(),this.iconSpace.remove(),delete this.icon)},_updateLabel:function(){var t=this.label.contents().not(this.element[0]);this.icon&&(t=t.not(this.icon[0])),this.iconSpace&&(t=t.not(this.iconSpace[0])),t.remove(),this.label.append(this.options.label)},refresh:function(){var t=this.element[0].checked,e=this.element[0].disabled;this._updateIcon(t),this._toggleClass(this.label,"ui-checkboxradio-checked","ui-state-active",t),null!==this.options.label&&this._updateLabel(),e!==this.options.disabled&&this._setOptions({disabled:e})}}]),t.ui.checkboxradio,t.widget("ui.button",{version:"1.12.1",defaultElement:"").button({label:t("").text(this.options.closeText).html(),icon:"ui-icon-closethick",showLabel:!1}).appendTo(this.uiDialogTitlebar),this._addClass(this.uiDialogTitlebarClose,"ui-dialog-titlebar-close"),this._on(this.uiDialogTitlebarClose,{click:function(t){t.preventDefault(),this.close(t)}}),e=t("").uniqueId().prependTo(this.uiDialogTitlebar),this._addClass(e,"ui-dialog-title"),this._title(e),this.uiDialogTitlebar.prependTo(this.uiDialog),this.uiDialog.attr({"aria-labelledby":e.attr("id")})},_title:function(t){this.options.title?t.text(this.options.title):t.html(" ")},_createButtonPane:function(){this.uiDialogButtonPane=t("
      "),this._addClass(this.uiDialogButtonPane,"ui-dialog-buttonpane","ui-widget-content ui-helper-clearfix"),this.uiButtonSet=t("
      ").appendTo(this.uiDialogButtonPane),this._addClass(this.uiButtonSet,"ui-dialog-buttonset"),this._createButtons()},_createButtons:function(){var e=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),t.isEmptyObject(i)||t.isArray(i)&&!i.length?(this._removeClass(this.uiDialog,"ui-dialog-buttons"),void 0):(t.each(i,function(i,s){var n,o;s=t.isFunction(s)?{click:s,text:i}:s,s=t.extend({type:"button"},s),n=s.click,o={icon:s.icon,iconPosition:s.iconPosition,showLabel:s.showLabel,icons:s.icons,text:s.text},delete s.click,delete s.icon,delete s.iconPosition,delete s.showLabel,delete s.icons,"boolean"==typeof s.text&&delete s.text,t("",s).button(o).appendTo(e.uiButtonSet).on("click",function(){n.apply(e.element[0],arguments)})}),this._addClass(this.uiDialog,"ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),void 0)},_makeDraggable:function(){function e(t){return{position:t.position,offset:t.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){i._addClass(t(this),"ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,e(n))},drag:function(t,s){i._trigger("drag",t,e(s))},stop:function(n,o){var a=o.offset.left-i.document.scrollLeft(),r=o.offset.top-i.document.scrollTop();s.position={my:"left top",at:"left"+(a>=0?"+":"")+a+" "+"top"+(r>=0?"+":"")+r,of:i.window},i._removeClass(t(this),"ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,e(o))}})},_makeResizable:function(){function e(t){return{originalPosition:t.originalPosition,originalSize:t.originalSize,position:t.position,size:t.size}}var i=this,s=this.options,n=s.resizable,o=this.uiDialog.css("position"),a="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:a,start:function(s,n){i._addClass(t(this),"ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,e(n))},resize:function(t,s){i._trigger("resize",t,e(s))},stop:function(n,o){var a=i.uiDialog.offset(),r=a.left-i.document.scrollLeft(),l=a.top-i.document.scrollTop();s.height=i.uiDialog.height(),s.width=i.uiDialog.width(),s.position={my:"left top",at:"left"+(r>=0?"+":"")+r+" "+"top"+(l>=0?"+":"")+l,of:i.window},i._removeClass(t(this),"ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,e(o))}}).css("position",o)},_trackFocus:function(){this._on(this.widget(),{focusin:function(e){this._makeFocusTarget(),this._focusedElement=t(e.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var e=this._trackingInstances(),i=t.inArray(this,e);-1!==i&&e.splice(i,1)},_trackingInstances:function(){var t=this.document.data("ui-dialog-instances");return t||(t=[],this.document.data("ui-dialog-instances",t)),t},_minHeight:function(){var t=this.options;return"auto"===t.height?t.minHeight:Math.min(t.minHeight,t.height)},_position:function(){var t=this.uiDialog.is(":visible");t||this.uiDialog.show(),this.uiDialog.position(this.options.position),t||this.uiDialog.hide()},_setOptions:function(e){var i=this,s=!1,n={};t.each(e,function(t,e){i._setOption(t,e),t in i.sizeRelatedOptions&&(s=!0),t in i.resizableRelatedOptions&&(n[t]=e)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(e,i){var s,n,o=this.uiDialog;"disabled"!==e&&(this._super(e,i),"appendTo"===e&&this.uiDialog.appendTo(this._appendTo()),"buttons"===e&&this._createButtons(),"closeText"===e&&this.uiDialogTitlebarClose.button({label:t("").text(""+this.options.closeText).html()}),"draggable"===e&&(s=o.is(":data(ui-draggable)"),s&&!i&&o.draggable("destroy"),!s&&i&&this._makeDraggable()),"position"===e&&this._position(),"resizable"===e&&(n=o.is(":data(ui-resizable)"),n&&!i&&o.resizable("destroy"),n&&"string"==typeof i&&o.resizable("option","handles",i),n||i===!1||this._makeResizable()),"title"===e&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var t,e,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),t=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),e=Math.max(0,s.minHeight-t),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-t):"none","auto"===s.height?this.element.css({minHeight:e,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-t)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var e=t(this);return t("
      ").css({position:"absolute",width:e.outerWidth(),height:e.outerHeight()}).appendTo(e.parent()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(e){return t(e.target).closest(".ui-dialog").length?!0:!!t(e.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var e=!0;this._delay(function(){e=!1}),this.document.data("ui-dialog-overlays")||this._on(this.document,{focusin:function(t){e||this._allowInteraction(t)||(t.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=t("
      ").appendTo(this._appendTo()),this._addClass(this.overlay,null,"ui-widget-overlay ui-front"),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var t=this.document.data("ui-dialog-overlays")-1;t?this.document.data("ui-dialog-overlays",t):(this._off(this.document,"focusin"),this.document.removeData("ui-dialog-overlays")),this.overlay.remove(),this.overlay=null}}}),t.uiBackCompat!==!1&&t.widget("ui.dialog",t.ui.dialog,{options:{dialogClass:""},_createWrapper:function(){this._super(),this.uiDialog.addClass(this.options.dialogClass)},_setOption:function(t,e){"dialogClass"===t&&this.uiDialog.removeClass(this.options.dialogClass).addClass(e),this._superApply(arguments)}}),t.ui.dialog,t.widget("ui.progressbar",{version:"1.12.1",options:{classes:{"ui-progressbar":"ui-corner-all","ui-progressbar-value":"ui-corner-left","ui-progressbar-complete":"ui-corner-right"},max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.attr({role:"progressbar","aria-valuemin":this.min}),this._addClass("ui-progressbar","ui-widget ui-widget-content"),this.valueDiv=t("
      ").appendTo(this.element),this._addClass(this.valueDiv,"ui-progressbar-value","ui-widget-header"),this._refreshValue()},_destroy:function(){this.element.removeAttr("role aria-valuemin aria-valuemax aria-valuenow"),this.valueDiv.remove()},value:function(t){return void 0===t?this.options.value:(this.options.value=this._constrainedValue(t),this._refreshValue(),void 0)},_constrainedValue:function(t){return void 0===t&&(t=this.options.value),this.indeterminate=t===!1,"number"!=typeof t&&(t=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,t))},_setOptions:function(t){var e=t.value;delete t.value,this._super(t),this.options.value=this._constrainedValue(e),this._refreshValue()},_setOption:function(t,e){"max"===t&&(e=Math.max(this.min,e)),this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var e=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||e>this.min).width(i.toFixed(0)+"%"),this._toggleClass(this.valueDiv,"ui-progressbar-complete",null,e===this.options.max)._toggleClass("ui-progressbar-indeterminate",null,this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=t("
      ").appendTo(this.valueDiv),this._addClass(this.overlayDiv,"ui-progressbar-overlay"))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":e}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==e&&(this.oldValue=e,this._trigger("change")),e===this.options.max&&this._trigger("complete")}}),t.widget("ui.selectmenu",[t.ui.formResetMixin,{version:"1.12.1",defaultElement:"",widgetEventPrefix:"spin",options:{classes:{"ui-spinner":"ui-corner-all","ui-spinner-down":"ui-corner-br","ui-spinner-up":"ui-corner-tr"},culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var e=this._super(),i=this.element;return t.each(["min","max","step"],function(t,s){var n=i.attr(s);null!=n&&n.length&&(e[s]=n)}),e},_events:{keydown:function(t){this._start(t)&&this._keydown(t)&&t.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",t),void 0)},mousewheel:function(t,e){if(e){if(!this.spinning&&!this._start(t))return!1;this._spin((e>0?1:-1)*this.options.step,t),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(t)},100),t.preventDefault()}},"mousedown .ui-spinner-button":function(e){function i(){var e=this.element[0]===t.ui.safeActiveElement(this.document[0]);e||(this.element.trigger("focus"),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===t.ui.safeActiveElement(this.document[0])?this.previous:this.element.val(),e.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(e)!==!1&&this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(e){return t(e.currentTarget).hasClass("ui-state-active")?this._start(e)===!1?!1:(this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_enhance:function(){this.uiSpinner=this.element.attr("autocomplete","off").wrap("").parent().append("")},_draw:function(){this._enhance(),this._addClass(this.uiSpinner,"ui-spinner","ui-widget ui-widget-content"),this._addClass("ui-spinner-input"),this.element.attr("role","spinbutton"),this.buttons=this.uiSpinner.children("a").attr("tabIndex",-1).attr("aria-hidden",!0).button({classes:{"ui-button":""}}),this._removeClass(this.buttons,"ui-corner-all"),this._addClass(this.buttons.first(),"ui-spinner-button ui-spinner-up"),this._addClass(this.buttons.last(),"ui-spinner-button ui-spinner-down"),this.buttons.first().button({icon:this.options.icons.up,showLabel:!1}),this.buttons.last().button({icon:this.options.icons.down,showLabel:!1}),this.buttons.height()>Math.ceil(.5*this.uiSpinner.height())&&this.uiSpinner.height()>0&&this.uiSpinner.height(this.uiSpinner.height())},_keydown:function(e){var i=this.options,s=t.ui.keyCode;switch(e.keyCode){case s.UP:return this._repeat(null,1,e),!0;case s.DOWN:return this._repeat(null,-1,e),!0;case s.PAGE_UP:return this._repeat(null,i.page,e),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,e),!0}return!1},_start:function(t){return this.spinning||this._trigger("start",t)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(t,e,i){t=t||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,e,i)},t),this._spin(e*this.options.step,i)},_spin:function(t,e){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+t*this._increment(this.counter)),this.spinning&&this._trigger("spin",e,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(e){var i=this.options.incremental;return i?t.isFunction(i)?i(e):Math.floor(e*e*e/5e4-e*e/500+17*e/200+1):1},_precision:function(){var t=this._precisionOf(this.options.step);return null!==this.options.min&&(t=Math.max(t,this._precisionOf(this.options.min))),t},_precisionOf:function(t){var e=""+t,i=e.indexOf(".");return-1===i?0:e.length-i-1},_adjustValue:function(t){var e,i,s=this.options;return e=null!==s.min?s.min:0,i=t-e,i=Math.round(i/s.step)*s.step,t=e+i,t=parseFloat(t.toFixed(this._precision())),null!==s.max&&t>s.max?s.max:null!==s.min&&s.min>t?s.min:t},_stop:function(t){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",t))},_setOption:function(t,e){var i,s,n;return"culture"===t||"numberFormat"===t?(i=this._parse(this.element.val()),this.options[t]=e,this.element.val(this._format(i)),void 0):(("max"===t||"min"===t||"step"===t)&&"string"==typeof e&&(e=this._parse(e)),"icons"===t&&(s=this.buttons.first().find(".ui-icon"),this._removeClass(s,null,this.options.icons.up),this._addClass(s,null,e.up),n=this.buttons.last().find(".ui-icon"),this._removeClass(n,null,this.options.icons.down),this._addClass(n,null,e.down)),this._super(t,e),void 0)},_setOptionDisabled:function(t){this._super(t),this._toggleClass(this.uiSpinner,null,"ui-state-disabled",!!t),this.element.prop("disabled",!!t),this.buttons.button(t?"disable":"enable")},_setOptions:i(function(t){this._super(t)}),_parse:function(t){return"string"==typeof t&&""!==t&&(t=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(t,10,this.options.culture):+t),""===t||isNaN(t)?null:t},_format:function(t){return""===t?"":window.Globalize&&this.options.numberFormat?Globalize.format(t,this.options.numberFormat,this.options.culture):t},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var t=this.value();return null===t?!1:t===this._adjustValue(t)},_value:function(t,e){var i;""!==t&&(i=this._parse(t),null!==i&&(e||(i=this._adjustValue(i)),t=this._format(i))),this.element.val(t),this._refresh()},_destroy:function(){this.element.prop("disabled",!1).removeAttr("autocomplete role aria-valuemin aria-valuemax aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:i(function(t){this._stepUp(t)}),_stepUp:function(t){this._start()&&(this._spin((t||1)*this.options.step),this._stop())},stepDown:i(function(t){this._stepDown(t)}),_stepDown:function(t){this._start()&&(this._spin((t||1)*-this.options.step),this._stop())},pageUp:i(function(t){this._stepUp((t||1)*this.options.page)}),pageDown:i(function(t){this._stepDown((t||1)*this.options.page)}),value:function(t){return arguments.length?(i(this._value).call(this,t),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}}),t.uiBackCompat!==!1&&t.widget("ui.spinner",t.ui.spinner,{_enhance:function(){this.uiSpinner=this.element.attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml())},_uiSpinnerHtml:function(){return""},_buttonHtml:function(){return""}}),t.ui.spinner,t.widget("ui.tabs",{version:"1.12.1",delay:300,options:{active:null,classes:{"ui-tabs":"ui-corner-all","ui-tabs-nav":"ui-corner-all","ui-tabs-panel":"ui-corner-bottom","ui-tabs-tab":"ui-corner-top"},collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var t=/#.*$/;return function(e){var i,s;i=e.href.replace(t,""),s=location.href.replace(t,"");try{i=decodeURIComponent(i)}catch(n){}try{s=decodeURIComponent(s)}catch(n){}return e.hash.length>1&&i===s}}(),_create:function(){var e=this,i=this.options;this.running=!1,this._addClass("ui-tabs","ui-widget ui-widget-content"),this._toggleClass("ui-tabs-collapsible",null,i.collapsible),this._processTabs(),i.active=this._initialActive(),t.isArray(i.disabled)&&(i.disabled=t.unique(i.disabled.concat(t.map(this.tabs.filter(".ui-state-disabled"),function(t){return e.tabs.index(t)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):t(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var e=this.options.active,i=this.options.collapsible,s=location.hash.substring(1);return null===e&&(s&&this.tabs.each(function(i,n){return t(n).attr("aria-controls")===s?(e=i,!1):void 0}),null===e&&(e=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===e||-1===e)&&(e=this.tabs.length?0:!1)),e!==!1&&(e=this.tabs.index(this.tabs.eq(e)),-1===e&&(e=i?!1:0)),!i&&e===!1&&this.anchors.length&&(e=0),e},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):t()}},_tabKeydown:function(e){var i=t(t.ui.safeActiveElement(this.document[0])).closest("li"),s=this.tabs.index(i),n=!0;if(!this._handlePageNav(e)){switch(e.keyCode){case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:s++;break;case t.ui.keyCode.UP:case t.ui.keyCode.LEFT:n=!1,s--;break;case t.ui.keyCode.END:s=this.anchors.length-1;break;case t.ui.keyCode.HOME:s=0;break;case t.ui.keyCode.SPACE:return e.preventDefault(),clearTimeout(this.activating),this._activate(s),void 0;case t.ui.keyCode.ENTER:return e.preventDefault(),clearTimeout(this.activating),this._activate(s===this.options.active?!1:s),void 0;default:return}e.preventDefault(),clearTimeout(this.activating),s=this._focusNextTab(s,n),e.ctrlKey||e.metaKey||(i.attr("aria-selected","false"),this.tabs.eq(s).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",s)},this.delay))}},_panelKeydown:function(e){this._handlePageNav(e)||e.ctrlKey&&e.keyCode===t.ui.keyCode.UP&&(e.preventDefault(),this.active.trigger("focus"))},_handlePageNav:function(e){return e.altKey&&e.keyCode===t.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):e.altKey&&e.keyCode===t.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(e,i){function s(){return e>n&&(e=0),0>e&&(e=n),e}for(var n=this.tabs.length-1;-1!==t.inArray(s(),this.options.disabled);)e=i?e+1:e-1;return e},_focusNextTab:function(t,e){return t=this._findNextTab(t,e),this.tabs.eq(t).trigger("focus"),t},_setOption:function(t,e){return"active"===t?(this._activate(e),void 0):(this._super(t,e),"collapsible"===t&&(this._toggleClass("ui-tabs-collapsible",null,e),e||this.options.active!==!1||this._activate(0)),"event"===t&&this._setupEvents(e),"heightStyle"===t&&this._setupHeightStyle(e),void 0)},_sanitizeSelector:function(t){return t?t.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var e=this.options,i=this.tablist.children(":has(a[href])");e.disabled=t.map(i.filter(".ui-state-disabled"),function(t){return i.index(t)}),this._processTabs(),e.active!==!1&&this.anchors.length?this.active.length&&!t.contains(this.tablist[0],this.active[0])?this.tabs.length===e.disabled.length?(e.active=!1,this.active=t()):this._activate(this._findNextTab(Math.max(0,e.active-1),!1)):e.active=this.tabs.index(this.active):(e.active=!1,this.active=t()),this._refresh()},_refresh:function(){this._setOptionDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._addClass(this.active,"ui-tabs-active","ui-state-active"),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var e=this,i=this.tabs,s=this.anchors,n=this.panels;this.tablist=this._getList().attr("role","tablist"),this._addClass(this.tablist,"ui-tabs-nav","ui-helper-reset ui-helper-clearfix ui-widget-header"),this.tablist.on("mousedown"+this.eventNamespace,"> li",function(e){t(this).is(".ui-state-disabled")&&e.preventDefault()}).on("focus"+this.eventNamespace,".ui-tabs-anchor",function(){t(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").attr({role:"tab",tabIndex:-1}),this._addClass(this.tabs,"ui-tabs-tab","ui-state-default"),this.anchors=this.tabs.map(function(){return t("a",this)[0]}).attr({role:"presentation",tabIndex:-1}),this._addClass(this.anchors,"ui-tabs-anchor"),this.panels=t(),this.anchors.each(function(i,s){var n,o,a,r=t(s).uniqueId().attr("id"),l=t(s).closest("li"),h=l.attr("aria-controls");e._isLocal(s)?(n=s.hash,a=n.substring(1),o=e.element.find(e._sanitizeSelector(n))):(a=l.attr("aria-controls")||t({}).uniqueId()[0].id,n="#"+a,o=e.element.find(n),o.length||(o=e._createPanel(a),o.insertAfter(e.panels[i-1]||e.tablist)),o.attr("aria-live","polite")),o.length&&(e.panels=e.panels.add(o)),h&&l.data("ui-tabs-aria-controls",h),l.attr({"aria-controls":a,"aria-labelledby":r}),o.attr("aria-labelledby",r)}),this.panels.attr("role","tabpanel"),this._addClass(this.panels,"ui-tabs-panel","ui-widget-content"),i&&(this._off(i.not(this.tabs)),this._off(s.not(this.anchors)),this._off(n.not(this.panels)))},_getList:function(){return this.tablist||this.element.find("ol, ul").eq(0)},_createPanel:function(e){return t("
      ").attr("id",e).data("ui-tabs-destroy",!0)},_setOptionDisabled:function(e){var i,s,n;for(t.isArray(e)&&(e.length?e.length===this.anchors.length&&(e=!0):e=!1),n=0;s=this.tabs[n];n++)i=t(s),e===!0||-1!==t.inArray(n,e)?(i.attr("aria-disabled","true"),this._addClass(i,null,"ui-state-disabled")):(i.removeAttr("aria-disabled"),this._removeClass(i,null,"ui-state-disabled"));this.options.disabled=e,this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,e===!0)},_setupEvents:function(e){var i={};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(t){t.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(e){var i,s=this.element.parent();"fill"===e?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var e=t(this),s=e.css("position");"absolute"!==s&&"fixed"!==s&&(i-=e.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=t(this).outerHeight(!0)}),this.panels.each(function(){t(this).height(Math.max(0,i-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===e&&(i=0,this.panels.each(function(){i=Math.max(i,t(this).height("").height())}).height(i))},_eventHandler:function(e){var i=this.options,s=this.active,n=t(e.currentTarget),o=n.closest("li"),a=o[0]===s[0],r=a&&i.collapsible,l=r?t():this._getPanelForTab(o),h=s.length?this._getPanelForTab(s):t(),c={oldTab:s,oldPanel:h,newTab:r?t():o,newPanel:l};e.preventDefault(),o.hasClass("ui-state-disabled")||o.hasClass("ui-tabs-loading")||this.running||a&&!i.collapsible||this._trigger("beforeActivate",e,c)===!1||(i.active=r?!1:this.tabs.index(o),this.active=a?t():o,this.xhr&&this.xhr.abort(),h.length||l.length||t.error("jQuery UI Tabs: Mismatching fragment identifier."),l.length&&this.load(this.tabs.index(o),e),this._toggle(e,c))},_toggle:function(e,i){function s(){o.running=!1,o._trigger("activate",e,i)}function n(){o._addClass(i.newTab.closest("li"),"ui-tabs-active","ui-state-active"),a.length&&o.options.show?o._show(a,o.options.show,s):(a.show(),s())}var o=this,a=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){o._removeClass(i.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),n()}):(this._removeClass(i.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),r.hide(),n()),r.attr("aria-hidden","true"),i.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),a.length&&r.length?i.oldTab.attr("tabIndex",-1):a.length&&this.tabs.filter(function(){return 0===t(this).attr("tabIndex")}).attr("tabIndex",-1),a.attr("aria-hidden","false"),i.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(e){var i,s=this._findActive(e);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return e===!1?t():this.tabs.eq(e)},_getIndex:function(e){return"string"==typeof e&&(e=this.anchors.index(this.anchors.filter("[href$='"+t.ui.escapeSelector(e)+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.tablist.removeAttr("role").off(this.eventNamespace),this.anchors.removeAttr("role tabIndex").removeUniqueId(),this.tabs.add(this.panels).each(function(){t.data(this,"ui-tabs-destroy")?t(this).remove():t(this).removeAttr("role tabIndex aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded")}),this.tabs.each(function(){var e=t(this),i=e.data("ui-tabs-aria-controls");i?e.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):e.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(e){var i=this.options.disabled;i!==!1&&(void 0===e?i=!1:(e=this._getIndex(e),i=t.isArray(i)?t.map(i,function(t){return t!==e?t:null}):t.map(this.tabs,function(t,i){return i!==e?i:null})),this._setOptionDisabled(i))},disable:function(e){var i=this.options.disabled;if(i!==!0){if(void 0===e)i=!0;else{if(e=this._getIndex(e),-1!==t.inArray(e,i))return;i=t.isArray(i)?t.merge([e],i).sort():[e]}this._setOptionDisabled(i)}},load:function(e,i){e=this._getIndex(e);var s=this,n=this.tabs.eq(e),o=n.find(".ui-tabs-anchor"),a=this._getPanelForTab(n),r={tab:n,panel:a},l=function(t,e){"abort"===e&&s.panels.stop(!1,!0),s._removeClass(n,"ui-tabs-loading"),a.removeAttr("aria-busy"),t===s.xhr&&delete s.xhr};this._isLocal(o[0])||(this.xhr=t.ajax(this._ajaxSettings(o,i,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(this._addClass(n,"ui-tabs-loading"),a.attr("aria-busy","true"),this.xhr.done(function(t,e,n){setTimeout(function(){a.html(t),s._trigger("load",i,r),l(n,e)},1)}).fail(function(t,e){setTimeout(function(){l(t,e)},1)})))},_ajaxSettings:function(e,i,s){var n=this;return{url:e.attr("href").replace(/#.*$/,""),beforeSend:function(e,o){return n._trigger("beforeLoad",i,t.extend({jqXHR:e,ajaxSettings:o},s))}}},_getPanelForTab:function(e){var i=t(e).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}}),t.uiBackCompat!==!1&&t.widget("ui.tabs",t.ui.tabs,{_processTabs:function(){this._superApply(arguments),this._addClass(this.tabs,"ui-tab")}}),t.ui.tabs;var l="ui-effects-",h="ui-effects-style",c="ui-effects-animated",u=t;t.effects={effect:{}},function(t,e){function i(t,e,i){var s=u[e.type]||{};return null==t?i||!e.def?null:e.def:(t=s.floor?~~t:parseFloat(t),isNaN(t)?e.def:s.mod?(t+s.mod)%s.mod:0>t?0:t>s.max?s.max:t)}function s(i){var s=h(),n=s._rgba=[];return i=i.toLowerCase(),f(l,function(t,o){var a,r=o.re.exec(i),l=r&&o.parse(r),h=o.space||"rgba";return l?(a=s[h](l),s[c[h].cache]=a[c[h].cache],n=s._rgba=a._rgba,!1):e}),n.length?("0,0,0,0"===n.join()&&t.extend(n,o.transparent),s):o[i]}function n(t,e,i){return i=(i+1)%1,1>6*i?t+6*(e-t)*i:1>2*i?e:2>3*i?t+6*(e-t)*(2/3-i):t}var o,a="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,l=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[t[1],t[2],t[3],t[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[2.55*t[1],2.55*t[2],2.55*t[3],t[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(t){return[t[1],t[2]/100,t[3]/100,t[4]]}}],h=t.Color=function(e,i,s,n){return new t.Color.fn.parse(e,i,s,n)},c={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},u={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},d=h.support={},p=t("

      ")[0],f=t.each;p.style.cssText="background-color:rgba(1,1,1,.5)",d.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(c,function(t,e){e.cache="_"+t,e.props.alpha={idx:3,type:"percent",def:1}}),h.fn=t.extend(h.prototype,{parse:function(n,a,r,l){if(n===e)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=t(n).css(a),a=e);var u=this,d=t.type(n),p=this._rgba=[];return a!==e&&(n=[n,a,r,l],d="array"),"string"===d?this.parse(s(n)||o._default):"array"===d?(f(c.rgba.props,function(t,e){p[e.idx]=i(n[e.idx],e)}),this):"object"===d?(n instanceof h?f(c,function(t,e){n[e.cache]&&(u[e.cache]=n[e.cache].slice())}):f(c,function(e,s){var o=s.cache;f(s.props,function(t,e){if(!u[o]&&s.to){if("alpha"===t||null==n[t])return;u[o]=s.to(u._rgba)}u[o][e.idx]=i(n[t],e,!0)}),u[o]&&0>t.inArray(null,u[o].slice(0,3))&&(u[o][3]=1,s.from&&(u._rgba=s.from(u[o])))}),this):e},is:function(t){var i=h(t),s=!0,n=this;return f(c,function(t,o){var a,r=i[o.cache];return r&&(a=n[o.cache]||o.to&&o.to(n._rgba)||[],f(o.props,function(t,i){return null!=r[i.idx]?s=r[i.idx]===a[i.idx]:e})),s}),s},_space:function(){var t=[],e=this;return f(c,function(i,s){e[s.cache]&&t.push(i)}),t.pop()},transition:function(t,e){var s=h(t),n=s._space(),o=c[n],a=0===this.alpha()?h("transparent"):this,r=a[o.cache]||o.to(a._rgba),l=r.slice();return s=s[o.cache],f(o.props,function(t,n){var o=n.idx,a=r[o],h=s[o],c=u[n.type]||{};null!==h&&(null===a?l[o]=h:(c.mod&&(h-a>c.mod/2?a+=c.mod:a-h>c.mod/2&&(a-=c.mod)),l[o]=i((h-a)*e+a,n)))}),this[n](l)},blend:function(e){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=h(e)._rgba;return h(t.map(i,function(t,e){return(1-s)*n[e]+s*t}))},toRgbaString:function(){var e="rgba(",i=t.map(this._rgba,function(t,e){return null==t?e>2?1:0:t});return 1===i[3]&&(i.pop(),e="rgb("),e+i.join()+")"},toHslaString:function(){var e="hsla(",i=t.map(this.hsla(),function(t,e){return null==t&&(t=e>2?1:0),e&&3>e&&(t=Math.round(100*t)+"%"),t});return 1===i[3]&&(i.pop(),e="hsl("),e+i.join()+")"},toHexString:function(e){var i=this._rgba.slice(),s=i.pop();return e&&i.push(~~(255*s)),"#"+t.map(i,function(t){return t=(t||0).toString(16),1===t.length?"0"+t:t}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),h.fn.parse.prototype=h.fn,c.hsla.to=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e,i,s=t[0]/255,n=t[1]/255,o=t[2]/255,a=t[3],r=Math.max(s,n,o),l=Math.min(s,n,o),h=r-l,c=r+l,u=.5*c;return e=l===r?0:s===r?60*(n-o)/h+360:n===r?60*(o-s)/h+120:60*(s-n)/h+240,i=0===h?0:.5>=u?h/c:h/(2-c),[Math.round(e)%360,i,u,null==a?1:a]},c.hsla.from=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/360,i=t[1],s=t[2],o=t[3],a=.5>=s?s*(1+i):s+i-s*i,r=2*s-a;return[Math.round(255*n(r,a,e+1/3)),Math.round(255*n(r,a,e)),Math.round(255*n(r,a,e-1/3)),o]},f(c,function(s,n){var o=n.props,a=n.cache,l=n.to,c=n.from;h.fn[s]=function(s){if(l&&!this[a]&&(this[a]=l(this._rgba)),s===e)return this[a].slice();var n,r=t.type(s),u="array"===r||"object"===r?s:arguments,d=this[a].slice();return f(o,function(t,e){var s=u["object"===r?t:e.idx];null==s&&(s=d[e.idx]),d[e.idx]=i(s,e)}),c?(n=h(c(d)),n[a]=d,n):h(d)},f(o,function(e,i){h.fn[e]||(h.fn[e]=function(n){var o,a=t.type(n),l="alpha"===e?this._hsla?"hsla":"rgba":s,h=this[l](),c=h[i.idx];return"undefined"===a?c:("function"===a&&(n=n.call(this,c),a=t.type(n)),null==n&&i.empty?this:("string"===a&&(o=r.exec(n),o&&(n=c+parseFloat(o[2])*("+"===o[1]?1:-1))),h[i.idx]=n,this[l](h)))})})}),h.hook=function(e){var i=e.split(" ");f(i,function(e,i){t.cssHooks[i]={set:function(e,n){var o,a,r="";if("transparent"!==n&&("string"!==t.type(n)||(o=s(n)))){if(n=h(o||n),!d.rgba&&1!==n._rgba[3]){for(a="backgroundColor"===i?e.parentNode:e;(""===r||"transparent"===r)&&a&&a.style;)try{r=t.css(a,"backgroundColor"),a=a.parentNode}catch(l){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{e.style[i]=n}catch(l){}}},t.fx.step[i]=function(e){e.colorInit||(e.start=h(e.elem,i),e.end=h(e.end),e.colorInit=!0),t.cssHooks[i].set(e.elem,e.start.transition(e.end,e.pos))}})},h.hook(a),t.cssHooks.borderColor={expand:function(t){var e={};return f(["Top","Right","Bottom","Left"],function(i,s){e["border"+s+"Color"]=t}),e}},o=t.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(u),function(){function e(e){var i,s,n=e.ownerDocument.defaultView?e.ownerDocument.defaultView.getComputedStyle(e,null):e.currentStyle,o={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(o[t.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(o[i]=n[i]);return o}function i(e,i){var s,o,a={};for(s in i)o=i[s],e[s]!==o&&(n[s]||(t.fx.step[s]||!isNaN(parseFloat(o)))&&(a[s]=o)); +return a}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};t.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(e,i){t.fx.step[i]=function(t){("none"!==t.end&&!t.setAttr||1===t.pos&&!t.setAttr)&&(u.style(t.elem,i,t.end),t.setAttr=!0)}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.effects.animateClass=function(n,o,a,r){var l=t.speed(o,a,r);return this.queue(function(){var o,a=t(this),r=a.attr("class")||"",h=l.children?a.find("*").addBack():a;h=h.map(function(){var i=t(this);return{el:i,start:e(this)}}),o=function(){t.each(s,function(t,e){n[e]&&a[e+"Class"](n[e])})},o(),h=h.map(function(){return this.end=e(this.el[0]),this.diff=i(this.start,this.end),this}),a.attr("class",r),h=h.map(function(){var e=this,i=t.Deferred(),s=t.extend({},l,{queue:!1,complete:function(){i.resolve(e)}});return this.el.animate(this.diff,s),i.promise()}),t.when.apply(t,h.get()).done(function(){o(),t.each(arguments,function(){var e=this.el;t.each(this.diff,function(t){e.css(t,"")})}),l.complete.call(a[0])})})},t.fn.extend({addClass:function(e){return function(i,s,n,o){return s?t.effects.animateClass.call(this,{add:i},s,n,o):e.apply(this,arguments)}}(t.fn.addClass),removeClass:function(e){return function(i,s,n,o){return arguments.length>1?t.effects.animateClass.call(this,{remove:i},s,n,o):e.apply(this,arguments)}}(t.fn.removeClass),toggleClass:function(e){return function(i,s,n,o,a){return"boolean"==typeof s||void 0===s?n?t.effects.animateClass.call(this,s?{add:i}:{remove:i},n,o,a):e.apply(this,arguments):t.effects.animateClass.call(this,{toggle:i},s,n,o)}}(t.fn.toggleClass),switchClass:function(e,i,s,n,o){return t.effects.animateClass.call(this,{add:i,remove:e},s,n,o)}})}(),function(){function e(e,i,s,n){return t.isPlainObject(e)&&(i=e,e=e.effect),e={effect:e},null==i&&(i={}),t.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||t.fx.speeds[i])&&(n=s,s=i,i={}),t.isFunction(s)&&(n=s,s=null),i&&t.extend(e,i),s=s||i.duration,e.duration=t.fx.off?0:"number"==typeof s?s:s in t.fx.speeds?t.fx.speeds[s]:t.fx.speeds._default,e.complete=n||i.complete,e}function i(e){return!e||"number"==typeof e||t.fx.speeds[e]?!0:"string"!=typeof e||t.effects.effect[e]?t.isFunction(e)?!0:"object"!=typeof e||e.effect?!1:!0:!0}function s(t,e){var i=e.outerWidth(),s=e.outerHeight(),n=/^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,o=n.exec(t)||["",0,i,s,0];return{top:parseFloat(o[1])||0,right:"auto"===o[2]?i:parseFloat(o[2]),bottom:"auto"===o[3]?s:parseFloat(o[3]),left:parseFloat(o[4])||0}}t.expr&&t.expr.filters&&t.expr.filters.animated&&(t.expr.filters.animated=function(e){return function(i){return!!t(i).data(c)||e(i)}}(t.expr.filters.animated)),t.uiBackCompat!==!1&&t.extend(t.effects,{save:function(t,e){for(var i=0,s=e.length;s>i;i++)null!==e[i]&&t.data(l+e[i],t[0].style[e[i]])},restore:function(t,e){for(var i,s=0,n=e.length;n>s;s++)null!==e[s]&&(i=t.data(l+e[s]),t.css(e[s],i))},setMode:function(t,e){return"toggle"===e&&(e=t.is(":hidden")?"show":"hide"),e},createWrapper:function(e){if(e.parent().is(".ui-effects-wrapper"))return e.parent();var i={width:e.outerWidth(!0),height:e.outerHeight(!0),"float":e.css("float")},s=t("

      ").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:e.width(),height:e.height()},o=document.activeElement;try{o.id}catch(a){o=document.body}return e.wrap(s),(e[0]===o||t.contains(e[0],o))&&t(o).trigger("focus"),s=e.parent(),"static"===e.css("position")?(s.css({position:"relative"}),e.css({position:"relative"})):(t.extend(i,{position:e.css("position"),zIndex:e.css("z-index")}),t.each(["top","left","bottom","right"],function(t,s){i[s]=e.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),e.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),e.css(n),s.css(i).show()},removeWrapper:function(e){var i=document.activeElement;return e.parent().is(".ui-effects-wrapper")&&(e.parent().replaceWith(e),(e[0]===i||t.contains(e[0],i))&&t(i).trigger("focus")),e}}),t.extend(t.effects,{version:"1.12.1",define:function(e,i,s){return s||(s=i,i="effect"),t.effects.effect[e]=s,t.effects.effect[e].mode=i,s},scaledDimensions:function(t,e,i){if(0===e)return{height:0,width:0,outerHeight:0,outerWidth:0};var s="horizontal"!==i?(e||100)/100:1,n="vertical"!==i?(e||100)/100:1;return{height:t.height()*n,width:t.width()*s,outerHeight:t.outerHeight()*n,outerWidth:t.outerWidth()*s}},clipToBox:function(t){return{width:t.clip.right-t.clip.left,height:t.clip.bottom-t.clip.top,left:t.clip.left,top:t.clip.top}},unshift:function(t,e,i){var s=t.queue();e>1&&s.splice.apply(s,[1,0].concat(s.splice(e,i))),t.dequeue()},saveStyle:function(t){t.data(h,t[0].style.cssText)},restoreStyle:function(t){t[0].style.cssText=t.data(h)||"",t.removeData(h)},mode:function(t,e){var i=t.is(":hidden");return"toggle"===e&&(e=i?"show":"hide"),(i?"hide"===e:"show"===e)&&(e="none"),e},getBaseline:function(t,e){var i,s;switch(t[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=t[0]/e.height}switch(t[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=t[1]/e.width}return{x:s,y:i}},createPlaceholder:function(e){var i,s=e.css("position"),n=e.position();return e.css({marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()),/^(static|relative)/.test(s)&&(s="absolute",i=t("<"+e[0].nodeName+">").insertAfter(e).css({display:/^(inline|ruby)/.test(e.css("display"))?"inline-block":"block",visibility:"hidden",marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight"),"float":e.css("float")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).addClass("ui-effects-placeholder"),e.data(l+"placeholder",i)),e.css({position:s,left:n.left,top:n.top}),i},removePlaceholder:function(t){var e=l+"placeholder",i=t.data(e);i&&(i.remove(),t.removeData(e))},cleanUp:function(e){t.effects.restoreStyle(e),t.effects.removePlaceholder(e)},setTransition:function(e,i,s,n){return n=n||{},t.each(i,function(t,i){var o=e.cssUnit(i);o[0]>0&&(n[i]=o[0]*s+o[1])}),n}}),t.fn.extend({effect:function(){function i(e){function i(){r.removeData(c),t.effects.cleanUp(r),"hide"===s.mode&&r.hide(),a()}function a(){t.isFunction(l)&&l.call(r[0]),t.isFunction(e)&&e()}var r=t(this);s.mode=u.shift(),t.uiBackCompat===!1||o?"none"===s.mode?(r[h](),a()):n.call(r[0],s,i):(r.is(":hidden")?"hide"===h:"show"===h)?(r[h](),a()):n.call(r[0],s,a)}var s=e.apply(this,arguments),n=t.effects.effect[s.effect],o=n.mode,a=s.queue,r=a||"fx",l=s.complete,h=s.mode,u=[],d=function(e){var i=t(this),s=t.effects.mode(i,h)||o;i.data(c,!0),u.push(s),o&&("show"===s||s===o&&"hide"===s)&&i.show(),o&&"none"===s||t.effects.saveStyle(i),t.isFunction(e)&&e()};return t.fx.off||!n?h?this[h](s.duration,l):this.each(function(){l&&l.call(this)}):a===!1?this.each(d).each(i):this.queue(r,d).queue(r,i)},show:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="show",this.effect.call(this,n)}}(t.fn.show),hide:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(t.fn.hide),toggle:function(t){return function(s){if(i(s)||"boolean"==typeof s)return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(t.fn.toggle),cssUnit:function(e){var i=this.css(e),s=[];return t.each(["em","px","%","pt"],function(t,e){i.indexOf(e)>0&&(s=[parseFloat(i),e])}),s},cssClip:function(t){return t?this.css("clip","rect("+t.top+"px "+t.right+"px "+t.bottom+"px "+t.left+"px)"):s(this.css("clip"),this)},transfer:function(e,i){var s=t(this),n=t(e.to),o="fixed"===n.css("position"),a=t("body"),r=o?a.scrollTop():0,l=o?a.scrollLeft():0,h=n.offset(),c={top:h.top-r,left:h.left-l,height:n.innerHeight(),width:n.innerWidth()},u=s.offset(),d=t("
      ").appendTo("body").addClass(e.className).css({top:u.top-r,left:u.left-l,height:s.innerHeight(),width:s.innerWidth(),position:o?"fixed":"absolute"}).animate(c,e.duration,e.easing,function(){d.remove(),t.isFunction(i)&&i()})}}),t.fx.step.clip=function(e){e.clipInit||(e.start=t(e.elem).cssClip(),"string"==typeof e.end&&(e.end=s(e.end,e.elem)),e.clipInit=!0),t(e.elem).cssClip({top:e.pos*(e.end.top-e.start.top)+e.start.top,right:e.pos*(e.end.right-e.start.right)+e.start.right,bottom:e.pos*(e.end.bottom-e.start.bottom)+e.start.bottom,left:e.pos*(e.end.left-e.start.left)+e.start.left})}}(),function(){var e={};t.each(["Quad","Cubic","Quart","Quint","Expo"],function(t,i){e[i]=function(e){return Math.pow(e,t+2)}}),t.extend(e,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;((e=Math.pow(2,--i))-1)/11>t;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),t.each(e,function(e,i){t.easing["easeIn"+e]=i,t.easing["easeOut"+e]=function(t){return 1-i(1-t)},t.easing["easeInOut"+e]=function(t){return.5>t?i(2*t)/2:1-i(-2*t+2)/2}})}();var d=t.effects;t.effects.define("blind","hide",function(e,i){var s={up:["bottom","top"],vertical:["bottom","top"],down:["top","bottom"],left:["right","left"],horizontal:["right","left"],right:["left","right"]},n=t(this),o=e.direction||"up",a=n.cssClip(),r={clip:t.extend({},a)},l=t.effects.createPlaceholder(n);r.clip[s[o][0]]=r.clip[s[o][1]],"show"===e.mode&&(n.cssClip(r.clip),l&&l.css(t.effects.clipToBox(r)),r.clip=a),l&&l.animate(t.effects.clipToBox(r),e.duration,e.easing),n.animate(r,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("bounce",function(e,i){var s,n,o,a=t(this),r=e.mode,l="hide"===r,h="show"===r,c=e.direction||"up",u=e.distance,d=e.times||5,p=2*d+(h||l?1:0),f=e.duration/p,g=e.easing,m="up"===c||"down"===c?"top":"left",_="up"===c||"left"===c,v=0,b=a.queue().length;for(t.effects.createPlaceholder(a),o=a.css(m),u||(u=a["top"===m?"outerHeight":"outerWidth"]()/3),h&&(n={opacity:1},n[m]=o,a.css("opacity",0).css(m,_?2*-u:2*u).animate(n,f,g)),l&&(u/=Math.pow(2,d-1)),n={},n[m]=o;d>v;v++)s={},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g).animate(n,f,g),u=l?2*u:u/2;l&&(s={opacity:0},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g)),a.queue(i),t.effects.unshift(a,b,p+1)}),t.effects.define("clip","hide",function(e,i){var s,n={},o=t(this),a=e.direction||"vertical",r="both"===a,l=r||"horizontal"===a,h=r||"vertical"===a;s=o.cssClip(),n.clip={top:h?(s.bottom-s.top)/2:s.top,right:l?(s.right-s.left)/2:s.right,bottom:h?(s.bottom-s.top)/2:s.bottom,left:l?(s.right-s.left)/2:s.left},t.effects.createPlaceholder(o),"show"===e.mode&&(o.cssClip(n.clip),n.clip=s),o.animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("drop","hide",function(e,i){var s,n=t(this),o=e.mode,a="show"===o,r=e.direction||"left",l="up"===r||"down"===r?"top":"left",h="up"===r||"left"===r?"-=":"+=",c="+="===h?"-=":"+=",u={opacity:0};t.effects.createPlaceholder(n),s=e.distance||n["top"===l?"outerHeight":"outerWidth"](!0)/2,u[l]=h+s,a&&(n.css(u),u[l]=c+s,u.opacity=1),n.animate(u,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("explode","hide",function(e,i){function s(){b.push(this),b.length===u*d&&n()}function n(){p.css({visibility:"visible"}),t(b).remove(),i()}var o,a,r,l,h,c,u=e.pieces?Math.round(Math.sqrt(e.pieces)):3,d=u,p=t(this),f=e.mode,g="show"===f,m=p.show().css("visibility","hidden").offset(),_=Math.ceil(p.outerWidth()/d),v=Math.ceil(p.outerHeight()/u),b=[];for(o=0;u>o;o++)for(l=m.top+o*v,c=o-(u-1)/2,a=0;d>a;a++)r=m.left+a*_,h=a-(d-1)/2,p.clone().appendTo("body").wrap("
      ").css({position:"absolute",visibility:"visible",left:-a*_,top:-o*v}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:_,height:v,left:r+(g?h*_:0),top:l+(g?c*v:0),opacity:g?0:1}).animate({left:r+(g?0:h*_),top:l+(g?0:c*v),opacity:g?1:0},e.duration||500,e.easing,s)}),t.effects.define("fade","toggle",function(e,i){var s="show"===e.mode;t(this).css("opacity",s?0:1).animate({opacity:s?1:0},{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("fold","hide",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=e.size||15,l=/([0-9]+)%/.exec(r),h=!!e.horizFirst,c=h?["right","bottom"]:["bottom","right"],u=e.duration/2,d=t.effects.createPlaceholder(s),p=s.cssClip(),f={clip:t.extend({},p)},g={clip:t.extend({},p)},m=[p[c[0]],p[c[1]]],_=s.queue().length;l&&(r=parseInt(l[1],10)/100*m[a?0:1]),f.clip[c[0]]=r,g.clip[c[0]]=r,g.clip[c[1]]=0,o&&(s.cssClip(g.clip),d&&d.css(t.effects.clipToBox(g)),g.clip=p),s.queue(function(i){d&&d.animate(t.effects.clipToBox(f),u,e.easing).animate(t.effects.clipToBox(g),u,e.easing),i()}).animate(f,u,e.easing).animate(g,u,e.easing).queue(i),t.effects.unshift(s,_,4)}),t.effects.define("highlight","show",function(e,i){var s=t(this),n={backgroundColor:s.css("backgroundColor")};"hide"===e.mode&&(n.opacity=0),t.effects.saveStyle(s),s.css({backgroundImage:"none",backgroundColor:e.color||"#ffff99"}).animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("size",function(e,i){var s,n,o,a=t(this),r=["fontSize"],l=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],h=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],c=e.mode,u="effect"!==c,d=e.scale||"both",p=e.origin||["middle","center"],f=a.css("position"),g=a.position(),m=t.effects.scaledDimensions(a),_=e.from||m,v=e.to||t.effects.scaledDimensions(a,0);t.effects.createPlaceholder(a),"show"===c&&(o=_,_=v,v=o),n={from:{y:_.height/m.height,x:_.width/m.width},to:{y:v.height/m.height,x:v.width/m.width}},("box"===d||"both"===d)&&(n.from.y!==n.to.y&&(_=t.effects.setTransition(a,l,n.from.y,_),v=t.effects.setTransition(a,l,n.to.y,v)),n.from.x!==n.to.x&&(_=t.effects.setTransition(a,h,n.from.x,_),v=t.effects.setTransition(a,h,n.to.x,v))),("content"===d||"both"===d)&&n.from.y!==n.to.y&&(_=t.effects.setTransition(a,r,n.from.y,_),v=t.effects.setTransition(a,r,n.to.y,v)),p&&(s=t.effects.getBaseline(p,m),_.top=(m.outerHeight-_.outerHeight)*s.y+g.top,_.left=(m.outerWidth-_.outerWidth)*s.x+g.left,v.top=(m.outerHeight-v.outerHeight)*s.y+g.top,v.left=(m.outerWidth-v.outerWidth)*s.x+g.left),a.css(_),("content"===d||"both"===d)&&(l=l.concat(["marginTop","marginBottom"]).concat(r),h=h.concat(["marginLeft","marginRight"]),a.find("*[width]").each(function(){var i=t(this),s=t.effects.scaledDimensions(i),o={height:s.height*n.from.y,width:s.width*n.from.x,outerHeight:s.outerHeight*n.from.y,outerWidth:s.outerWidth*n.from.x},a={height:s.height*n.to.y,width:s.width*n.to.x,outerHeight:s.height*n.to.y,outerWidth:s.width*n.to.x};n.from.y!==n.to.y&&(o=t.effects.setTransition(i,l,n.from.y,o),a=t.effects.setTransition(i,l,n.to.y,a)),n.from.x!==n.to.x&&(o=t.effects.setTransition(i,h,n.from.x,o),a=t.effects.setTransition(i,h,n.to.x,a)),u&&t.effects.saveStyle(i),i.css(o),i.animate(a,e.duration,e.easing,function(){u&&t.effects.restoreStyle(i)})})),a.animate(v,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){var e=a.offset();0===v.opacity&&a.css("opacity",_.opacity),u||(a.css("position","static"===f?"relative":f).offset(e),t.effects.saveStyle(a)),i()}})}),t.effects.define("scale",function(e,i){var s=t(this),n=e.mode,o=parseInt(e.percent,10)||(0===parseInt(e.percent,10)?0:"effect"!==n?0:100),a=t.extend(!0,{from:t.effects.scaledDimensions(s),to:t.effects.scaledDimensions(s,o,e.direction||"both"),origin:e.origin||["middle","center"]},e);e.fade&&(a.from.opacity=1,a.to.opacity=0),t.effects.effect.size.call(this,a,i)}),t.effects.define("puff","hide",function(e,i){var s=t.extend(!0,{},e,{fade:!0,percent:parseInt(e.percent,10)||150});t.effects.effect.scale.call(this,s,i)}),t.effects.define("pulsate","show",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=o||a,l=2*(e.times||5)+(r?1:0),h=e.duration/l,c=0,u=1,d=s.queue().length;for((o||!s.is(":visible"))&&(s.css("opacity",0).show(),c=1);l>u;u++)s.animate({opacity:c},h,e.easing),c=1-c;s.animate({opacity:c},h,e.easing),s.queue(i),t.effects.unshift(s,d,l+1)}),t.effects.define("shake",function(e,i){var s=1,n=t(this),o=e.direction||"left",a=e.distance||20,r=e.times||3,l=2*r+1,h=Math.round(e.duration/l),c="up"===o||"down"===o?"top":"left",u="up"===o||"left"===o,d={},p={},f={},g=n.queue().length;for(t.effects.createPlaceholder(n),d[c]=(u?"-=":"+=")+a,p[c]=(u?"+=":"-=")+2*a,f[c]=(u?"-=":"+=")+2*a,n.animate(d,h,e.easing);r>s;s++)n.animate(p,h,e.easing).animate(f,h,e.easing);n.animate(p,h,e.easing).animate(d,h/2,e.easing).queue(i),t.effects.unshift(n,g,l+1)}),t.effects.define("slide","show",function(e,i){var s,n,o=t(this),a={up:["bottom","top"],down:["top","bottom"],left:["right","left"],right:["left","right"]},r=e.mode,l=e.direction||"left",h="up"===l||"down"===l?"top":"left",c="up"===l||"left"===l,u=e.distance||o["top"===h?"outerHeight":"outerWidth"](!0),d={};t.effects.createPlaceholder(o),s=o.cssClip(),n=o.position()[h],d[h]=(c?-1:1)*u+n,d.clip=o.cssClip(),d.clip[a[l][1]]=d.clip[a[l][0]],"show"===r&&(o.cssClip(d.clip),o.css(h,d[h]),d.clip=s,d[h]=n),o.animate(d,{queue:!1,duration:e.duration,easing:e.easing,complete:i})});var d;t.uiBackCompat!==!1&&(d=t.effects.define("transfer",function(e,i){t(this).transfer(e,i)}))}); \ No newline at end of file diff --git a/src/assets/plugins/jquery-ui/jquery-ui.min.rtl.css b/src/assets/plugins/jquery-ui/jquery-ui.min.rtl.css new file mode 100644 index 0000000..1c368c4 --- /dev/null +++ b/src/assets/plugins/jquery-ui/jquery-ui.min.rtl.css @@ -0,0 +1,7 @@ +/*! jQuery UI - v1.12.1 - 2019-06-14 +* http://jqueryui.com +* Includes: draggable.css, core.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, dialog.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=base&cornerRadiusShadow=8px&offsetLeftShadow=0px&offsetTopShadow=0px&thicknessShadow=5px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=666666&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cc0000&fcError=5f3f3f&borderColorError=f1a899&bgTextureError=flat&bgColorError=fddfdf&iconColorHighlight=777620&fcHighlight=777620&borderColorHighlight=dad55e&bgTextureHighlight=flat&bgColorHighlight=fffa90&iconColorActive=ffffff&fcActive=ffffff&borderColorActive=003eff&bgTextureActive=flat&bgColorActive=007fff&iconColorHover=555555&fcHover=2b2b2b&borderColorHover=cccccc&bgTextureHover=flat&bgColorHover=ededed&iconColorDefault=777777&fcDefault=454545&borderColorDefault=c5c5c5&bgTextureDefault=flat&bgColorDefault=f6f6f6&iconColorContent=444444&fcContent=333333&borderColorContent=dddddd&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=444444&fcHeader=333333&borderColorHeader=dddddd&bgTextureHeader=flat&bgColorHeader=e9e9e9&cornerRadius=3px&fwDefault=normal&fsDefault=1em&ffDefault=Arial%2CHelvetica%2Csans-serif +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;right:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{right:50%;margin-right:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;right:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;right:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;right:0}.ui-resizable-e{cursor:e-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-se{cursor:sw-resize;width:12px;height:12px;left:1px;bottom:1px}.ui-resizable-sw{cursor:se-resize;width:9px;height:9px;right:-5px;bottom:-5px}.ui-resizable-nw{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-resizable-ne{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .7em .5em .5em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;right:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px .4em 3px 1em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-right:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;right:.2em;margin:auto 0}.ui-menu .ui-menu-icon{right:auto;left:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-left:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;right:50%;margin-top:-8px;margin-right:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:right;margin-right:0;margin-left:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:right}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset -1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-dialog{position:absolute;top:0;right:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:right;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;left:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:right;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em .4em .5em 1em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:left}.ui-dialog .ui-dialog-buttonpane button{margin:.5em 0 .5em .4em;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;left:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;right:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{left:0;bottom:0}.ui-dialog .ui-resizable-sw{right:0;bottom:0}.ui-dialog .ui-resizable-ne{left:0;top:0}.ui-dialog .ui-resizable-nw{right:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-progressbar{height:2em;text-align:right;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;right:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-left:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:right;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:left;margin-top:0}.ui-slider{position:relative;text-align:right}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:100% 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-right:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{right:0}.ui-slider-horizontal .ui-slider-range-max{left:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{right:-.3em;margin-right:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{right:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-right:.4em;margin-left:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;left:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-left-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:right;position:relative;top:0;margin:1px 0 0 .2em;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:right;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #c5c5c5}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#2b2b2b;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#003eff;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-checked{border:1px solid #dad55e;background:#fffa90}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:100% 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:100% -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:100% -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:100% -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:100% -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:100% -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:100% -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:100% -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:100% -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:100% -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:100% -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:100% -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:100% -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:100% -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-right-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-left-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:0 0 5px #666;box-shadow:0 0 5px #666} \ No newline at end of file diff --git a/src/assets/plugins/line-awesome/css/line-awesome.css b/src/assets/plugins/line-awesome/css/line-awesome.css new file mode 100644 index 0000000..3f8d827 --- /dev/null +++ b/src/assets/plugins/line-awesome/css/line-awesome.css @@ -0,0 +1,845 @@ +/*! + * Line Awesome 1.1.0 by @icons_8 - https://icons8.com/line-awesome + * License - https://icons8.com/good-boy-license/ (Font: SIL OFL 1.1, CSS: MIT License) + * + * Made with love by Icons8 [ https://icons8.com/ ] using FontCustom [ https://github.com/FontCustom/fontcustom ] + * + * Contacts: + * [ https://icons8.com/contact ] + * + * Follow Icon8 on + * Twitter [ https://twitter.com/icons_8 ] + * Facebook [ https://www.facebook.com/Icons8 ] + * Google+ [ https://plus.google.com/+Icons8 ] + * GitHub [ https://github.com/icons8 ] + */ + +@font-face { + font-family: "LineAwesome"; + src: url("../fonts/line-awesome.eot?v=1.1."); + src: url("../fonts/line-awesome.eot??v=1.1.#iefix") format("embedded-opentype"), + url("../fonts/line-awesome.woff2?v=1.1.") format("woff2"), + url("../fonts/line-awesome.woff?v=1.1.") format("woff"), + url("../fonts/line-awesome.ttf?v=1.1.") format("truetype"), + url("../fonts/line-awesome.svg?v=1.1.#fa") format("svg"); + font-weight: normal; + font-style: normal; +} + +@media screen and (-webkit-min-device-pixel-ratio:0) { + @font-face { + font-family: "LineAwesome"; + src: url("../fonts/line-awesome.svg?v=1.1.#fa") format("svg"); + } +} + +/* Thanks to http://fontawesome.io @fontawesome and @davegandy */ +.la { + display: inline-block; + font: normal normal normal 16px/1 "LineAwesome"; + font-size: inherit; + text-decoration: inherit; + text-rendering: optimizeLegibility; + text-transform: none; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-smoothing: antialiased; +} +/* makes the font 33% larger relative to the icon container */ +.la-lg { + font-size: 1.33333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.la-2x { + font-size: 2em; +} +.la-3x { + font-size: 3em; +} +.la-4x { + font-size: 4em; +} +.la-5x { + font-size: 5em; +} +.la-fw { + width: 1.28571429em; + text-align: center; +} +.la-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} +.la-ul > li { + position: relative; +} +.la-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: 0.14285714em; + text-align: center; +} +.la-li.la-lg { + left: -1.85714286em; +} +.la-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.li.pull-left { + margin-right: .3em; +} +.li.pull-right { + margin-left: .3em; +} +.la-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +.la-rotate-90 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.la-rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.la-rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.la-flip-horizontal { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.la-flip-vertical { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} +:root .la-rotate-90, +:root .la-rotate-180, +:root .la-rotate-270, +:root .la-flip-horizontal, +:root .la-flip-vertical { + filter: none; +} +.la-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.la-stack-1x, +.la-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.la-stack-1x { + line-height: inherit; +} +.la-stack-2x { + font-size: 2em; +} +.la-inverse { + color: #ffffff; +} +/* Thanks to http://fontawesome.io @fontawesome and @davegandy */ + +.la-500px:before { content: "\f100"; } +.la-adjust:before { content: "\f101"; } +.la-adn:before { content: "\f102"; } +.la-align-center:before { content: "\f103"; } +.la-align-justify:before { content: "\f104"; } +.la-align-left:before { content: "\f105"; } +.la-align-right:before { content: "\f106"; } +.la-amazon:before { content: "\f107"; } +.la-ambulance:before { content: "\f108"; } +.la-anchor:before { content: "\f109"; } +.la-android:before { content: "\f10a"; } +.la-angellist:before { content: "\f10b"; } +.la-angle-double-down:before { content: "\f10c"; } +.la-angle-double-left:before { content: "\f10d"; } +.la-angle-double-right:before { content: "\f10e"; } +.la-angle-double-up:before { content: "\f10f"; } +.la-angle-down:before { content: "\f110"; } +.la-angle-left:before { content: "\f111"; } +.la-angle-right:before { content: "\f112"; } +.la-angle-up:before { content: "\f113"; } +.la-apple:before { content: "\f114"; } +.la-archive:before { content: "\f115"; } +.la-area-chart:before { content: "\f116"; } +.la-arrow-circle-down:before { content: "\f117"; } +.la-arrow-circle-left:before { content: "\f118"; } +.la-arrow-circle-o-down:before { content: "\f119"; } +.la-arrow-circle-o-left:before { content: "\f11a"; } +.la-arrow-circle-o-right:before { content: "\f11b"; } +.la-arrow-circle-o-up:before { content: "\f11c"; } +.la-arrow-circle-right:before { content: "\f11d"; } +.la-arrow-circle-up:before { content: "\f11e"; } +.la-arrow-down:before { content: "\f11f"; } +.la-arrow-left:before { content: "\f120"; } +.la-arrow-right:before { content: "\f121"; } +.la-arrow-up:before { content: "\f122"; } +.la-arrows:before { content: "\f123"; } +.la-arrows-alt:before { content: "\f124"; } +.la-arrows-h:before { content: "\f125"; } +.la-arrows-v:before { content: "\f126"; } +.la-asterisk:before { content: "\f127"; } +.la-at:before { content: "\f128"; } +.la-automobile:before { content: "\f129"; } +.la-backward:before { content: "\f12a"; } +.la-balance-scale:before { content: "\f12b"; } +.la-ban:before { content: "\f12c"; } +.la-bank:before { content: "\f12d"; } +.la-bar-chart:before { content: "\f12e"; } +.la-bar-chart-o:before { content: "\f12f"; } +.la-barcode:before { content: "\f130"; } +.la-bars:before { content: "\f131"; } +.la-battery-0:before { content: "\f132"; } +.la-battery-1:before { content: "\f133"; } +.la-battery-2:before { content: "\f134"; } +.la-battery-3:before { content: "\f135"; } +.la-battery-4:before { content: "\f136"; } +.la-battery-empty:before { content: "\f137"; } +.la-battery-full:before { content: "\f138"; } +.la-battery-half:before { content: "\f139"; } +.la-battery-quarter:before { content: "\f13a"; } +.la-battery-three-quarters:before { content: "\f13b"; } +.la-bed:before { content: "\f13c"; } +.la-beer:before { content: "\f13d"; } +.la-behance:before { content: "\f13e"; } +.la-behance-square:before { content: "\f13f"; } +.la-bell:before { content: "\f140"; } +.la-bell-o:before { content: "\f141"; } +.la-bell-slash:before { content: "\f142"; } +.la-bell-slash-o:before { content: "\f143"; } +.la-bicycle:before { content: "\f144"; } +.la-binoculars:before { content: "\f145"; } +.la-birthday-cake:before { content: "\f146"; } +.la-bitbucket:before { content: "\f147"; } +.la-bitbucket-square:before { content: "\f148"; } +.la-bitcoin:before { content: "\f149"; } +.la-black-tie:before { content: "\f14a"; } +.la-bold:before { content: "\f14b"; } +.la-bolt:before { content: "\f14c"; } +.la-bomb:before { content: "\f14d"; } +.la-book:before { content: "\f14e"; } +.la-bookmark:before { content: "\f14f"; } +.la-bookmark-o:before { content: "\f150"; } +.la-briefcase:before { content: "\f151"; } +.la-btc:before { content: "\f152"; } +.la-bug:before { content: "\f153"; } +.la-building:before { content: "\f154"; } +.la-building-o:before { content: "\f155"; } +.la-bullhorn:before { content: "\f156"; } +.la-bullseye:before { content: "\f157"; } +.la-bus:before { content: "\f158"; } +.la-buysellads:before { content: "\f159"; } +.la-cab:before { content: "\f15a"; } +.la-calculator:before { content: "\f15b"; } +.la-calendar:before { content: "\f15c"; } +.la-calendar-check-o:before { content: "\f15d"; } +.la-calendar-minus-o:before { content: "\f15e"; } +.la-calendar-o:before { content: "\f15f"; } +.la-calendar-plus-o:before { content: "\f160"; } +.la-calendar-times-o:before { content: "\f161"; } +.la-camera:before { content: "\f162"; } +.la-camera-retro:before { content: "\f163"; } +.la-car:before { content: "\f164"; } +.la-caret-down:before { content: "\f165"; } +.la-caret-left:before { content: "\f166"; } +.la-caret-right:before { content: "\f167"; } +.la-caret-square-o-down:before, .la-toggle-down:before { content: "\f168"; } +.la-caret-square-o-left:before, .la-toggle-left:before { content: "\f169"; } +.la-caret-square-o-right:before, .la-toggle-right:before { content: "\f16a"; } +.la-caret-square-o-up:before, .la-toggle-up:before { content: "\f16b"; } +.la-caret-up:before { content: "\f16c"; } +.la-cart-arrow-down:before { content: "\f16d"; } +.la-cart-plus:before { content: "\f16e"; } +.la-cc:before { content: "\f16f"; } +.la-cc-amex:before { content: "\f170"; } +.la-cc-diners-club:before { content: "\f171"; } +.la-cc-discover:before { content: "\f172"; } +.la-cc-jcb:before { content: "\f173"; } +.la-cc-mastercard:before { content: "\f174"; } +.la-cc-paypal:before { content: "\f175"; } +.la-cc-stripe:before { content: "\f176"; } +.la-cc-visa:before { content: "\f177"; } +.la-certificate:before { content: "\f178"; } +.la-chain:before { content: "\f179"; } +.la-chain-broken:before { content: "\f17a"; } +.la-check:before { content: "\f17b"; } +.la-check-circle:before { content: "\f17c"; } +.la-check-circle-o:before { content: "\f17d"; } +.la-check-square:before { content: "\f17e"; } +.la-check-square-o:before { content: "\f17f"; } +.la-chevron-circle-down:before { content: "\f180"; } +.la-chevron-circle-left:before { content: "\f181"; } +.la-chevron-circle-right:before { content: "\f182"; } +.la-chevron-circle-up:before { content: "\f183"; } +.la-chevron-down:before { content: "\f184"; } +.la-chevron-left:before { content: "\f185"; } +.la-chevron-right:before { content: "\f186"; } +.la-chevron-up:before { content: "\f187"; } +.la-child:before { content: "\f188"; } +.la-chrome:before { content: "\f189"; } +.la-circle:before { content: "\f18a"; } +.la-circle-o:before { content: "\f18b"; } +.la-circle-o-notch:before { content: "\f18c"; } +.la-circle-thin:before { content: "\f18d"; } +.la-clipboard:before { content: "\f18e"; } +.la-clock-o:before { content: "\f18f"; } +.la-clone:before { content: "\f190"; } +.la-close:before { content: "\f191"; } +.la-cloud:before { content: "\f192"; } +.la-cloud-download:before { content: "\f193"; } +.la-cloud-upload:before { content: "\f194"; } +.la-cny:before { content: "\f195"; } +.la-code:before { content: "\f196"; } +.la-code-fork:before { content: "\f197"; } +.la-codepen:before { content: "\f198"; } +.la-coffee:before { content: "\f199"; } +.la-cog:before { content: "\f19a"; } +.la-cogs:before { content: "\f19b"; } +.la-columns:before { content: "\f19c"; } +.la-comment:before { content: "\f19d"; } +.la-comment-o:before { content: "\f19e"; } +.la-commenting:before { content: "\f19f"; } +.la-commenting-o:before { content: "\f1a0"; } +.la-comments:before { content: "\f1a1"; } +.la-comments-o:before { content: "\f1a2"; } +.la-compass:before { content: "\f1a3"; } +.la-compress:before { content: "\f1a4"; } +.la-connectdevelop:before { content: "\f1a5"; } +.la-contao:before { content: "\f1a6"; } +.la-copy:before { content: "\f1a7"; } +.la-copyright:before { content: "\f1a8"; } +.la-creative-commons:before { content: "\f1a9"; } +.la-credit-card:before { content: "\f1aa"; } +.la-crop:before { content: "\f1ab"; } +.la-crosshairs:before { content: "\f1ac"; } +.la-css3:before { content: "\f1ad"; } +.la-cube:before { content: "\f1ae"; } +.la-cubes:before { content: "\f1af"; } +.la-cut:before { content: "\f1b0"; } +.la-cutlery:before { content: "\f1b1"; } +.la-dashboard:before { content: "\f1b2"; } +.la-dashcube:before { content: "\f1b3"; } +.la-database:before { content: "\f1b4"; } +.la-dedent:before { content: "\f1b5"; } +.la-delicious:before { content: "\f1b6"; } +.la-desktop:before { content: "\f1b7"; } +.la-deviantart:before { content: "\f1b8"; } +.la-diamond:before { content: "\f1b9"; } +.la-digg:before { content: "\f1ba"; } +.la-dollar:before { content: "\f1bb"; } +.la-dot-circle-o:before { content: "\f1bc"; } +.la-download:before { content: "\f1bd"; } +.la-dribbble:before { content: "\f1be"; } +.la-dropbox:before { content: "\f1bf"; } +.la-drupal:before { content: "\f1c0"; } +.la-edit:before { content: "\f1c1"; } +.la-eject:before { content: "\f1c2"; } +.la-ellipsis-h:before { content: "\f1c3"; } +.la-ellipsis-v:before { content: "\f1c4"; } +.la-empire:before, .la-ge:before { content: "\f1c5"; } +.la-envelope:before { content: "\f1c6"; } +.la-envelope-o:before { content: "\f1c7"; } +.la-envelope-square:before { content: "\f1c8"; } +.la-eraser:before { content: "\f1c9"; } +.la-eur:before { content: "\f1ca"; } +.la-euro:before { content: "\f1cb"; } +.la-exchange:before { content: "\f1cc"; } +.la-exclamation:before { content: "\f1cd"; } +.la-exclamation-circle:before { content: "\f1ce"; } +.la-exclamation-triangle:before { content: "\f1cf"; } +.la-expand:before { content: "\f1d0"; } +.la-expeditedssl:before { content: "\f1d1"; } +.la-external-link:before { content: "\f1d2"; } +.la-external-link-square:before { content: "\f1d3"; } +.la-eye:before { content: "\f1d4"; } +.la-eye-slash:before { content: "\f1d5"; } +.la-eyedropper:before { content: "\f1d6"; } +.la-facebook:before, .la-facebook-f:before { content: "\f1d7"; } +.la-facebook-official:before { content: "\f1d8"; } +.la-facebook-square:before { content: "\f1d9"; } +.la-fast-backward:before { content: "\f1da"; } +.la-fast-forward:before { content: "\f1db"; } +.la-fax:before { content: "\f1dc"; } +.la-female:before { content: "\f1dd"; } +.la-fighter-jet:before { content: "\f1de"; } +.la-file:before { content: "\f1df"; } +.la-file-archive-o:before { content: "\f1e0"; } +.la-file-audio-o:before { content: "\f1e1"; } +.la-file-code-o:before { content: "\f1e2"; } +.la-file-excel-o:before { content: "\f1e3"; } +.la-file-image-o:before { content: "\f1e4"; } +.la-file-movie-o:before { content: "\f1e5"; } +.la-file-o:before { content: "\f1e6"; } +.la-file-pdf-o:before { content: "\f1e7"; } +.la-file-photo-o:before { content: "\f1e8"; } +.la-file-picture-o:before { content: "\f1e9"; } +.la-file-powerpoint-o:before { content: "\f1ea"; } +.la-file-sound-o:before { content: "\f1eb"; } +.la-file-text:before { content: "\f1ec"; } +.la-file-text-o:before { content: "\f1ed"; } +.la-file-video-o:before { content: "\f1ee"; } +.la-file-word-o:before { content: "\f1ef"; } +.la-file-zip-o:before { content: "\f1f0"; } +.la-files-o:before { content: "\f1f1"; } +.la-film:before { content: "\f1f2"; } +.la-filter:before { content: "\f1f3"; } +.la-fire:before { content: "\f1f4"; } +.la-fire-extinguisher:before { content: "\f1f5"; } +.la-firefox:before { content: "\f1f6"; } +.la-flag:before { content: "\f1f7"; } +.la-flag-checkered:before { content: "\f1f8"; } +.la-flag-o:before { content: "\f1f9"; } +.la-flash:before { content: "\f1fa"; } +.la-flask:before { content: "\f1fb"; } +.la-flickr:before { content: "\f1fc"; } +.la-floppy-o:before { content: "\f1fd"; } +.la-folder:before { content: "\f1fe"; } +.la-folder-o:before { content: "\f1ff"; } +.la-folder-open:before { content: "\f200"; } +.la-folder-open-o:before { content: "\f201"; } +.la-font:before { content: "\f202"; } +.la-fonticons:before { content: "\f203"; } +.la-forumbee:before { content: "\f204"; } +.la-forward:before { content: "\f205"; } +.la-foursquare:before { content: "\f206"; } +.la-frown-o:before { content: "\f207"; } +.la-futbol-o:before, .la-soccer-ball-o:before { content: "\f208"; } +.la-gamepad:before { content: "\f209"; } +.la-gavel:before { content: "\f20a"; } +.la-gbp:before { content: "\f20b"; } +.la-gear:before { content: "\f20c"; } +.la-gears:before { content: "\f20d"; } +.la-genderless:before { content: "\f20e"; } +.la-get-pocket:before { content: "\f20f"; } +.la-gg:before { content: "\f210"; } +.la-gg-circle:before { content: "\f211"; } +.la-gift:before { content: "\f212"; } +.la-git:before { content: "\f213"; } +.la-git-square:before { content: "\f214"; } +.la-github:before { content: "\f215"; } +.la-github-alt:before { content: "\f216"; } +.la-github-square:before { content: "\f217"; } +.la-glass:before { content: "\f218"; } +.la-globe:before { content: "\f219"; } +.la-google:before { content: "\f21a"; } +.la-google-plus:before { content: "\f21b"; } +.la-google-plus-square:before { content: "\f21c"; } +.la-google-wallet:before { content: "\f21d"; } +.la-graduation-cap:before { content: "\f21e"; } +.la-gratipay:before, .la-gittip:before { content: "\f21f"; } +.la-group:before { content: "\f220"; } +.la-h-square:before { content: "\f221"; } +.la-hacker-news:before { content: "\f222"; } +.la-hand-grab-o:before { content: "\f223"; } +.la-hand-lizard-o:before { content: "\f224"; } +.la-hand-o-down:before { content: "\f225"; } +.la-hand-o-left:before { content: "\f226"; } +.la-hand-o-right:before { content: "\f227"; } +.la-hand-o-up:before { content: "\f228"; } +.la-hand-paper-o:before { content: "\f229"; } +.la-hand-peace-o:before { content: "\f22a"; } +.la-hand-pointer-o:before { content: "\f22b"; } +.la-hand-rock-o:before { content: "\f22c"; } +.la-hand-scissors-o:before { content: "\f22d"; } +.la-hand-spock-o:before { content: "\f22e"; } +.la-hand-stop-o:before { content: "\f22f"; } +.la-hdd-o:before { content: "\f230"; } +.la-header:before { content: "\f231"; } +.la-headphones:before { content: "\f232"; } +.la-heart:before { content: "\f233"; } +.la-heart-o:before { content: "\f234"; } +.la-heartbeat:before { content: "\f235"; } +.la-history:before { content: "\f236"; } +.la-home:before { content: "\f237"; } +.la-hospital-o:before { content: "\f238"; } +.la-hotel:before { content: "\f239"; } +.la-hourglass:before { content: "\f23a"; } +.la-hourglass-1:before { content: "\f23b"; } +.la-hourglass-2:before { content: "\f23c"; } +.la-hourglass-3:before { content: "\f23d"; } +.la-hourglass-end:before { content: "\f23e"; } +.la-hourglass-half:before { content: "\f23f"; } +.la-hourglass-o:before { content: "\f240"; } +.la-hourglass-start:before { content: "\f241"; } +.la-houzz:before { content: "\f242"; } +.la-html5:before { content: "\f243"; } +.la-i-cursor:before { content: "\f244"; } +.la-ils:before { content: "\f245"; } +.la-image:before { content: "\f246"; } +.la-inbox:before { content: "\f247"; } +.la-indent:before { content: "\f248"; } +.la-industry:before { content: "\f249"; } +.la-info:before { content: "\f24a"; } +.la-info-circle:before { content: "\f24b"; } +.la-inr:before { content: "\f24c"; } +.la-instagram:before { content: "\f24d"; } +.la-institution:before { content: "\f24e"; } +.la-internet-explorer:before { content: "\f24f"; } +.la-ioxhost:before { content: "\f250"; } +.la-italic:before { content: "\f251"; } +.la-joomla:before { content: "\f252"; } +.la-jpy:before { content: "\f253"; } +.la-jsfiddle:before { content: "\f254"; } +.la-key:before { content: "\f255"; } +.la-keyboard-o:before { content: "\f256"; } +.la-krw:before { content: "\f257"; } +.la-language:before { content: "\f258"; } +.la-laptop:before { content: "\f259"; } +.la-lastfm:before { content: "\f25a"; } +.la-lastfm-square:before { content: "\f25b"; } +.la-leaf:before { content: "\f25c"; } +.la-leanpub:before { content: "\f25d"; } +.la-legal:before { content: "\f25e"; } +.la-lemon-o:before { content: "\f25f"; } +.la-level-down:before { content: "\f260"; } +.la-level-up:before { content: "\f261"; } +.la-life-bouy:before { content: "\f262"; } +.la-life-buoy:before { content: "\f263"; } +.la-life-ring:before, .la-support:before { content: "\f264"; } +.la-life-saver:before { content: "\f265"; } +.la-lightbulb-o:before { content: "\f266"; } +.la-line-chart:before { content: "\f267"; } +.la-link:before { content: "\f268"; } +.la-linkedin:before { content: "\f269"; } +.la-linkedin-square:before { content: "\f26a"; } +.la-linux:before { content: "\f26b"; } +.la-list:before { content: "\f26c"; } +.la-list-alt:before { content: "\f26d"; } +.la-list-ol:before { content: "\f26e"; } +.la-list-ul:before { content: "\f26f"; } +.la-location-arrow:before { content: "\f270"; } +.la-lock:before { content: "\f271"; } +.la-long-arrow-down:before { content: "\f272"; } +.la-long-arrow-left:before { content: "\f273"; } +.la-long-arrow-right:before { content: "\f274"; } +.la-long-arrow-up:before { content: "\f275"; } +.la-magic:before { content: "\f276"; } +.la-magnet:before { content: "\f277"; } +.la-mail-forward:before { content: "\f278"; } +.la-mail-reply:before { content: "\f279"; } +.la-mail-reply-all:before { content: "\f27a"; } +.la-male:before { content: "\f27b"; } +.la-map:before { content: "\f27c"; } +.la-map-marker:before { content: "\f27d"; } +.la-map-o:before { content: "\f27e"; } +.la-map-pin:before { content: "\f27f"; } +.la-map-signs:before { content: "\f280"; } +.la-mars:before { content: "\f281"; } +.la-mars-double:before { content: "\f282"; } +.la-mars-stroke:before { content: "\f283"; } +.la-mars-stroke-h:before { content: "\f284"; } +.la-mars-stroke-v:before { content: "\f285"; } +.la-maxcdn:before { content: "\f286"; } +.la-meanpath:before { content: "\f287"; } +.la-medium:before { content: "\f288"; } +.la-medkit:before { content: "\f289"; } +.la-meh-o:before { content: "\f28a"; } +.la-mercury:before { content: "\f28b"; } +.la-microphone:before { content: "\f28c"; } +.la-microphone-slash:before { content: "\f28d"; } +.la-minus:before { content: "\f28e"; } +.la-minus-circle:before { content: "\f28f"; } +.la-minus-square:before { content: "\f290"; } +.la-minus-square-o:before { content: "\f291"; } +.la-mobile:before { content: "\f292"; } +.la-mobile-phone:before { content: "\f293"; } +.la-money:before { content: "\f294"; } +.la-moon-o:before { content: "\f295"; } +.la-mortar-board:before { content: "\f296"; } +.la-motorcycle:before { content: "\f297"; } +.la-mouse-pointer:before { content: "\f298"; } +.la-music:before { content: "\f299"; } +.la-navicon:before { content: "\f29a"; } +.la-neuter:before { content: "\f29b"; } +.la-newspaper-o:before { content: "\f29c"; } +.la-object-group:before { content: "\f29d"; } +.la-object-ungroup:before { content: "\f29e"; } +.la-odnoklassniki:before { content: "\f29f"; } +.la-odnoklassniki-square:before { content: "\f2a0"; } +.la-opencart:before { content: "\f2a1"; } +.la-openid:before { content: "\f2a2"; } +.la-opera:before { content: "\f2a3"; } +.la-optin-monster:before { content: "\f2a4"; } +.la-outdent:before { content: "\f2a5"; } +.la-pagelines:before { content: "\f2a6"; } +.la-paint-brush:before { content: "\f2a7"; } +.la-paper-plane:before, .la-send:before { content: "\f2a8"; } +.la-paper-plane-o:before, .la-send-o:before { content: "\f2a9"; } +.la-paperclip:before { content: "\f2aa"; } +.la-paragraph:before { content: "\f2ab"; } +.la-paste:before { content: "\f2ac"; } +.la-pause:before { content: "\f2ad"; } +.la-paw:before { content: "\f2ae"; } +.la-paypal:before { content: "\f2af"; } +.la-pencil:before { content: "\f2b0"; } +.la-pencil-square:before { content: "\f2b1"; } +.la-pencil-square-o:before { content: "\f2b2"; } +.la-phone:before { content: "\f2b3"; } +.la-phone-square:before { content: "\f2b4"; } +.la-photo:before { content: "\f2b5"; } +.la-picture-o:before { content: "\f2b6"; } +.la-pie-chart:before { content: "\f2b7"; } +.la-pied-piper:before { content: "\f2b8"; } +.la-pied-piper-alt:before { content: "\f2b9"; } +.la-pinterest:before { content: "\f2ba"; } +.la-pinterest-p:before { content: "\f2bb"; } +.la-pinterest-square:before { content: "\f2bc"; } +.la-plane:before { content: "\f2bd"; } +.la-play:before { content: "\f2be"; } +.la-play-circle:before { content: "\f2bf"; } +.la-play-circle-o:before { content: "\f2c0"; } +.la-plug:before { content: "\f2c1"; } +.la-plus:before { content: "\f2c2"; } +.la-plus-circle:before { content: "\f2c3"; } +.la-plus-square:before { content: "\f2c4"; } +.la-plus-square-o:before { content: "\f2c5"; } +.la-power-off:before { content: "\f2c6"; } +.la-print:before { content: "\f2c7"; } +.la-puzzle-piece:before { content: "\f2c8"; } +.la-qq:before { content: "\f2c9"; } +.la-qrcode:before { content: "\f2ca"; } +.la-question:before { content: "\f2cb"; } +.la-question-circle:before { content: "\f2cc"; } +.la-quote-left:before { content: "\f2cd"; } +.la-quote-right:before { content: "\f2ce"; } +.la-ra:before { content: "\f2cf"; } +.la-random:before { content: "\f2d0"; } +.la-rebel:before { content: "\f2d1"; } +.la-recycle:before { content: "\f2d2"; } +.la-reddit:before { content: "\f2d3"; } +.la-reddit-square:before { content: "\f2d4"; } +.la-refresh:before { content: "\f2d5"; } +.la-registered:before { content: "\f2d6"; } +.la-renren:before { content: "\f2d7"; } +.la-reorder:before { content: "\f2d8"; } +.la-repeat:before { content: "\f2d9"; } +.la-reply:before { content: "\f2da"; } +.la-reply-all:before { content: "\f2db"; } +.la-retweet:before { content: "\f2dc"; } +.la-rmb:before { content: "\f2dd"; } +.la-road:before { content: "\f2de"; } +.la-rocket:before { content: "\f2df"; } +.la-rotate-left:before { content: "\f2e0"; } +.la-rotate-right:before { content: "\f2e1"; } +.la-rouble:before { content: "\f2e2"; } +.la-rss:before, .la-feed:before { content: "\f2e3"; } +.la-rss-square:before { content: "\f2e4"; } +.la-rub:before { content: "\f2e5"; } +.la-ruble:before { content: "\f2e6"; } +.la-rupee:before { content: "\f2e7"; } +.la-safari:before { content: "\f2e8"; } +.la-save:before { content: "\f2e9"; } +.la-scissors:before { content: "\f2ea"; } +.la-search:before { content: "\f2eb"; } +.la-search-minus:before { content: "\f2ec"; } +.la-search-plus:before { content: "\f2ed"; } +.la-sellsy:before { content: "\f2ee"; } +.la-server:before { content: "\f2ef"; } +.la-share:before { content: "\f2f0"; } +.la-share-alt:before { content: "\f2f1"; } +.la-share-alt-square:before { content: "\f2f2"; } +.la-share-square:before { content: "\f2f3"; } +.la-share-square-o:before { content: "\f2f4"; } +.la-shekel:before { content: "\f2f5"; } +.la-sheqel:before { content: "\f2f6"; } +.la-shield:before { content: "\f2f7"; } +.la-ship:before { content: "\f2f8"; } +.la-shirtsinbulk:before { content: "\f2f9"; } +.la-shopping-cart:before { content: "\f2fa"; } +.la-sign-in:before { content: "\f2fb"; } +.la-sign-out:before { content: "\f2fc"; } +.la-signal:before { content: "\f2fd"; } +.la-simplybuilt:before { content: "\f2fe"; } +.la-sitemap:before { content: "\f2ff"; } +.la-skyatlas:before { content: "\f300"; } +.la-skype:before { content: "\f301"; } +.la-slack:before { content: "\f302"; } +.la-sliders:before { content: "\f303"; } +.la-slideshare:before { content: "\f304"; } +.la-smile-o:before { content: "\f305"; } +.la-sort:before, .la-unsorted:before { content: "\f306"; } +.la-sort-alpha-asc:before { content: "\f307"; } +.la-sort-alpha-desc:before { content: "\f308"; } +.la-sort-amount-asc:before { content: "\f309"; } +.la-sort-amount-desc:before { content: "\f30a"; } +.la-sort-asc:before, .la-sort-up:before { content: "\f30b"; } +.la-sort-desc:before, .la-sort-down:before { content: "\f30c"; } +.la-sort-numeric-asc:before { content: "\f30d"; } +.la-sort-numeric-desc:before { content: "\f30e"; } +.la-soundcloud:before { content: "\f30f"; } +.la-space-shuttle:before { content: "\f310"; } +.la-spinner:before { content: "\f311"; } +.la-spoon:before { content: "\f312"; } +.la-spotify:before { content: "\f313"; } +.la-square:before { content: "\f314"; } +.la-square-o:before { content: "\f315"; } +.la-stack-exchange:before { content: "\f316"; } +.la-stack-overflow:before { content: "\f317"; } +.la-star:before { content: "\f318"; } +.la-star-half:before { content: "\f319"; } +.la-star-half-o:before, .la-star-half-full:before, .la-star-half-empty:before { content: "\f31a"; } +.la-star-o:before { content: "\f31b"; } +.la-steam:before { content: "\f31c"; } +.la-steam-square:before { content: "\f31d"; } +.la-step-backward:before { content: "\f31e"; } +.la-step-forward:before { content: "\f31f"; } +.la-stethoscope:before { content: "\f320"; } +.la-sticky-note:before { content: "\f321"; } +.la-sticky-note-o:before { content: "\f322"; } +.la-stop:before { content: "\f323"; } +.la-street-view:before { content: "\f324"; } +.la-strikethrough:before { content: "\f325"; } +.la-stumbleupon:before { content: "\f326"; } +.la-stumbleupon-circle:before { content: "\f327"; } +.la-subscript:before { content: "\f328"; } +.la-subway:before { content: "\f329"; } +.la-suitcase:before { content: "\f32a"; } +.la-sun-o:before { content: "\f32b"; } +.la-superscript:before { content: "\f32c"; } +.la-table:before { content: "\f32d"; } +.la-tablet:before { content: "\f32e"; } +.la-tachometer:before { content: "\f32f"; } +.la-tag:before { content: "\f330"; } +.la-tags:before { content: "\f331"; } +.la-tasks:before { content: "\f332"; } +.la-taxi:before { content: "\f333"; } +.la-television:before, .la-tv:before { content: "\f334"; } +.la-tencent-weibo:before { content: "\f335"; } +.la-terminal:before { content: "\f336"; } +.la-text-height:before { content: "\f337"; } +.la-text-width:before { content: "\f338"; } +.la-th:before { content: "\f339"; } +.la-th-large:before { content: "\f33a"; } +.la-th-list:before { content: "\f33b"; } +.la-thumb-tack:before { content: "\f33c"; } +.la-thumbs-down:before { content: "\f33d"; } +.la-thumbs-o-down:before { content: "\f33e"; } +.la-thumbs-o-up:before { content: "\f33f"; } +.la-thumbs-up:before { content: "\f340"; } +.la-ticket:before { content: "\f341"; } +.la-times:before, .la-remove:before { content: "\f342"; } +.la-times-circle:before { content: "\f343"; } +.la-times-circle-o:before { content: "\f344"; } +.la-tint:before { content: "\f345"; } +.la-toggle-off:before { content: "\f346"; } +.la-toggle-on:before { content: "\f347"; } +.la-trademark:before { content: "\f348"; } +.la-train:before { content: "\f349"; } +.la-transgender:before, .la-intersex:before { content: "\f34a"; } +.la-transgender-alt:before { content: "\f34b"; } +.la-trash:before { content: "\f34c"; } +.la-trash-o:before { content: "\f34d"; } +.la-tree:before { content: "\f34e"; } +.la-trello:before { content: "\f34f"; } +.la-tripadvisor:before { content: "\f350"; } +.la-trophy:before { content: "\f351"; } +.la-truck:before { content: "\f352"; } +.la-try:before { content: "\f353"; } +.la-tty:before { content: "\f354"; } +.la-tumblr:before { content: "\f355"; } +.la-tumblr-square:before { content: "\f356"; } +.la-turkish-lira:before { content: "\f357"; } +.la-twitch:before { content: "\f358"; } +.la-twitter:before { content: "\f359"; } +.la-twitter-square:before { content: "\f35a"; } +.la-umbrella:before { content: "\f35b"; } +.la-underline:before { content: "\f35c"; } +.la-undo:before { content: "\f35d"; } +.la-university:before { content: "\f35e"; } +.la-unlink:before { content: "\f35f"; } +.la-unlock:before { content: "\f360"; } +.la-unlock-alt:before { content: "\f361"; } +.la-upload:before { content: "\f362"; } +.la-usd:before { content: "\f363"; } +.la-user:before { content: "\f364"; } +.la-user-md:before { content: "\f365"; } +.la-user-plus:before { content: "\f366"; } +.la-user-secret:before { content: "\f367"; } +.la-user-times:before { content: "\f368"; } +.la-users:before { content: "\f369"; } +.la-venus:before { content: "\f36a"; } +.la-venus-double:before { content: "\f36b"; } +.la-venus-mars:before { content: "\f36c"; } +.la-viacoin:before { content: "\f36d"; } +.la-video-camera:before { content: "\f36e"; } +.la-vimeo:before { content: "\f36f"; } +.la-vimeo-square:before { content: "\f370"; } +.la-vine:before { content: "\f371"; } +.la-vk:before { content: "\f372"; } +.la-volume-down:before { content: "\f373"; } +.la-volume-off:before { content: "\f374"; } +.la-volume-up:before { content: "\f375"; } +.la-warning:before { content: "\f376"; } +.la-wechat:before { content: "\f377"; } +.la-weibo:before { content: "\f378"; } +.la-weixin:before { content: "\f379"; } +.la-whatsapp:before { content: "\f37a"; } +.la-wheelchair:before { content: "\f37b"; } +.la-wifi:before { content: "\f37c"; } +.la-wikipedia-w:before { content: "\f37d"; } +.la-windows:before { content: "\f37e"; } +.la-won:before { content: "\f37f"; } +.la-wordpress:before { content: "\f380"; } +.la-wrench:before { content: "\f381"; } +.la-xing:before { content: "\f382"; } +.la-xing-square:before { content: "\f383"; } +.la-y-combinator:before { content: "\f384"; } +.la-y-combinator-square:before { content: "\f385"; } +.la-yahoo:before { content: "\f386"; } +.la-yc:before { content: "\f387"; } +.la-yc-square:before { content: "\f388"; } +.la-yelp:before { content: "\f389"; } +.la-yen:before { content: "\f38a"; } +.la-youtube:before { content: "\f38b"; } +.la-youtube-play:before { content: "\f38c"; } +.la-youtube-square:before { content: "\f38d"; } \ No newline at end of file diff --git a/src/assets/plugins/line-awesome/fonts/line-awesome.eot b/src/assets/plugins/line-awesome/fonts/line-awesome.eot new file mode 100644 index 0000000..fde50df Binary files /dev/null and b/src/assets/plugins/line-awesome/fonts/line-awesome.eot differ diff --git a/src/assets/plugins/line-awesome/fonts/line-awesome.svg b/src/assets/plugins/line-awesome/fonts/line-awesome.svg new file mode 100644 index 0000000..e3ab5fd --- /dev/null +++ b/src/assets/plugins/line-awesome/fonts/line-awesome.svg @@ -0,0 +1,2628 @@ + + + + + +Created by FontForge 20120731 at Sun Jan 22 13:00:30 2017 + By icons8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/plugins/line-awesome/fonts/line-awesome.ttf b/src/assets/plugins/line-awesome/fonts/line-awesome.ttf new file mode 100644 index 0000000..8f99967 Binary files /dev/null and b/src/assets/plugins/line-awesome/fonts/line-awesome.ttf differ diff --git a/src/assets/plugins/line-awesome/fonts/line-awesome.woff b/src/assets/plugins/line-awesome/fonts/line-awesome.woff new file mode 100644 index 0000000..0b3db49 Binary files /dev/null and b/src/assets/plugins/line-awesome/fonts/line-awesome.woff differ diff --git a/src/assets/plugins/line-awesome/fonts/line-awesome.woff2 b/src/assets/plugins/line-awesome/fonts/line-awesome.woff2 new file mode 100644 index 0000000..82810e7 Binary files /dev/null and b/src/assets/plugins/line-awesome/fonts/line-awesome.woff2 differ diff --git a/src/assets/plugins/mapplic/hammer.min.js b/src/assets/plugins/mapplic/hammer.min.js new file mode 100644 index 0000000..edadee1 --- /dev/null +++ b/src/assets/plugins/mapplic/hammer.min.js @@ -0,0 +1,7 @@ +/*! Hammer.JS - v2.0.8 - 2016-04-23 + * http://hammerjs.github.io/ + * + * Copyright (c) 2016 Jorik Tangelder; + * Licensed under the MIT license */ +!function(a,b,c,d){"use strict";function e(a,b,c){return setTimeout(j(a,c),b)}function f(a,b,c){return Array.isArray(a)?(g(a,c[b],c),!0):!1}function g(a,b,c){var e;if(a)if(a.forEach)a.forEach(b,c);else if(a.length!==d)for(e=0;e\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",f=a.console&&(a.console.warn||a.console.log);return f&&f.call(a.console,e,d),b.apply(this,arguments)}}function i(a,b,c){var d,e=b.prototype;d=a.prototype=Object.create(e),d.constructor=a,d._super=e,c&&la(d,c)}function j(a,b){return function(){return a.apply(b,arguments)}}function k(a,b){return typeof a==oa?a.apply(b?b[0]||d:d,b):a}function l(a,b){return a===d?b:a}function m(a,b,c){g(q(b),function(b){a.addEventListener(b,c,!1)})}function n(a,b,c){g(q(b),function(b){a.removeEventListener(b,c,!1)})}function o(a,b){for(;a;){if(a==b)return!0;a=a.parentNode}return!1}function p(a,b){return a.indexOf(b)>-1}function q(a){return a.trim().split(/\s+/g)}function r(a,b,c){if(a.indexOf&&!c)return a.indexOf(b);for(var d=0;dc[b]}):d.sort()),d}function u(a,b){for(var c,e,f=b[0].toUpperCase()+b.slice(1),g=0;g1&&!c.firstMultiple?c.firstMultiple=D(b):1===e&&(c.firstMultiple=!1);var f=c.firstInput,g=c.firstMultiple,h=g?g.center:f.center,i=b.center=E(d);b.timeStamp=ra(),b.deltaTime=b.timeStamp-f.timeStamp,b.angle=I(h,i),b.distance=H(h,i),B(c,b),b.offsetDirection=G(b.deltaX,b.deltaY);var j=F(b.deltaTime,b.deltaX,b.deltaY);b.overallVelocityX=j.x,b.overallVelocityY=j.y,b.overallVelocity=qa(j.x)>qa(j.y)?j.x:j.y,b.scale=g?K(g.pointers,d):1,b.rotation=g?J(g.pointers,d):0,b.maxPointers=c.prevInput?b.pointers.length>c.prevInput.maxPointers?b.pointers.length:c.prevInput.maxPointers:b.pointers.length,C(c,b);var k=a.element;o(b.srcEvent.target,k)&&(k=b.srcEvent.target),b.target=k}function B(a,b){var c=b.center,d=a.offsetDelta||{},e=a.prevDelta||{},f=a.prevInput||{};b.eventType!==Ea&&f.eventType!==Ga||(e=a.prevDelta={x:f.deltaX||0,y:f.deltaY||0},d=a.offsetDelta={x:c.x,y:c.y}),b.deltaX=e.x+(c.x-d.x),b.deltaY=e.y+(c.y-d.y)}function C(a,b){var c,e,f,g,h=a.lastInterval||b,i=b.timeStamp-h.timeStamp;if(b.eventType!=Ha&&(i>Da||h.velocity===d)){var j=b.deltaX-h.deltaX,k=b.deltaY-h.deltaY,l=F(i,j,k);e=l.x,f=l.y,c=qa(l.x)>qa(l.y)?l.x:l.y,g=G(j,k),a.lastInterval=b}else c=h.velocity,e=h.velocityX,f=h.velocityY,g=h.direction;b.velocity=c,b.velocityX=e,b.velocityY=f,b.direction=g}function D(a){for(var b=[],c=0;ce;)c+=a[e].clientX,d+=a[e].clientY,e++;return{x:pa(c/b),y:pa(d/b)}}function F(a,b,c){return{x:b/a||0,y:c/a||0}}function G(a,b){return a===b?Ia:qa(a)>=qa(b)?0>a?Ja:Ka:0>b?La:Ma}function H(a,b,c){c||(c=Qa);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return Math.sqrt(d*d+e*e)}function I(a,b,c){c||(c=Qa);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return 180*Math.atan2(e,d)/Math.PI}function J(a,b){return I(b[1],b[0],Ra)+I(a[1],a[0],Ra)}function K(a,b){return H(b[0],b[1],Ra)/H(a[0],a[1],Ra)}function L(){this.evEl=Ta,this.evWin=Ua,this.pressed=!1,x.apply(this,arguments)}function M(){this.evEl=Xa,this.evWin=Ya,x.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function N(){this.evTarget=$a,this.evWin=_a,this.started=!1,x.apply(this,arguments)}function O(a,b){var c=s(a.touches),d=s(a.changedTouches);return b&(Ga|Ha)&&(c=t(c.concat(d),"identifier",!0)),[c,d]}function P(){this.evTarget=bb,this.targetIds={},x.apply(this,arguments)}function Q(a,b){var c=s(a.touches),d=this.targetIds;if(b&(Ea|Fa)&&1===c.length)return d[c[0].identifier]=!0,[c,c];var e,f,g=s(a.changedTouches),h=[],i=this.target;if(f=c.filter(function(a){return o(a.target,i)}),b===Ea)for(e=0;e-1&&d.splice(a,1)};setTimeout(e,cb)}}function U(a){for(var b=a.srcEvent.clientX,c=a.srcEvent.clientY,d=0;d=f&&db>=g)return!0}return!1}function V(a,b){this.manager=a,this.set(b)}function W(a){if(p(a,jb))return jb;var b=p(a,kb),c=p(a,lb);return b&&c?jb:b||c?b?kb:lb:p(a,ib)?ib:hb}function X(){if(!fb)return!1;var b={},c=a.CSS&&a.CSS.supports;return["auto","manipulation","pan-y","pan-x","pan-x pan-y","none"].forEach(function(d){b[d]=c?a.CSS.supports("touch-action",d):!0}),b}function Y(a){this.options=la({},this.defaults,a||{}),this.id=v(),this.manager=null,this.options.enable=l(this.options.enable,!0),this.state=nb,this.simultaneous={},this.requireFail=[]}function Z(a){return a&sb?"cancel":a&qb?"end":a&pb?"move":a&ob?"start":""}function $(a){return a==Ma?"down":a==La?"up":a==Ja?"left":a==Ka?"right":""}function _(a,b){var c=b.manager;return c?c.get(a):a}function aa(){Y.apply(this,arguments)}function ba(){aa.apply(this,arguments),this.pX=null,this.pY=null}function ca(){aa.apply(this,arguments)}function da(){Y.apply(this,arguments),this._timer=null,this._input=null}function ea(){aa.apply(this,arguments)}function fa(){aa.apply(this,arguments)}function ga(){Y.apply(this,arguments),this.pTime=!1,this.pCenter=!1,this._timer=null,this._input=null,this.count=0}function ha(a,b){return b=b||{},b.recognizers=l(b.recognizers,ha.defaults.preset),new ia(a,b)}function ia(a,b){this.options=la({},ha.defaults,b||{}),this.options.inputTarget=this.options.inputTarget||a,this.handlers={},this.session={},this.recognizers=[],this.oldCssProps={},this.element=a,this.input=y(this),this.touchAction=new V(this,this.options.touchAction),ja(this,!0),g(this.options.recognizers,function(a){var b=this.add(new a[0](a[1]));a[2]&&b.recognizeWith(a[2]),a[3]&&b.requireFailure(a[3])},this)}function ja(a,b){var c=a.element;if(c.style){var d;g(a.options.cssProps,function(e,f){d=u(c.style,f),b?(a.oldCssProps[d]=c.style[d],c.style[d]=e):c.style[d]=a.oldCssProps[d]||""}),b||(a.oldCssProps={})}}function ka(a,c){var d=b.createEvent("Event");d.initEvent(a,!0,!0),d.gesture=c,c.target.dispatchEvent(d)}var la,ma=["","webkit","Moz","MS","ms","o"],na=b.createElement("div"),oa="function",pa=Math.round,qa=Math.abs,ra=Date.now;la="function"!=typeof Object.assign?function(a){if(a===d||null===a)throw new TypeError("Cannot convert undefined or null to object");for(var b=Object(a),c=1;ch&&(b.push(a),h=b.length-1):e&(Ga|Ha)&&(c=!0),0>h||(b[h]=a,this.callback(this.manager,e,{pointers:b,changedPointers:[a],pointerType:f,srcEvent:a}),c&&b.splice(h,1))}});var Za={touchstart:Ea,touchmove:Fa,touchend:Ga,touchcancel:Ha},$a="touchstart",_a="touchstart touchmove touchend touchcancel";i(N,x,{handler:function(a){var b=Za[a.type];if(b===Ea&&(this.started=!0),this.started){var c=O.call(this,a,b);b&(Ga|Ha)&&c[0].length-c[1].length===0&&(this.started=!1),this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:za,srcEvent:a})}}});var ab={touchstart:Ea,touchmove:Fa,touchend:Ga,touchcancel:Ha},bb="touchstart touchmove touchend touchcancel";i(P,x,{handler:function(a){var b=ab[a.type],c=Q.call(this,a,b);c&&this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:za,srcEvent:a})}});var cb=2500,db=25;i(R,x,{handler:function(a,b,c){var d=c.pointerType==za,e=c.pointerType==Ba;if(!(e&&c.sourceCapabilities&&c.sourceCapabilities.firesTouchEvents)){if(d)S.call(this,b,c);else if(e&&U.call(this,c))return;this.callback(a,b,c)}},destroy:function(){this.touch.destroy(),this.mouse.destroy()}});var eb=u(na.style,"touchAction"),fb=eb!==d,gb="compute",hb="auto",ib="manipulation",jb="none",kb="pan-x",lb="pan-y",mb=X();V.prototype={set:function(a){a==gb&&(a=this.compute()),fb&&this.manager.element.style&&mb[a]&&(this.manager.element.style[eb]=a),this.actions=a.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var a=[];return g(this.manager.recognizers,function(b){k(b.options.enable,[b])&&(a=a.concat(b.getTouchAction()))}),W(a.join(" "))},preventDefaults:function(a){var b=a.srcEvent,c=a.offsetDirection;if(this.manager.session.prevented)return void b.preventDefault();var d=this.actions,e=p(d,jb)&&!mb[jb],f=p(d,lb)&&!mb[lb],g=p(d,kb)&&!mb[kb];if(e){var h=1===a.pointers.length,i=a.distance<2,j=a.deltaTime<250;if(h&&i&&j)return}return g&&f?void 0:e||f&&c&Na||g&&c&Oa?this.preventSrc(b):void 0},preventSrc:function(a){this.manager.session.prevented=!0,a.preventDefault()}};var nb=1,ob=2,pb=4,qb=8,rb=qb,sb=16,tb=32;Y.prototype={defaults:{},set:function(a){return la(this.options,a),this.manager&&this.manager.touchAction.update(),this},recognizeWith:function(a){if(f(a,"recognizeWith",this))return this;var b=this.simultaneous;return a=_(a,this),b[a.id]||(b[a.id]=a,a.recognizeWith(this)),this},dropRecognizeWith:function(a){return f(a,"dropRecognizeWith",this)?this:(a=_(a,this),delete this.simultaneous[a.id],this)},requireFailure:function(a){if(f(a,"requireFailure",this))return this;var b=this.requireFail;return a=_(a,this),-1===r(b,a)&&(b.push(a),a.requireFailure(this)),this},dropRequireFailure:function(a){if(f(a,"dropRequireFailure",this))return this;a=_(a,this);var b=r(this.requireFail,a);return b>-1&&this.requireFail.splice(b,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(a){return!!this.simultaneous[a.id]},emit:function(a){function b(b){c.manager.emit(b,a)}var c=this,d=this.state;qb>d&&b(c.options.event+Z(d)),b(c.options.event),a.additionalEvent&&b(a.additionalEvent),d>=qb&&b(c.options.event+Z(d))},tryEmit:function(a){return this.canEmit()?this.emit(a):void(this.state=tb)},canEmit:function(){for(var a=0;af?Ja:Ka,c=f!=this.pX,d=Math.abs(a.deltaX)):(e=0===g?Ia:0>g?La:Ma,c=g!=this.pY,d=Math.abs(a.deltaY))),a.direction=e,c&&d>b.threshold&&e&b.direction},attrTest:function(a){return aa.prototype.attrTest.call(this,a)&&(this.state&ob||!(this.state&ob)&&this.directionTest(a))},emit:function(a){this.pX=a.deltaX,this.pY=a.deltaY;var b=$(a.direction);b&&(a.additionalEvent=this.options.event+b),this._super.emit.call(this,a)}}),i(ca,aa,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[jb]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.scale-1)>this.options.threshold||this.state&ob)},emit:function(a){if(1!==a.scale){var b=a.scale<1?"in":"out";a.additionalEvent=this.options.event+b}this._super.emit.call(this,a)}}),i(da,Y,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return[hb]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distanceb.time;if(this._input=a,!d||!c||a.eventType&(Ga|Ha)&&!f)this.reset();else if(a.eventType&Ea)this.reset(),this._timer=e(function(){this.state=rb,this.tryEmit()},b.time,this);else if(a.eventType&Ga)return rb;return tb},reset:function(){clearTimeout(this._timer)},emit:function(a){this.state===rb&&(a&&a.eventType&Ga?this.manager.emit(this.options.event+"up",a):(this._input.timeStamp=ra(),this.manager.emit(this.options.event,this._input)))}}),i(ea,aa,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[jb]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.rotation)>this.options.threshold||this.state&ob)}}),i(fa,aa,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:Na|Oa,pointers:1},getTouchAction:function(){return ba.prototype.getTouchAction.call(this)},attrTest:function(a){var b,c=this.options.direction;return c&(Na|Oa)?b=a.overallVelocity:c&Na?b=a.overallVelocityX:c&Oa&&(b=a.overallVelocityY),this._super.attrTest.call(this,a)&&c&a.offsetDirection&&a.distance>this.options.threshold&&a.maxPointers==this.options.pointers&&qa(b)>this.options.velocity&&a.eventType&Ga},emit:function(a){var b=$(a.offsetDirection);b&&this.manager.emit(this.options.event+b,a),this.manager.emit(this.options.event,a)}}),i(ga,Y,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[ib]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distance",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/src/assets/plugins/mapplic/images/alpha20.png b/src/assets/plugins/mapplic/images/alpha20.png new file mode 100644 index 0000000..fa237d2 Binary files /dev/null and b/src/assets/plugins/mapplic/images/alpha20.png differ diff --git a/src/assets/plugins/mapplic/images/alpha50.png b/src/assets/plugins/mapplic/images/alpha50.png new file mode 100644 index 0000000..cd41cc4 Binary files /dev/null and b/src/assets/plugins/mapplic/images/alpha50.png differ diff --git a/src/assets/plugins/mapplic/images/arrow-down.png b/src/assets/plugins/mapplic/images/arrow-down.png new file mode 100644 index 0000000..5cc7e6d Binary files /dev/null and b/src/assets/plugins/mapplic/images/arrow-down.png differ diff --git a/src/assets/plugins/mapplic/images/arrow-down@2x.png b/src/assets/plugins/mapplic/images/arrow-down@2x.png new file mode 100644 index 0000000..07d9b79 Binary files /dev/null and b/src/assets/plugins/mapplic/images/arrow-down@2x.png differ diff --git a/src/assets/plugins/mapplic/images/arrow-up.png b/src/assets/plugins/mapplic/images/arrow-up.png new file mode 100644 index 0000000..7d5c721 Binary files /dev/null and b/src/assets/plugins/mapplic/images/arrow-up.png differ diff --git a/src/assets/plugins/mapplic/images/arrow-up@2x.png b/src/assets/plugins/mapplic/images/arrow-up@2x.png new file mode 100644 index 0000000..731479e Binary files /dev/null and b/src/assets/plugins/mapplic/images/arrow-up@2x.png differ diff --git a/src/assets/plugins/mapplic/images/closedhand.cur b/src/assets/plugins/mapplic/images/closedhand.cur new file mode 100644 index 0000000..41aaa62 Binary files /dev/null and b/src/assets/plugins/mapplic/images/closedhand.cur differ diff --git a/src/assets/plugins/mapplic/images/cross-light.png b/src/assets/plugins/mapplic/images/cross-light.png new file mode 100644 index 0000000..6a0fa88 Binary files /dev/null and b/src/assets/plugins/mapplic/images/cross-light.png differ diff --git a/src/assets/plugins/mapplic/images/cross-light@2x.png b/src/assets/plugins/mapplic/images/cross-light@2x.png new file mode 100644 index 0000000..9cef9e3 Binary files /dev/null and b/src/assets/plugins/mapplic/images/cross-light@2x.png differ diff --git a/src/assets/plugins/mapplic/images/cross.png b/src/assets/plugins/mapplic/images/cross.png new file mode 100644 index 0000000..e298d9d Binary files /dev/null and b/src/assets/plugins/mapplic/images/cross.png differ diff --git a/src/assets/plugins/mapplic/images/cross@2x.png b/src/assets/plugins/mapplic/images/cross@2x.png new file mode 100644 index 0000000..ed49788 Binary files /dev/null and b/src/assets/plugins/mapplic/images/cross@2x.png differ diff --git a/src/assets/plugins/mapplic/images/error-icon.png b/src/assets/plugins/mapplic/images/error-icon.png new file mode 100644 index 0000000..886b1e2 Binary files /dev/null and b/src/assets/plugins/mapplic/images/error-icon.png differ diff --git a/src/assets/plugins/mapplic/images/fullscreen-exit.png b/src/assets/plugins/mapplic/images/fullscreen-exit.png new file mode 100644 index 0000000..b98d941 Binary files /dev/null and b/src/assets/plugins/mapplic/images/fullscreen-exit.png differ diff --git a/src/assets/plugins/mapplic/images/fullscreen.png b/src/assets/plugins/mapplic/images/fullscreen.png new file mode 100644 index 0000000..d86b036 Binary files /dev/null and b/src/assets/plugins/mapplic/images/fullscreen.png differ diff --git a/src/assets/plugins/mapplic/images/loader.gif b/src/assets/plugins/mapplic/images/loader.gif new file mode 100644 index 0000000..2e49210 Binary files /dev/null and b/src/assets/plugins/mapplic/images/loader.gif differ diff --git a/src/assets/plugins/mapplic/images/minus.png b/src/assets/plugins/mapplic/images/minus.png new file mode 100644 index 0000000..98dea0f Binary files /dev/null and b/src/assets/plugins/mapplic/images/minus.png differ diff --git a/src/assets/plugins/mapplic/images/minus@2x.png b/src/assets/plugins/mapplic/images/minus@2x.png new file mode 100644 index 0000000..ba50f8e Binary files /dev/null and b/src/assets/plugins/mapplic/images/minus@2x.png differ diff --git a/src/assets/plugins/mapplic/images/openhand.cur b/src/assets/plugins/mapplic/images/openhand.cur new file mode 100644 index 0000000..fba3ddc Binary files /dev/null and b/src/assets/plugins/mapplic/images/openhand.cur differ diff --git a/src/assets/plugins/mapplic/images/pin-blue.png b/src/assets/plugins/mapplic/images/pin-blue.png new file mode 100644 index 0000000..68e51f7 Binary files /dev/null and b/src/assets/plugins/mapplic/images/pin-blue.png differ diff --git a/src/assets/plugins/mapplic/images/pin-blue@2x.png b/src/assets/plugins/mapplic/images/pin-blue@2x.png new file mode 100644 index 0000000..705e544 Binary files /dev/null and b/src/assets/plugins/mapplic/images/pin-blue@2x.png differ diff --git a/src/assets/plugins/mapplic/images/pin-filled.png b/src/assets/plugins/mapplic/images/pin-filled.png new file mode 100644 index 0000000..f742575 Binary files /dev/null and b/src/assets/plugins/mapplic/images/pin-filled.png differ diff --git a/src/assets/plugins/mapplic/images/pin-green.png b/src/assets/plugins/mapplic/images/pin-green.png new file mode 100644 index 0000000..8d3651b Binary files /dev/null and b/src/assets/plugins/mapplic/images/pin-green.png differ diff --git a/src/assets/plugins/mapplic/images/pin-green@2x.png b/src/assets/plugins/mapplic/images/pin-green@2x.png new file mode 100644 index 0000000..703386b Binary files /dev/null and b/src/assets/plugins/mapplic/images/pin-green@2x.png differ diff --git a/src/assets/plugins/mapplic/images/pin-orange.png b/src/assets/plugins/mapplic/images/pin-orange.png new file mode 100644 index 0000000..19e3669 Binary files /dev/null and b/src/assets/plugins/mapplic/images/pin-orange.png differ diff --git a/src/assets/plugins/mapplic/images/pin-orange@2x.png b/src/assets/plugins/mapplic/images/pin-orange@2x.png new file mode 100644 index 0000000..b8fbe02 Binary files /dev/null and b/src/assets/plugins/mapplic/images/pin-orange@2x.png differ diff --git a/src/assets/plugins/mapplic/images/pin-purple.png b/src/assets/plugins/mapplic/images/pin-purple.png new file mode 100644 index 0000000..ffe0218 Binary files /dev/null and b/src/assets/plugins/mapplic/images/pin-purple.png differ diff --git a/src/assets/plugins/mapplic/images/pin-purple@2x.png b/src/assets/plugins/mapplic/images/pin-purple@2x.png new file mode 100644 index 0000000..981d1d9 Binary files /dev/null and b/src/assets/plugins/mapplic/images/pin-purple@2x.png differ diff --git a/src/assets/plugins/mapplic/images/pin-yellow.png b/src/assets/plugins/mapplic/images/pin-yellow.png new file mode 100644 index 0000000..e573ef4 Binary files /dev/null and b/src/assets/plugins/mapplic/images/pin-yellow.png differ diff --git a/src/assets/plugins/mapplic/images/pin-yellow@2x.png b/src/assets/plugins/mapplic/images/pin-yellow@2x.png new file mode 100644 index 0000000..a6a7c6c Binary files /dev/null and b/src/assets/plugins/mapplic/images/pin-yellow@2x.png differ diff --git a/src/assets/plugins/mapplic/images/pin.png b/src/assets/plugins/mapplic/images/pin.png new file mode 100644 index 0000000..b4194c3 Binary files /dev/null and b/src/assets/plugins/mapplic/images/pin.png differ diff --git a/src/assets/plugins/mapplic/images/pin@2x.png b/src/assets/plugins/mapplic/images/pin@2x.png new file mode 100644 index 0000000..37bc23f Binary files /dev/null and b/src/assets/plugins/mapplic/images/pin@2x.png differ diff --git a/src/assets/plugins/mapplic/images/plus.png b/src/assets/plugins/mapplic/images/plus.png new file mode 100644 index 0000000..9d0098d Binary files /dev/null and b/src/assets/plugins/mapplic/images/plus.png differ diff --git a/src/assets/plugins/mapplic/images/plus@2x.png b/src/assets/plugins/mapplic/images/plus@2x.png new file mode 100644 index 0000000..14db545 Binary files /dev/null and b/src/assets/plugins/mapplic/images/plus@2x.png differ diff --git a/src/assets/plugins/mapplic/images/reset-light.png b/src/assets/plugins/mapplic/images/reset-light.png new file mode 100644 index 0000000..de6259e Binary files /dev/null and b/src/assets/plugins/mapplic/images/reset-light.png differ diff --git a/src/assets/plugins/mapplic/images/reset.png b/src/assets/plugins/mapplic/images/reset.png new file mode 100644 index 0000000..da07d9a Binary files /dev/null and b/src/assets/plugins/mapplic/images/reset.png differ diff --git a/src/assets/plugins/mapplic/images/reset@2x.png b/src/assets/plugins/mapplic/images/reset@2x.png new file mode 100644 index 0000000..3f09b6a Binary files /dev/null and b/src/assets/plugins/mapplic/images/reset@2x.png differ diff --git a/src/assets/plugins/mapplic/images/viewer.png b/src/assets/plugins/mapplic/images/viewer.png new file mode 100644 index 0000000..d5ee3fc Binary files /dev/null and b/src/assets/plugins/mapplic/images/viewer.png differ diff --git a/src/assets/plugins/mapplic/images/viewer@2x.png b/src/assets/plugins/mapplic/images/viewer@2x.png new file mode 100644 index 0000000..807422e Binary files /dev/null and b/src/assets/plugins/mapplic/images/viewer@2x.png differ diff --git a/src/assets/plugins/mapplic/jquery.mousewheel.js b/src/assets/plugins/mapplic/jquery.mousewheel.js new file mode 100644 index 0000000..c2c94b4 --- /dev/null +++ b/src/assets/plugins/mapplic/jquery.mousewheel.js @@ -0,0 +1,221 @@ +/*! + * jQuery Mousewheel 3.1.13 + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + */ + +(function (factory) { + if ( typeof define === 'function' && define.amd ) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS style for Browserify + module.exports = factory; + } else { + // Browser globals + factory(jQuery); + } +}(function ($) { + + var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'], + toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ? + ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'], + slice = Array.prototype.slice, + nullLowestDeltaTimeout, lowestDelta; + + if ( $.event.fixHooks ) { + for ( var i = toFix.length; i; ) { + $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks; + } + } + + var special = $.event.special.mousewheel = { + version: '3.1.12', + + setup: function() { + if ( this.addEventListener ) { + for ( var i = toBind.length; i; ) { + this.addEventListener( toBind[--i], handler, false ); + } + } else { + this.onmousewheel = handler; + } + // Store the line height and page height for this particular element + $.data(this, 'mousewheel-line-height', special.getLineHeight(this)); + $.data(this, 'mousewheel-page-height', special.getPageHeight(this)); + }, + + teardown: function() { + if ( this.removeEventListener ) { + for ( var i = toBind.length; i; ) { + this.removeEventListener( toBind[--i], handler, false ); + } + } else { + this.onmousewheel = null; + } + // Clean up the data we added to the element + $.removeData(this, 'mousewheel-line-height'); + $.removeData(this, 'mousewheel-page-height'); + }, + + getLineHeight: function(elem) { + var $elem = $(elem), + $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent'](); + if (!$parent.length) { + $parent = $('body'); + } + return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16; + }, + + getPageHeight: function(elem) { + return $(elem).height(); + }, + + settings: { + adjustOldDeltas: true, // see shouldAdjustOldDeltas() below + normalizeOffset: true // calls getBoundingClientRect for each event + } + }; + + $.fn.extend({ + mousewheel: function(fn) { + return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel'); + }, + + unmousewheel: function(fn) { + return this.unbind('mousewheel', fn); + } + }); + + + function handler(event) { + var orgEvent = event || window.event, + args = slice.call(arguments, 1), + delta = 0, + deltaX = 0, + deltaY = 0, + absDelta = 0, + offsetX = 0, + offsetY = 0; + event = $.event.fix(orgEvent); + event.type = 'mousewheel'; + + // Old school scrollwheel delta + if ( 'detail' in orgEvent ) { deltaY = orgEvent.detail * -1; } + if ( 'wheelDelta' in orgEvent ) { deltaY = orgEvent.wheelDelta; } + if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY; } + if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; } + + // Firefox < 17 horizontal scrolling related to DOMMouseScroll event + if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) { + deltaX = deltaY * -1; + deltaY = 0; + } + + // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy + delta = deltaY === 0 ? deltaX : deltaY; + + // New school wheel delta (wheel event) + if ( 'deltaY' in orgEvent ) { + deltaY = orgEvent.deltaY * -1; + delta = deltaY; + } + if ( 'deltaX' in orgEvent ) { + deltaX = orgEvent.deltaX; + if ( deltaY === 0 ) { delta = deltaX * -1; } + } + + // No change actually happened, no reason to go any further + if ( deltaY === 0 && deltaX === 0 ) { return; } + + // Need to convert lines and pages to pixels if we aren't already in pixels + // There are three delta modes: + // * deltaMode 0 is by pixels, nothing to do + // * deltaMode 1 is by lines + // * deltaMode 2 is by pages + if ( orgEvent.deltaMode === 1 ) { + var lineHeight = $.data(this, 'mousewheel-line-height'); + delta *= lineHeight; + deltaY *= lineHeight; + deltaX *= lineHeight; + } else if ( orgEvent.deltaMode === 2 ) { + var pageHeight = $.data(this, 'mousewheel-page-height'); + delta *= pageHeight; + deltaY *= pageHeight; + deltaX *= pageHeight; + } + + // Store lowest absolute delta to normalize the delta values + absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) ); + + if ( !lowestDelta || absDelta < lowestDelta ) { + lowestDelta = absDelta; + + // Adjust older deltas if necessary + if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) { + lowestDelta /= 40; + } + } + + // Adjust older deltas if necessary + if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) { + // Divide all the things by 40! + delta /= 40; + deltaX /= 40; + deltaY /= 40; + } + + // Get a whole, normalized value for the deltas + delta = Math[ delta >= 1 ? 'floor' : 'ceil' ](delta / lowestDelta); + deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta); + deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta); + + // Normalise offsetX and offsetY properties + if ( special.settings.normalizeOffset && this.getBoundingClientRect ) { + var boundingRect = this.getBoundingClientRect(); + offsetX = event.clientX - boundingRect.left; + offsetY = event.clientY - boundingRect.top; + } + + // Add information to the event object + event.deltaX = deltaX; + event.deltaY = deltaY; + event.deltaFactor = lowestDelta; + event.offsetX = offsetX; + event.offsetY = offsetY; + // Go ahead and set deltaMode to 0 since we converted to pixels + // Although this is a little odd since we overwrite the deltaX/Y + // properties with normalized deltas. + event.deltaMode = 0; + + // Add event and delta to the front of the arguments + args.unshift(event, delta, deltaX, deltaY); + + // Clearout lowestDelta after sometime to better + // handle multiple device types that give different + // a different lowestDelta + // Ex: trackpad = 3 and mouse wheel = 120 + if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); } + nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200); + + return ($.event.dispatch || $.event.handle).apply(this, args); + } + + function nullLowestDelta() { + lowestDelta = null; + } + + function shouldAdjustOldDeltas(orgEvent, absDelta) { + // If this is an older event and the delta is divisable by 120, + // then we are assuming that the browser is treating this as an + // older mouse wheel event and that we should divide the deltas + // by 40 to try and get a more usable deltaFactor. + // Side note, this actually impacts the reported scroll distance + // in older browsers and can cause scrolling to be slower than native. + // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false. + return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0; + } + +})); \ No newline at end of file diff --git a/src/assets/plugins/mapplic/magnific-popup.js b/src/assets/plugins/mapplic/magnific-popup.js new file mode 100644 index 0000000..a8dca30 --- /dev/null +++ b/src/assets/plugins/mapplic/magnific-popup.js @@ -0,0 +1,3 @@ +// Magnific Popup v1.1.0 by Dmitry Semenov +// http://bit.ly/magnific-popup#build=inline+image+ajax+iframe+gallery+retina+imagezoom +(function(a){typeof define=="function"&&define.amd?define(["jquery"],a):typeof exports=="object"?a(require("jquery")):a(window.jQuery||window.Zepto)})(function(a){var b="Close",c="BeforeClose",d="AfterClose",e="BeforeAppend",f="MarkupParse",g="Open",h="Change",i="mfp",j="."+i,k="mfp-ready",l="mfp-removing",m="mfp-prevent-close",n,o=function(){},p=!!window.jQuery,q,r=a(window),s,t,u,v,w=function(a,b){n.ev.on(i+a+j,b)},x=function(b,c,d,e){var f=document.createElement("div");return f.className="mfp-"+b,d&&(f.innerHTML=d),e?c&&c.appendChild(f):(f=a(f),c&&f.appendTo(c)),f},y=function(b,c){n.ev.triggerHandler(i+b,c),n.st.callbacks&&(b=b.charAt(0).toLowerCase()+b.slice(1),n.st.callbacks[b]&&n.st.callbacks[b].apply(n,a.isArray(c)?c:[c]))},z=function(b){if(b!==v||!n.currTemplate.closeBtn)n.currTemplate.closeBtn=a(n.st.closeMarkup.replace("%title%",n.st.tClose)),v=b;return n.currTemplate.closeBtn},A=function(){a.magnificPopup.instance||(n=new o,n.init(),a.magnificPopup.instance=n)},B=function(){var a=document.createElement("p").style,b=["ms","O","Moz","Webkit"];if(a.transition!==undefined)return!0;while(b.length)if(b.pop()+"Transition"in a)return!0;return!1};o.prototype={constructor:o,init:function(){var b=navigator.appVersion;n.isLowIE=n.isIE8=document.all&&!document.addEventListener,n.isAndroid=/android/gi.test(b),n.isIOS=/iphone|ipad|ipod/gi.test(b),n.supportsTransition=B(),n.probablyMobile=n.isAndroid||n.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),s=a(document),n.popupsCache={}},open:function(b){var c;if(b.isObj===!1){n.items=b.items.toArray(),n.index=0;var d=b.items,e;for(c=0;c(a||r.height())},_setFocus:function(){(n.st.focus?n.content.find(n.st.focus).eq(0):n.wrap).focus()},_onFocusIn:function(b){if(b.target!==n.wrap[0]&&!a.contains(n.wrap[0],b.target))return n._setFocus(),!1},_parseMarkup:function(b,c,d){var e;d.data&&(c=a.extend(d.data,c)),y(f,[b,c,d]),a.each(c,function(c,d){if(d===undefined||d===!1)return!0;e=c.split("_");if(e.length>1){var f=b.find(j+"-"+e[0]);if(f.length>0){var g=e[1];g==="replaceWith"?f[0]!==d[0]&&f.replaceWith(d):g==="img"?f.is("img")?f.attr("src",d):f.replaceWith(a("").attr("src",d).attr("class",f.attr("class"))):f.attr(e[1],d)}}else b.find(j+"-"+c).html(d)})},_getScrollbarSize:function(){if(n.scrollbarSize===undefined){var a=document.createElement("div");a.style.cssText="width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;",document.body.appendChild(a),n.scrollbarSize=a.offsetWidth-a.clientWidth,document.body.removeChild(a)}return n.scrollbarSize}},a.magnificPopup={instance:null,proto:o.prototype,modules:[],open:function(b,c){return A(),b?b=a.extend(!0,{},b):b={},b.isObj=!0,b.index=c||0,this.instance.open(b)},close:function(){return a.magnificPopup.instance&&a.magnificPopup.instance.close()},registerModule:function(b,c){c.options&&(a.magnificPopup.defaults[b]=c.options),a.extend(this.proto,c.proto),this.modules.push(b)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:"",preloader:!0,focus:"",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,prependTo:null,fixedContentPos:"auto",fixedBgPos:"auto",overflowY:"auto",closeMarkup:'',tClose:"Close (Esc)",tLoading:"Loading...",autoFocusLast:!0}},a.fn.magnificPopup=function(b){A();var c=a(this);if(typeof b=="string")if(b==="open"){var d,e=p?c.data("magnificPopup"):c[0].magnificPopup,f=parseInt(arguments[1],10)||0;e.items?d=e.items[f]:(d=c,e.delegate&&(d=d.find(e.delegate)),d=d.eq(f)),n._openClick({mfpEl:d},c,e)}else n.isOpen&&n[b].apply(n,Array.prototype.slice.call(arguments,1));else b=a.extend(!0,{},b),p?c.data("magnificPopup",b):c[0].magnificPopup=b,n.addGroup(c,b);return c};var C="inline",D,E,F,G=function(){F&&(E.after(F.addClass(D)).detach(),F=null)};a.magnificPopup.registerModule(C,{options:{hiddenClass:"hide",markup:"",tNotFound:"Content not found"},proto:{initInline:function(){n.types.push(C),w(b+"."+C,function(){G()})},getInline:function(b,c){G();if(b.src){var d=n.st.inline,e=a(b.src);if(e.length){var f=e[0].parentNode;f&&f.tagName&&(E||(D=d.hiddenClass,E=x(D),D="mfp-"+D),F=e.after(E).detach().removeClass(D)),n.updateStatus("ready")}else n.updateStatus("error",d.tNotFound),e=a("
      ");return b.inlineElement=e,e}return n.updateStatus("ready"),n._parseMarkup(c,{},b),c}}});var H="ajax",I,J=function(){I&&a(document.body).removeClass(I)},K=function(){J(),n.req&&n.req.abort()};a.magnificPopup.registerModule(H,{options:{settings:null,cursor:"mfp-ajax-cur",tError:'The content could not be loaded.'},proto:{initAjax:function(){n.types.push(H),I=n.st.ajax.cursor,w(b+"."+H,K),w("BeforeChange."+H,K)},getAjax:function(b){I&&a(document.body).addClass(I),n.updateStatus("loading");var c=a.extend({url:b.src,success:function(c,d,e){var f={data:c,xhr:e};y("ParseAjax",f),n.appendContent(a(f.data),H),b.finished=!0,J(),n._setFocus(),setTimeout(function(){n.wrap.addClass(k)},16),n.updateStatus("ready"),y("AjaxContentAdded")},error:function(){J(),b.finished=b.loadError=!0,n.updateStatus("error",n.st.ajax.tError.replace("%url%",b.src))}},n.st.ajax.settings);return n.req=a.ajax(c),""}}});var L,M=function(b){if(b.data&&b.data.title!==undefined)return b.data.title;var c=n.st.image.titleSrc;if(c){if(a.isFunction(c))return c.call(n,b);if(b.el)return b.el.attr(c)||""}return""};a.magnificPopup.registerModule("image",{options:{markup:'
      ',cursor:"mfp-zoom-out-cur",titleSrc:"title",verticalFit:!0,tError:'The image could not be loaded.'},proto:{initImage:function(){var c=n.st.image,d=".image";n.types.push("image"),w(g+d,function(){n.currItem.type==="image"&&c.cursor&&a(document.body).addClass(c.cursor)}),w(b+d,function(){c.cursor&&a(document.body).removeClass(c.cursor),r.off("resize"+j)}),w("Resize"+d,n.resizeImage),n.isLowIE&&w("AfterChange",n.resizeImage)},resizeImage:function(){var a=n.currItem;if(!a||!a.img)return;if(n.st.image.verticalFit){var b=0;n.isLowIE&&(b=parseInt(a.img.css("padding-top"),10)+parseInt(a.img.css("padding-bottom"),10)),a.img.css("max-height",n.wH-b)}},_onImageHasSize:function(a){a.img&&(a.hasSize=!0,L&&clearInterval(L),a.isCheckingImgSize=!1,y("ImageHasSize",a),a.imgHidden&&(n.content&&n.content.removeClass("mfp-loading"),a.imgHidden=!1))},findImageSize:function(a){var b=0,c=a.img[0],d=function(e){L&&clearInterval(L),L=setInterval(function(){if(c.naturalWidth>0){n._onImageHasSize(a);return}b>200&&clearInterval(L),b++,b===3?d(10):b===40?d(50):b===100&&d(500)},e)};d(1)},getImage:function(b,c){var d=0,e=function(){b&&(b.img[0].complete?(b.img.off(".mfploader"),b===n.currItem&&(n._onImageHasSize(b),n.updateStatus("ready")),b.hasSize=!0,b.loaded=!0,y("ImageLoadComplete")):(d++,d<200?setTimeout(e,100):f()))},f=function(){b&&(b.img.off(".mfploader"),b===n.currItem&&(n._onImageHasSize(b),n.updateStatus("error",g.tError.replace("%url%",b.src))),b.hasSize=!0,b.loaded=!0,b.loadError=!0)},g=n.st.image,h=c.find(".mfp-img");if(h.length){var i=document.createElement("img");i.className="mfp-img",b.el&&b.el.find("img").length&&(i.alt=b.el.find("img").attr("alt")),b.img=a(i).on("load.mfploader",e).on("error.mfploader",f),i.src=b.src,h.is("img")&&(b.img=b.img.clone()),i=b.img[0],i.naturalWidth>0?b.hasSize=!0:i.width||(b.hasSize=!1)}return n._parseMarkup(c,{title:M(b),img_replaceWith:b.img},b),n.resizeImage(),b.hasSize?(L&&clearInterval(L),b.loadError?(c.addClass("mfp-loading"),n.updateStatus("error",g.tError.replace("%url%",b.src))):(c.removeClass("mfp-loading"),n.updateStatus("ready")),c):(n.updateStatus("loading"),b.loading=!0,b.hasSize||(b.imgHidden=!0,c.addClass("mfp-loading"),n.findImageSize(b)),c)}}});var N,O=function(){return N===undefined&&(N=document.createElement("p").style.MozTransform!==undefined),N};a.magnificPopup.registerModule("zoom",{options:{enabled:!1,easing:"ease-in-out",duration:300,opener:function(a){return a.is("img")?a:a.find("img")}},proto:{initZoom:function(){var a=n.st.zoom,d=".zoom",e;if(!a.enabled||!n.supportsTransition)return;var f=a.duration,g=function(b){var c=b.clone().removeAttr("style").removeAttr("class").addClass("mfp-animated-image"),d="all "+a.duration/1e3+"s "+a.easing,e={position:"fixed",zIndex:9999,left:0,top:0,"-webkit-backface-visibility":"hidden"},f="transition";return e["-webkit-"+f]=e["-moz-"+f]=e["-o-"+f]=e[f]=d,c.css(e),c},h=function(){n.content.css("visibility","visible")},i,j;w("BuildControls"+d,function(){if(n._allowZoom()){clearTimeout(i),n.content.css("visibility","hidden"),e=n._getItemToZoom();if(!e){h();return}j=g(e),j.css(n._getOffset()),n.wrap.append(j),i=setTimeout(function(){j.css(n._getOffset(!0)),i=setTimeout(function(){h(),setTimeout(function(){j.remove(),e=j=null,y("ZoomAnimationEnded")},16)},f)},16)}}),w(c+d,function(){if(n._allowZoom()){clearTimeout(i),n.st.removalDelay=f;if(!e){e=n._getItemToZoom();if(!e)return;j=g(e)}j.css(n._getOffset(!0)),n.wrap.append(j),n.content.css("visibility","hidden"),setTimeout(function(){j.css(n._getOffset())},16)}}),w(b+d,function(){n._allowZoom()&&(h(),j&&j.remove(),e=null)})},_allowZoom:function(){return n.currItem.type==="image"},_getItemToZoom:function(){return n.currItem.hasSize?n.currItem.img:!1},_getOffset:function(b){var c;b?c=n.currItem.img:c=n.st.zoom.opener(n.currItem.el||n.currItem);var d=c.offset(),e=parseInt(c.css("padding-top"),10),f=parseInt(c.css("padding-bottom"),10);d.top-=a(window).scrollTop()-e;var g={width:c.width(),height:(p?c.innerHeight():c[0].offsetHeight)-f-e};return O()?g["-moz-transform"]=g.transform="translate("+d.left+"px,"+d.top+"px)":(g.left=d.left,g.top=d.top),g}}});var P="iframe",Q="//about:blank",R=function(a){if(n.currTemplate[P]){var b=n.currTemplate[P].find("iframe");b.length&&(a||(b[0].src=Q),n.isIE8&&b.css("display",a?"block":"none"))}};a.magnificPopup.registerModule(P,{options:{markup:'
      ',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){n.types.push(P),w("BeforeChange",function(a,b,c){b!==c&&(b===P?R():c===P&&R(!0))}),w(b+"."+P,function(){R()})},getIframe:function(b,c){var d=b.src,e=n.st.iframe;a.each(e.patterns,function(){if(d.indexOf(this.index)>-1)return this.id&&(typeof this.id=="string"?d=d.substr(d.lastIndexOf(this.id)+this.id.length,d.length):d=this.id.call(this,d)),d=this.src.replace("%id%",d),!1});var f={};return e.srcAction&&(f[e.srcAction]=d),n._parseMarkup(c,f,b),n.updateStatus("ready"),c}}});var S=function(a){var b=n.items.length;return a>b-1?a-b:a<0?b+a:a},T=function(a,b,c){return a.replace(/%curr%/gi,b+1).replace(/%total%/gi,c)};a.magnificPopup.registerModule("gallery",{options:{enabled:!1,arrowMarkup:'',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var c=n.st.gallery,d=".mfp-gallery";n.direction=!0;if(!c||!c.enabled)return!1;u+=" mfp-gallery",w(g+d,function(){c.navigateByImgClick&&n.wrap.on("click"+d,".mfp-img",function(){if(n.items.length>1)return n.next(),!1}),s.on("keydown"+d,function(a){a.keyCode===37?n.prev():a.keyCode===39&&n.next()})}),w("UpdateStatus"+d,function(a,b){b.text&&(b.text=T(b.text,n.currItem.index,n.items.length))}),w(f+d,function(a,b,d,e){var f=n.items.length;d.counter=f>1?T(c.tCounter,e.index,f):""}),w("BuildControls"+d,function(){if(n.items.length>1&&c.arrows&&!n.arrowLeft){var b=c.arrowMarkup,d=n.arrowLeft=a(b.replace(/%title%/gi,c.tPrev).replace(/%dir%/gi,"left")).addClass(m),e=n.arrowRight=a(b.replace(/%title%/gi,c.tNext).replace(/%dir%/gi,"right")).addClass(m);d.click(function(){n.prev()}),e.click(function(){n.next()}),n.container.append(d.add(e))}}),w(h+d,function(){n._preloadTimeout&&clearTimeout(n._preloadTimeout),n._preloadTimeout=setTimeout(function(){n.preloadNearbyImages(),n._preloadTimeout=null},16)}),w(b+d,function(){s.off(d),n.wrap.off("click"+d),n.arrowRight=n.arrowLeft=null})},next:function(){n.direction=!0,n.index=S(n.index+1),n.updateItemHTML()},prev:function(){n.direction=!1,n.index=S(n.index-1),n.updateItemHTML()},goTo:function(a){n.direction=a>=n.index,n.index=a,n.updateItemHTML()},preloadNearbyImages:function(){var a=n.st.gallery.preload,b=Math.min(a[0],n.items.length),c=Math.min(a[1],n.items.length),d;for(d=1;d<=(n.direction?c:b);d++)n._preloadItem(n.index+d);for(d=1;d<=(n.direction?b:c);d++)n._preloadItem(n.index-d)},_preloadItem:function(b){b=S(b);if(n.items[b].preloaded)return;var c=n.items[b];c.parsed||(c=n.parseEl(b)),y("LazyLoad",c),c.type==="image"&&(c.img=a('').on("load.mfploader",function(){c.hasSize=!0}).on("error.mfploader",function(){c.hasSize=!0,c.loadError=!0,y("LazyLoadError",c)}).attr("src",c.src)),c.preloaded=!0}}});var U="retina";a.magnificPopup.registerModule(U,{options:{replaceSrc:function(a){return a.src.replace(/\.\w+$/,function(a){return"@2x"+a})},ratio:1},proto:{initRetina:function(){if(window.devicePixelRatio>1){var a=n.st.retina,b=a.ratio;b=isNaN(b)?b():b,b>1&&(w("ImageHasSize."+U,function(a,c){c.img.css({"max-width":c.img[0].naturalWidth/b,width:"100%"})}),w("ElementParse."+U,function(c,d){d.src=a.replaceSrc(d,b)}))}}}}),A()}) \ No newline at end of file diff --git a/src/assets/plugins/mapplic/mapplic-ie.css b/src/assets/plugins/mapplic/mapplic-ie.css new file mode 100644 index 0000000..8a57bc2 --- /dev/null +++ b/src/assets/plugins/mapplic/mapplic-ie.css @@ -0,0 +1,19 @@ +a { outline: none; } +a img { border: none; } + +.mapplic-coordinates { + background-color: #fff; +} + +.mapplic-minimap-overlay { + background-image: url(images/alpha50.png); +} + +.mapplic-minimap-active { + position: absolute; + /*clip: rect(0px,60px,40px,0px);*/ +} + +.mapplic-list-category > a span { + background-image: url(images/alpha20.png); +} \ No newline at end of file diff --git a/src/assets/plugins/mapplic/mapplic.css b/src/assets/plugins/mapplic/mapplic.css new file mode 100644 index 0000000..5d1766f --- /dev/null +++ b/src/assets/plugins/mapplic/mapplic.css @@ -0,0 +1,1039 @@ +/* + * Mapplic - Custom Interactive Map Plugin by @sekler + * Version 4.0 + * http://www.mapplic.com/ + */ + +.mapplic-element { + font-size: 0; + height: 420px; +} + +.mapplic-element input, +.mapplic-element button, +.mapplic-element a:hover, +.mapplic-element a:active, +.mapplic-element a:focus { + outline: none; +} + +/* Preloader & Error */ +.mapplic-element.mapplic-loading { background: url(images/loader.gif) no-repeat center; } +.mapplic-element.mapplic-error { background: url(images/error-icon.png) no-repeat center; } + +.mapplic-element > * { + opacity: 1; + transition: opacity 0.6s; +} + +.mapplic-element.mapplic-loading > * { + opacity: 0; +} + +/* Map container */ +.mapplic-container { + display: inline-block; + overflow: hidden; + position: relative; + width: 70%; + height: 100%; +} + +.mapplic-map { + position: absolute; + left: 0; + top: 0; + overflow: visible !important; +} + +/* Map layer */ +.mapplic-layer img { + width: 100%; +} + +/* IE Fix */ +.mapplic-layer { + width: 100%; + height: 100%; + position: absolute; +} + +.mapplic-map .mapplic-map-image { + position: absolute; + width: 100%; + height: 100%; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +/* IE Fix END */ + +.mapplic-map.mapplic-zoomable .mapplic-map-image { + cursor: url(images/openhand.cur), default; +} + +.mapplic-map.mapplic-zoomable.mapplic-dragging .mapplic-map-image { + cursor: url(images/closedhand.cur), move; +} + +/* Pin types */ +.mapplic-pin { + background-image: url(images/pin.png); + background-size: 18px 24px; + background-repeat: no-repeat; + background-position: center; + font-size: 0; + width: 18px; + height: 24px; + margin-top: -23px; + margin-left: -9px; + position: absolute; + -webkit-transition: background-color 0.2s, border-color 0.2s; + -moz-transition: background-color 0.2s, border-color 0.2s; + transition: background-color 0.2s, border-color 0.2s; +} + +/* New pin types */ +.mapplic-pin.pin-classic { + background-color: #f23543; + background-image: none; + border-color: #f23543; + border-radius: 10px; + line-height: 22px !important; + width: 20px; + height: 20px; + margin-top: -25px; + margin-left: -10px; +} + +.mapplic-pin.pin-classic:before { + border-style: solid; + border-width: 9px 8px 0 8px; + border-color: inherit; + border-right-color: transparent; + border-bottom-color: transparent; + border-left-color: transparent; + content: ''; + display: block; + position: absolute; + top: 16px; + left: 2px; +} + +.mapplic-pin.pin-marker { + background-color: #fdca2a; + background-image: none; + border-color: #fdca2a; + border-radius: 8px; + width: 16px; + height: 16px; + margin-top: -8px; + margin-left: -8px; +} + +.mapplic-pin.pin-marker:before { + border-color: inherit; + border-style: solid; + border-width: 6px; + border-radius: 16px; + content: ''; + display: block; + opacity: 0.4; + width: 16px; + height: 16px; + position: absolute; + left: -6px; + top: -6px; +} + +.mapplic-pin.pin-disk { + background-color: white !important; + background-image: none; + border-color: #f19819; + border-radius: 8px; + color: #333 !important; + width: 16px; + height: 16px; + margin-top: -8px; + margin-left: -8px; +} + +.mapplic-pin.pin-disk:before { + border-color: inherit; + border-style: solid; + border-width: 3px; + border-radius: 16px; + content: ''; + display: block; + width: 16px; + height: 16px; + position: absolute; + left: -3px; + top: -3px; +} + +.mapplic-pin.pin-ribbon { + background-color: #46b450; + background-image: none; + border-color: #46b450; + border-radius: 2px 2px 2px 0; + height: 16px; + min-width: 10px; + width: auto; + padding: 0 3px; + margin-top: -20px; + margin-left: -8px; +} + +.mapplic-pin.pin-ribbon:after { + border-style: solid; + border-width: 0 8px 4px 0; + border-color: transparent rgba(0, 0, 0, 0.5) transparent transparent; + content: ''; + display: block; + position: absolute; + top: 16px; + left: 0px; +} + +.mapplic-pin.pin-ribbon:before { + border-style: solid; + border-width: 0 8px 4px 0; + border-color: inherit; + border-top-color: transparent; + border-bottom-color: transparent; + border-left-color: transparent; + content: ''; + display: block; + position: absolute; + top: 16px; + left: 0px; +} + +.mapplic-pin.pin-dot { + background-color: transparent !important; + background-image: none; + border-color: #29afa1; + color: #333 !important; + height: 16px; + min-width: 10px; + width: auto; + padding: 0 3px; + margin-left: 4px; + margin-top: -8px; +} + +.mapplic-pin.pin-dot:before { + border-color: inherit; + border-style: solid; + border-width: 3px; + border-radius: 12px; + content: ''; + display: block; + width: 0px; + height: 0px; + position: absolute; + top: 5px; + left: -7px; +} + +.mapplic-pin.orange { background-image: url(images/pin-orange.png); } +.mapplic-pin.yellow { background-image: url(images/pin-yellow.png); } +.mapplic-pin.green { background-image: url(images/pin-green.png); } +.mapplic-pin.blue { background-image: url(images/pin-blue.png); } +.mapplic-pin.purple { background-image: url(images/pin-purple.png); } + +.mapplic-pin.circular { + background-image: none; + background-color: #fb7575; + border-radius: 6px; + box-shadow: 0 -2px 0 rgba(0, 0, 0, 0.1) inset; + width: 12px; + height: 12px; + margin-left: -6px; + margin-top: -6px; +} + +.mapplic-pin.circle { + background: none !important; + border: 2px solid #fb7575; + width: 8px; + height: 8px; + margin-left: -6px; + margin-top: -6px; +} + +.mapplic-pin.transparent { + background-image: none; + background-color: #795ecd; + border-radius: 10px; + width: 20px; + height: 20px; + margin-left: -10px; + margin-top: -10px; + opacity: 0.5 !important; +} + +.mapplic-pin.pin-label { + color: #fff; + font-size: 9px; + font-weight: 600; + text-align: center; + text-decoration: none; + line-height: 16px; +} + +.mapplic-pin.pin-label:visited { + color: #fff; +} + +.mapplic-pin.pin-md { + border-radius: 50%; + margin-left: -10px; + margin-top: -10px; + line-height: 20px; + width: 20px; + height: 20px; +} + +.mapplic-pin.pin-lg { + border-radius: 50%; + margin-left: -15px; + margin-top: -15px; + line-height: 30px; + width: 30px; + height: 30px; +} + +.mapplic-pin.pin-xl { + border-radius: 50%; + margin-left: -20px; + margin-top: -20px; + line-height: 40px; + width: 40px; + height: 40px; +} + +.mapplic-pin.pin-pulse:before { + content: ''; + border: 2px solid #888; + border-radius: 30px; + height: inherit; + width: inherit; + top: -2px; + left: -2px; + position: absolute; + animation: pulsate 1.8s ease-out; + animation-iteration-count: infinite; + animation-delay: 1s; + opacity: 0; + box-sizing: content-box; +} + +@-webkit-keyframes pulsate { + 0% {-webkit-transform: scale(1, 1); opacity: 0.0;} + 25% {opacity: 0.5; } + 50% {-webkit-transform: scale(1.6, 1.6); opacity: 0.0;} +} + +/* Minimap */ +.mapplic-minimap { + border: 1px solid rgba(0, 0, 0, 0.1); + position: absolute; + margin: 10px; + bottom: 0; + right: 0; + opacity: 0.5; + overflow: hidden; + -webkit-transition: opacity 0.6s; + -moz-transition: opacity 0.6s; + transition: opacity 0.6s; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.mapplic-minimap img { + width: 100%; +} + +.mapplic-minimap-overlay { + background-color: rgba(0, 0, 0, 0.4); + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; +} + +.mapplic-minimap .mapplic-minimap-active { + position: absolute; + opacity: 1; + top: 0; + left: 0; +} + +.mapplic-clip-transition { + -webkit-transition: clip 0.1s; + -moz-transition: clip 0.1s; + transition: clip 0.1s; +} + +.mapplic-minimap-background { + width: 140px !important; + -webkit-filter: blur(2px); +} + +/* Clear Button */ +.mapplic-clear-button { + background-color: #fff; + background-image: url(images/reset.png); + background-size: 16px 16px; + background-repeat: no-repeat; + background-position: center; + border: 1px solid #eee; + border-bottom: 1px solid #ddd; + border-radius: 2px; + margin: 10px; + width: 28px; + height: 28px; + position: absolute; + bottom: 0; + left: 0; +} + +.mapplic-clear-button:active { + background-color: #eee; +} + +/* Zoom Buttons */ +.mapplic-zoom-buttons { + margin: 10px; + position: absolute; + left: 0; + bottom: 40px; +} + +.mapplic-zoom-buttons a { + background-color: #fff; + background-repeat: no-repeat; + background-position: center; + border: 1px solid #eee; + border-bottom: 1px solid #ddd; + color: #fff !important; + display: block; + font-size: 14px; + font-weight: bold; + cursor: pointer; + text-align: center; + line-height: 24px; + width: 28px; + height: 28px; +} + +.mapplic-zoom-buttons a:active { + background-color: #f4f4f4; +} + +.mapplic-zoom-buttons a.mapplic-disabled { + background-color: #eee; + cursor: default; +} + +a.mapplic-zoomin-button { + background-image: url(images/plus.png); + background-size: 10px 10px; + border-radius: 2px 2px 0 0; +} + +a.mapplic-zoomout-button { + background-image: url(images/minus.png); + background-size: 10px 10px; + border-radius: 0 0 2px 2px; + border-top: none; +} + +/* Fullscreen */ +.mapplic-fullscreen { + background-color: rgba(255, 255, 255, 0.8); + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100% !important; + z-index: 1000; +} + +.mapplic-fullscreen-button { + background-color: #fff; + background-image: url(images/fullscreen.png); + background-repeat: no-repeat; + background-position: center; + border: 1px solid #eee; + border-bottom: 1px solid #ddd; + border-radius: 2px; + margin: 10px; + width: 28px; + height: 28px; + position: absolute; + top: 0; + left: 0; +} + +.mapplic-fullscreen .mapplic-fullscreen-button { + background-image: url(images/fullscreen-exit.png); +} + +.mapplic-fullscreen .mapplic-container { + width: 80%; +} + +.mapplic-fullscreen .mapplic-sidebar { + width: 20%; +} + +/* Levels */ +.mapplic-levels { + border-bottom: 1px solid #eee; + border-radius: 2px; + position: absolute; + top: 0; + right: 0; + margin: 10px; + overflow: hidden; +} + +.mapplic-levels > * { + display: block; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.mapplic-levels-select { + background-color: #fff; + border: none; + border-radius: 0; + color: #666; + margin: 0; + padding: 10px 6px; + margin-left: 20px; + font-size: 13px; + font-weight: 400; + outline: none; + -webkit-appearance: none; +} + +.mapplic-levels a { + background-color: #fff; + background-repeat: no-repeat; + background-position: center; + background-size: 8px 4px; + cursor: pointer; + height: 50%; + width: 20px; + position: absolute; +} + +.mapplic-levels a:active { + background-color: #f8f8f8; +} + +.mapplic-levels .mapplic-levels-up { + background-image: url(images/arrow-up.png); +} + +.mapplic-levels .mapplic-levels-down { + background-image: url(images/arrow-down.png); + bottom: 0; +} + +.mapplic-levels a.mapplic-disabled { + background-color: #eee; + cursor: default; +} + +/* Sidebar */ +.mapplic-sidebar { + width: 30%; + height: 100%; + float: left; + position: relative; +} + +/* Search */ +.mapplic-search-form { + background-color: #f8f8f8; + border-bottom: 1px solid #eee; + border-right: 1px solid #f4f4f4; + padding: 14px 12px; + margin: 0; + width: 100%; + position: absolute; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.mapplic-search-input { + background-image: url(images/viewer.png); + background-size: 17px 16px; + background-repeat: no-repeat; + background-position: 8px; + border: 2px solid #eee; + border-radius: 0; + font-size: 14px !important; + font-family: inherit; + line-height: 20px; + height: 38px; + margin: 0; + padding: 8px 32px; + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + + -webkit-transition: border-color 0.1s; + -moz-transition: border-color 0.1s; + transition: border-color 0.1s; +} + +.mapplic-search-input::-ms-clear {display: none; width:0; height:0;} + +.mapplic-search-input:focus { + border-color: #6ed8dd; +} + +.mapplic-search-clear { + background-image: url(images/cross.png); + background-size: 8px 8px; + background-repeat: no-repeat; + background-color: transparent; + background-position: center; + border: none; + cursor: pointer; + display: none; + position: absolute; + top: 14px; + right: 14px; + margin: 2px 0; + width: 34px; + height: 34px; +} + +.mapplic-not-found { + color: #bbb; + display: none; + font-size: 13px; + padding: 0 30px; + position: absolute; + text-align: center; + top: 100px; +} + +/* Sidebar list */ +.mapplic-list-container { + padding-top: 67px; + height: 100%; + overflow-y: auto; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.mapplic-list { + list-style: none; + padding: 0; + margin: 0; + overflow-y: auto; + height: 100%; +} + +.mapplic-list-container ol { + border-color: #eee; + list-style: none; + padding: 0; + margin: 0; +} + +.mapplic-list-container li { + border-color: inherit; + margin: 0 !important; +} + +.mapplic-list-category > a { + background-color: #888; + box-shadow: 0 -2px 0 rgba(0, 0, 0, 0.05) inset; + color: #fff !important; + display: block; + font-size: 14px; + line-height: 26px; + padding: 10px 12px; + text-decoration: none; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + box-sizing: border-box; +} + +.mapplic-list-category ol { + border-bottom: 2px solid #eee !important; +} + +.mapplic-list-thumbnail { + border-radius: 0px !important; + box-shadow: none !important; + float: left; + margin-right: 10px; + width: 50px; + max-height: 50px; +} + +.mapplic-list-category > a .mapplic-list-count { + background-color: rgba(0, 0, 0, 0.1); + border-radius: 2px; + float: right; + font-size: 12px; + font-weight: bold; + line-height: 20px; + margin-left: 10px; + margin-top: 4px; + padding: 0 6px; + text-align: center; + -webkit-transition: border-radius 0.2s; + -moz-transition: border-radius 0.2s; + transition: border-radius 0.2s; + +} + +.mapplic-list-location { + border-bottom: 1px solid #eee; + margin: 0 !important; +} + +.mapplic-list-location > a { + background-color: #fff; + border-left: 1px solid transparent; + display: block; + font-size: 14px; + padding: 10px; + text-decoration: none; + -webkit-transition: border 0.1s; + -moz-transition: border 0.1s; + transition: border 0.1s; +} + +.mapplic-list-location > a:after { + content: ''; + display:block; + clear:both; +} + +.mapplic-list-location > a:hover { + background-color: #f4fcfc; + border-left: 2px solid; + border-color: inherit; +} + +.mapplic-list-location h4 { + color: #242424; + font-size: 16px; + font-weight: normal; + line-height: 18px; + margin: 4px 0; + clear: none; +} + +.mapplic-list-location span { + color: #bbb; + font-size: 13px; + font-weight: normal; +} + +/* Tooltip */ +.mapplic-tooltip { + background-color: #fff; + box-shadow: 0 0 6px rgba(0, 0, 0, 0.2); + display: none; + max-width: 300px; + min-width: 120px; + margin-top: -76px; + padding: 16px; + position: absolute; + -webkit-transition: margin 0.1s; + -moz-transition: margin 0.1s; + transition: margin 0.1s; +} + +.mapplic-tooltip-title { + color: #333; + font-size: 18px; + font-weight: normal; + line-height: 18px; + margin: 0 12px 0 0 !important; +} + +.mapplic-hovertip { + min-width: 30px; + padding: 6px 14px; + pointer-events: none; +} + +.mapplic-hovertip .mapplic-tooltip-title { + margin: 0 !important; + font-size: 16px; + line-height: 24px; + text-align: center; +} + +.mapplic-tooltip-content { + max-height: 160px; + margin-right: 10px; + overflow-y: auto; +} + +.mapplic-tooltip p { + margin-top: 10px; + margin-bottom: 0; +} + +.mapplic-tooltip-thumbnail { + border-radius: 50% !important; + float: left; + width: 48px; + height: 48px; + margin-right: 12px; +} + +.mapplic-tooltip-description, +.mapplic-tooltip p { + color: #aaa; + font-size: 13px; + line-height: 20px; +} + +.mapplic-popup-link { + background-color: #6CB5F4; + border-radius: 0; + color: #fff !important; + float: right; + font-size: 14px; + line-height: 28px; + padding: 0 10px; + margin-top: 12px; + text-decoration: none; + -webkit-transition: background-color 0.2s; + -moz-transition: background-color 0.2s; + transition: background-color 0.2s; +} + +.mapplic-popup-link:hover { + background-color: #888; +} + +.mapplic-tooltip img { + max-width: 100%; +} + +.mapplic-tooltip-close { + background-image: url(images/cross.png); + background-position: center; + background-repeat: no-repeat; + background-size: 8px 8px; + background-color: transparent; + border: none; + cursor: pointer; + position: absolute; + right: 6px; + top: 6px; + padding: 8px; + width: 8px; + height: 8px; + opacity: 0.5; + -webkit-transition: opacity 0.2s; + -moz-transition: opacity 0.2s; + transition: opacity 0.2s; +} + +.mapplic-tooltip-close:hover { + opacity: 1.0; +} + +.mapplic-tooltip-triangle { + border-color: #fff transparent transparent transparent; + border-style: solid; + border-width: 8px 7px 0 7px; + width: 0; + height: 0; + position: absolute; + bottom: 0; + left: 50%; + margin-bottom: -8px; + margin-left: -7px; + -webkit-transition: left 0.1s; + -moz-transition: left 0.1s; + transition: left 0.1s; +} + +.mapplic-bottom .mapplic-tooltip-triangle { + border-color: transparent transparent #fff transparent; + border-width: 0 7px 8px 7px; + top: 0; + margin-top: -8px; +} + +/* Lightbox */ +.mapplic-lightbox-title { + color: #333; + margin-top: 0; + margin-bottom: 20px; +} + +.mapplic-lightbox { + background-color: #fff; + position: relative; + padding: 20px; + width: auto; + max-width: 500px; + margin: 20px auto; +} + +.mapplic-lightbox:after { + content: ''; + display:block; + clear:both; +} + +.mapplic-popup-image { + outline: none; +} + +/* Lightbox animation */ +.mfp-fade.mfp-bg { + opacity: 0; + -webkit-transition: all 0.15s ease-out; + -moz-transition: all 0.15s ease-out; + transition: all 0.15s ease-out; +} + +.mfp-fade.mfp-bg.mfp-ready { opacity: 0.8; } +.mfp-fade.mfp-bg.mfp-removing { opacity: 0; } + +.mfp-fade.mfp-wrap .mfp-content { + opacity: 0; + -webkit-transition: all 0.15s ease-out; + -moz-transition: all 0.15s ease-out; + transition: all 0.15s ease-out; +} + +.mfp-fade.mfp-wrap.mfp-ready .mfp-content { opacity: 1; } +.mfp-fade.mfp-wrap.mfp-removing .mfp-content { opacity: 0; } + +/* Developer tools */ +.mapplic-coordinates { + background-color: rgba(255, 255, 255, 0.9); + color: #333; + position: absolute; + margin: 10px; + margin-left: -80px; + padding: 4px 6px; + font-size: 14px; + top: 0; + left: 50%; + pointer-events: none; +} + +/* Responsive layout */ +@media all and (max-width: 667px) { + .mapplic-container, + .mapplic-sidebar { + width: 100% !important; + } + + .mapplic-tooltip { + max-width: 240px; + } + + .mapplic-minimap-background { + width: 100px !important; + } + + .mapplic-element { + height: auto !important; + } + + .mapplic-search-form { + border-right: none; + } +} + +/* Retina */ +@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi), (min-resolution: 2dppx) { + .mapplic-search-clear, + .mapplic-tooltip-close { + background-image: url(images/cross@2x.png); + } + + .mapplic-levels .mapplic-levels-up { + background-image: url(images/arrow-up@2x.png); + } + + .mapplic-levels .mapplic-levels-down { + background-image: url(images/arrow-down@2x.png); + } + + a.mapplic-zoomin-button { + background-image: url(images/plus@2x.png); + } + + a.mapplic-zoomout-button { + background-image: url(images/minus@2x.png); + } + + .mapplic-search-input { + background-image: url(images/viewer@2x.png); + } + + .mapplic-pin { background-image: url(images/pin@2x.png); } + .mapplic-pin.orange { background-image: url(images/pin-orange@2x.png); } + .mapplic-pin.yellow { background-image: url(images/pin-yellow@2x.png); } + .mapplic-pin.green { background-image: url(images/pin-green@2x.png); } + .mapplic-pin.blue { background-image: url(images/pin-blue@2x.png); } + .mapplic-pin.purple { background-image: url(images/pin-purple@2x.png); } + + .mapplic-clear-button { + background-image: url(images/reset@2x.png); + } +} + +/* Map */ +.mapplic-element svg { + width: 100%; + height: 100%; +} + +.mapplic-element svg a { + cursor: pointer; +} + +.mapplic-clickable:not(g), +g.mapplic-clickable > * { + cursor: pointer; + -webkit-transition: opacity 0.2s; + -moz-transition: opacity 0.2s; + transition: opacity 0.2s; +} + +.mapplic-map-image *[id^=nopointer] { + pointer-events: none; +} + +[id^=landmarks] .mapplic-clickable { + cursor: pointer; +} \ No newline at end of file diff --git a/src/assets/plugins/mapplic/mapplic.js b/src/assets/plugins/mapplic/mapplic.js new file mode 100644 index 0000000..8249935 --- /dev/null +++ b/src/assets/plugins/mapplic/mapplic.js @@ -0,0 +1,1385 @@ +/* + * Mapplic - Custom Interactive Map Plugin by @sekler + * Version 4.1 + * http://www.mapplic.com/ + */ + +;(function($) { + "use strict"; + + var Mapplic = function(element) { + + var self = this; + + self.o = { + source: 'locations.json', + selector: '[id^=landmark] > *', + landmark: false, + mapfill: false, + height: 420, + markers: true, + minimap: true, + sidebar: true, + search: true, + deeplinking: true, + clearbutton: true, + zoombuttons: true, + zoomoutclose: false, + action: 'tooltip', + lightbox: false, + hovertip: true, + smartip: true, + fillcolor: '#4d5e6d', + fullscreen: true, + developer: false, + mousewheel: true, + alphabetic: false, + maxscale: 3, + zoom: true + }; + self.el = element; + + self.init = function(options) { + // Merging options with defaults + self.o = $.extend(self.o, options); + + self.el.addClass('mapplic-element mapplic-loading').height(self.o.height); + + if (typeof self.o.source === 'string') { + // Loading .json file with AJAX + $.getJSON(self.o.source, function(data) { // Success + processData(data); + self.el.removeClass('mapplic-loading'); + + }).fail(function() { // Failure: couldn't load JSON file or it is invalid. + console.error('Couldn\'t load map data. (Make sure to run the script through web server)'); + self.el.removeClass('mapplic-loading').addClass('mapplic-error'); + alert('Data file missing or invalid!\nMake sure to run the script through web server.'); + }); + } + else { + // Inline json object + processData(self.o.source); + self.el.removeClass('mapplic-loading'); + } + + return self; + } + + // Tooltip + function Tooltip() { + this.el = null; + this.pin = null; + this.shift = 6; + this.drop = 0; + this.location = null; + this.tooltipthumb = true; + this.tooltiplink = true; + + this.init = function() { + var s = this; + + // Construct + this.el = $('
      ').addClass('mapplic-tooltip'); + this.close = $('').addClass('mapplic-tooltip-close').attr('href', '#').appendTo(this.el); + this.close.on('click touchend', function(e) { + e.preventDefault(); + self.hideLocation(); + if (!self.o.zoom || self.o.zoomoutclose) self.moveTo(0.5, 0.5, self.fitscale, 400, 'easeInOutCubic'); + }); + if (this.tooltipthumb) this.thumbnail = $('').addClass('mapplic-tooltip-thumbnail').hide().appendTo(this.el); + this.content = $('
      ').addClass('mapplic-tooltip-content').appendTo(this.el); + this.title = $('

      ').addClass('mapplic-tooltip-title').appendTo(this.content); + this.desc = $('
      ').addClass('mapplic-tooltip-description').appendTo(this.content); + if (this.tooltiplink) this.link = $('More').addClass('mapplic-popup-link').attr('href', '#').hide().appendTo(this.el); + this.triangle = $('
      ').addClass('mapplic-tooltip-triangle').prependTo(this.el); + + // Append + self.map.append(this.el); + + return this; + } + + this.show = function(location) { + if (location) { + var s = this; + + this.location = location; + if (self.hovertip) self.hovertip.hide(); + + if (this.tooltipthumb) { + if (location.thumbnail) this.thumbnail.attr('src', location.thumbnail).show(); + else this.thumbnail.hide(); + } + if (this.tooltiplink) { + if (location.link) this.link.attr('href', location.link).show(); + else this.link.hide(); + } + this.title.text(location.title); + if (location.description) this.desc.html(location.description); + else this.desc.empty(); + this.content[0].scrollTop = 0; + + // Shift + this.pin = $('.mapplic-pin[data-location="' + location.id + '"]'); + if (this.pin.length == 0) { + this.shift = 20; + } + else this.shift = Math.abs(parseFloat(this.pin.css('margin-top'))) + 20; + + // Loading & positioning + $('img', this.el).off('load').on('load', function() { + s.position(); + s.zoom(location); + }); + this.position(); + + // Making it visible + this.el.stop().show(); + this.zoom(location); + } + } + + this.position = function() { + if (this.location) { + var cx = self.map.offset().left + self.map.width() * this.location.x - self.container.offset().left, + cy = self.map.offset().top + self.map.height() * this.location.y - self.container.offset().top; + + var x = this.location.x * 100, + y = this.location.y * 100, + mt = -this.el.outerHeight() - this.shift, + ml = -this.el.outerWidth() / 2; + + if (self.o.smartip) { + var verticalPos = 0.5; + + // Top check + if (Math.abs(mt) > cy) { + mt = 8 + 2; + if (this.pin && this.pin.length) mt = this.pin.height() + parseFloat(this.pin.css('margin-top')) + 20; + this.el.addClass('mapplic-bottom'); + } + else this.el.removeClass('mapplic-bottom'); + + // Left-right check + if (this.el.outerWidth()/2 > cx) + verticalPos = 0.5 - (this.el.outerWidth()/2 - cx)/this.el.outerWidth(); + else if ((self.container.width() - cx - this.el.outerWidth()/2) < 0) + verticalPos = 0.5 + (cx + this.el.outerWidth()/2 - self.container.width())/this.el.outerWidth(); + + verticalPos = Math.max(0, Math.min(1, verticalPos)); + ml = -this.el.outerWidth() * verticalPos; + this.triangle.css('left', Math.max(5, Math.min(95, verticalPos * 100)) + '%'); + } + + this.el.css({ + left: x + '%', + top: y + '%', + marginTop: mt, + marginLeft: ml + }); + this.drop = this.el.outerHeight() + this.shift; + } + } + + this.zoom = function(location) { + var ry = 0.5, + zoom = location.zoom ? parseFloat(location.zoom) : self.o.maxscale; + + ry = ((self.container.height() - this.drop) / 2 + this.drop) / self.container.height(); + self.moveTo(location.x, location.y, zoom, 600, 'easeInOutCubic', ry); + } + + this.hide = function() { + var s = this; + + this.location = null; + this.el.stop().fadeOut(300, function() { + if (s.desc) s.desc.empty(); + }); + } + } + + // Lightbox + function Lightbox() { + this.el = null; + + this.init = function() { + // Construct + this.el = $('
      ').addClass('mapplic-lightbox mfp-hide'); + this.title = $('

      ').addClass('mapplic-lightbox-title').appendTo(this.el); + this.desc = $('
      ').addClass('mapplic-lightbox-description').appendTo(this.el); + this.link = $('More').addClass('mapplic-popup-link').attr('href', '#').hide().appendTo(this.el); + + // Popup Image + $('body').magnificPopup({ + delegate: '.mapplic-popup-image', + type: 'image', + removalDelay: 300, + mainClass: 'mfp-fade' + }); + + // Append + self.el.append(this.el); + + return this; + } + + this.show = function(location) { + this.location = location; + + this.title.text(location.title); + this.desc.html(location.description); + + if (location.link) this.link.attr('href', location.link).show(); + else this.link.hide(); + + var s = this; + + $.magnificPopup.open({ + items: { + src: this.el + }, + type: 'inline', + removalDelay: 300, + mainClass: 'mfp-fade', + callbacks: { + beforeClose: function() { + s.hide(); + } + } + }); + + // Zoom + var zoom = location.zoom ? parseFloat(location.zoom) : self.o.maxscale; + self.moveTo(location.x, location.y, zoom, 600, 'easeInOutCubic'); + + // Hide tooltip + if (self.tooltip) self.tooltip.hide(); + } + + this.hide = function() { + this.location = null; + self.hideLocation(); + if (!self.o.zoom || self.o.zoomoutclose) self.moveTo(0.5, 0.5, self.fitscale, 400, 'easeInOutCubic'); + } + } + + // HoverTooltip + function HoverTooltip() { + this.el = null; + this.pin = null; + this.shift = 6; + this.hovertipdesc = false; + + this.init = function() { + var s = this; + + // Construct + this.el = $('
      ').addClass('mapplic-tooltip mapplic-hovertip'); + this.title = $('

      ').addClass('mapplic-tooltip-title').appendTo(this.el); + if (this.hovertipdesc) this.desc = $('
      ').addClass('mapplic-tooltip-description').appendTo(this.el); + this.triangle = $('
      ').addClass('mapplic-tooltip-triangle').appendTo(this.el); + + // Events + // pins + old svg + $(self.map).on('mouseover', '.mapplic-layer a', function() { + var id = ''; + if ($(this).hasClass('mapplic-pin')) { + id = $(this).data('location'); + s.pin = $('.mapplic-pin[data-location="' + id + '"]'); + s.shift = Math.abs(parseFloat(s.pin.css('margin-top'))) + 20; + } + else { + id = $(this).attr('xlink:href').slice(1); + s.shift = 20; + } + + var location = self.getLocationData(id); + if (location) s.show(location); + }).on('mouseout', function() { + s.hide(); + }); + + // new svg + if (self.o.selector) { + $(self.map).on('mouseover', self.o.selector, function() { + var location = self.getLocationData($(this).attr('id')); + s.shift = 20; + if (location) s.show(location); + }).on('mouseout', function() { + s.hide(); + }); + } + + self.map.append(this.el); + + return this; + } + + this.show = function(location) { + if (self.tooltip.location != location) { + this.title.text(location.title); + if (this.hovertipdesc) this.desc.html(location.description); + this.position(location); + + this.el.stop().fadeIn(100); + } + } + + this.position = function(location) { + var cx = self.map.offset().left + self.map.width() * location.x - self.container.offset().left, + cy = self.map.offset().top + self.map.height() * location.y - self.container.offset().top; + + var x = location.x * 100, + y = location.y * 100, + mt = -this.el.outerHeight() - this.shift, + ml = 0; + + var verticalPos = 0.5; + + // Top check + if (Math.abs(mt) > cy) { + mt = 8 + 2; + if (this.pin && this.pin.length) mt = this.pin.height() + parseFloat(this.pin.css('margin-top')) + 20; + this.el.addClass('mapplic-bottom'); + } + else this.el.removeClass('mapplic-bottom'); + + // Left-right check + if (this.el.outerWidth()/2 > cx) + verticalPos = 0.5 - (this.el.outerWidth()/2 - cx)/this.el.outerWidth(); + else if ((self.container.width() - cx - this.el.outerWidth()/2) < 0) + verticalPos = 0.5 + (cx + this.el.outerWidth()/2 - self.container.width())/this.el.outerWidth(); + + ml = -this.el.outerWidth() * verticalPos; + this.triangle.css('left', Math.max(10, Math.min(90, verticalPos * 100)) + '%'); + this.el.css({ + left: x + '%', + top: y + '%', + marginTop: mt, + marginLeft: ml + }); + } + + this.hide = function() { + this.el.stop().fadeOut(200); + } + } + + // Deeplinking + function Deeplinking() { + this.param = 'location'; + + this.init = function() { + var s = this; + this.check(0); + + window.onpopstate = function(e) { + if (e.state) { + s.check(600); + } + return false; + } + } + + this.check = function(easing) { + var id = this.getUrlParam(this.param); + self.showLocation(id, easing, true); + } + + this.getUrlParam = function(name) { + name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); + var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), + results = regex.exec(location.search); + return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " ")); + } + + this.update = function(id) { + var url = window.location.protocol + "//" + window.location.host + window.location.pathname + '?' + this.param + '=' + id; + window.history.pushState({path: url}, '', url); + } + + // Clear + this.clear = function() { + history.pushState('', document.title, window.location.pathname); + } + } + + // Old hash deeplinking method for old browsers + function DeeplinkingHash() { + this.param = 'location'; + + this.init = function() { + var s = this; + this.check(0); + + $(window).on('hashchange', function() { + s.check(600); + }); + } + + this.check = function(easing) { + var id = location.hash.slice(this.param.length + 2); + self.showLocation(id, easing, true); + } + + this.update = function(id) { + window.location.hash = this.param + '-' + id; + } + + this.clear = function() { + window.location.hash = this.param; + } + } + + // Minimap + function Minimap() { + this.el = null; + this.opacity = null; + + this.init = function() { + this.el = $('
      ').addClass('mapplic-minimap').appendTo(self.container); + this.el.click(function(e) { + e.preventDefault(); + + var x = (e.pageX - $(this).offset().left) / $(this).width(), + y = (e.pageY - $(this).offset().top) / $(this).height(); + + self.moveTo(x, y, self.scale / self.fitscale, 100); + }); + } + + this.addLayer = function(data) { + var layer = $('
      ').addClass('mapplic-minimap-layer').attr('data-floor', data.id).appendTo(this.el), + s = this; + + $('').attr('src', data.minimap).addClass('mapplic-minimap-background').appendTo(layer); + $('
      ').addClass('mapplic-minimap-overlay').appendTo(layer); + $('').attr('src', data.minimap).addClass('mapplic-minimap-active').on('load', function() { + s.update(); + $(this).addClass('mapplic-clip-transition'); + }).appendTo(layer); + } + + this.show = function(target) { + $('.mapplic-minimap-layer', this.el).hide(); + $('.mapplic-minimap-layer[data-floor="' + target + '"]', this.el).show(); + } + + this.update = function(x, y) { + var active = $('.mapplic-minimap-active', this.el); + + if (x === undefined) x = self.x; + if (y === undefined) y = self.y; + + var width = Math.round(self.container.width() / self.contentWidth / self.scale * this.el.width()), + height = Math.round(self.container.height() / self.contentHeight / self.scale * this.el.height()), + top = Math.round(-y / self.contentHeight / self.scale * this.el.height()), + left = Math.round(-x / self.contentWidth / self.scale * this.el.width()), + right = left + width, + bottom = top + height; + + active.each(function() { + $(this)[0].style.clip = 'rect(' + top + 'px, ' + right + 'px, ' + bottom + 'px, ' + left + 'px)'; + }); + + // Fade out effect + var s = this; + this.el.show(); + this.el.css('opacity', 1.0); + clearTimeout(this.opacity); + this.opacity = setTimeout(function() { + s.el.css('opacity', 0); + setTimeout(function() { s.el.hide(); }, 600); + }, 2000); + } + } + + // Sidebar + function Sidebar() { + this.el = null; + this.list = null; + + this.init = function() { + var s = this; + + this.el = $('
      ').addClass('mapplic-sidebar').appendTo(self.el); + + if (self.o.search) { + var form = $('
      ').addClass('mapplic-search-form').submit(function() { + return false; + }).appendTo(this.el); + self.clear = $('').attr('type', 'button').addClass('mapplic-search-clear').click(function() { + input.val(''); + input.keyup(); + }).appendTo(form); + var input = $('').attr({'type': 'text', 'spellcheck': 'false', 'placeholder': 'Search...'}).addClass('mapplic-search-input').keyup(function() { + var keyword = $(this).val(); + s.search(keyword); + }).prependTo(form); + } + + var listContainer = $('
      ').addClass('mapplic-list-container').appendTo(this.el); + this.list = $('
        ').addClass('mapplic-list').appendTo(listContainer); + this.notfound = $('

        ').addClass('mapplic-not-found').text('Nothing found. Please try a different search.').appendTo(listContainer); + + if (!self.o.search) listContainer.css('padding-top', '0'); + } + + this.addCategories = function(categories) { + var list = this.list; + + if (categories) { + $.each(categories, function(index, category) { + var item = $('
      1. ').addClass('mapplic-list-category').attr('data-category', category.id); + var ol = $('
          ').css('border-color', category.color).appendTo(item); + if (category.show == 'false') ol.hide(); + else item.addClass('mapplic-opened'); + var link = $('').attr('href', '#').attr('title', category.title).css('background-color', category.color).text(category.title).prependTo(item); + link.on('click', function(e) { + e.preventDefault(); + item.toggleClass('mapplic-opened'); + ol.slideToggle(200); + }); + if (category.icon) $('').attr('src', category.icon).addClass('mapplic-list-thumbnail').prependTo(link); + $('').text('0').addClass('mapplic-list-count').prependTo(link); + list.append(item); + }); + } + } + + this.addLocation = function(data) { + var item = $('
        1. ').addClass('mapplic-list-location').addClass('mapplic-list-shown').attr('data-location', data.id); + var link = $('').attr('href', '#').click(function(e) { + e.preventDefault(); + self.showLocation(data.id, 600); + + // Scroll back to map on mobile + if ($(window).width() < 668) { + $('html, body').animate({ + scrollTop: self.container.offset().top + }, 400); + } + }).appendTo(item); + + if (data.thumbnail) $('').attr('src', data.thumbnail).addClass('mapplic-list-thumbnail').appendTo(link); + $('

          ').text(data.title).appendTo(link) + $('').html(data.about).appendTo(link); + var category = $('.mapplic-list-category[data-category="' + data.category + '"]'); + + if (category.length) $('ol', category).append(item); + else this.list.append(item); + + // Count + $('.mapplic-list-count', category).text($('.mapplic-list-shown', category).length); + } + + this.search = function(keyword) { + if (keyword) self.clear.fadeIn(100); + else self.clear.fadeOut(100); + + $('.mapplic-list li', self.el).each(function() { + if ($(this).text().search(new RegExp(keyword, "i")) < 0) { + $(this).removeClass('mapplic-list-shown'); + $(this).slideUp(200); + } else { + $(this).addClass('mapplic-list-shown'); + $(this).show(); + } + }); + + $('.mapplic-list > li', self.el).each(function() { + var count = $('.mapplic-list-shown', this).length; + $('.mapplic-list-count', this).text(count); + }); + + // Show not-found text + if ($('.mapplic-list > li.mapplic-list-shown').length > 0) this.notfound.fadeOut(200); + else this.notfound.fadeIn(200); + } + } + + // Developer tools + function DevTools() { + this.el = null; + + this.init = function() { + this.el = $('
          ').addClass('mapplic-coordinates').appendTo(self.container); + this.el.append('x: '); + $('').addClass('mapplic-coordinates-x').appendTo(this.el); + this.el.append(' y: '); + $('').addClass('mapplic-coordinates-y').appendTo(this.el); + + $('.mapplic-layer', self.map).on('mousemove', function(e) { + var x = (e.pageX - self.map.offset().left) / self.map.width(), + y = (e.pageY - self.map.offset().top) / self.map.height(); + $('.mapplic-coordinates-x').text(parseFloat(x).toFixed(4)); + $('.mapplic-coordinates-y').text(parseFloat(y).toFixed(4)); + }); + + return this; + } + } + + // Clear Button + function ClearButton() { + this.el = null; + + this.init = function() { + this.el = $('').attr('href', '#').addClass('mapplic-clear-button').appendTo(self.container); + + this.el.on('click touchstart', function(e) { + e.preventDefault(); + self.hideLocation(); + self.moveTo(0.5, 0.5, self.fitscale, 400, 'easeInOutCubic'); + }); + + return this; + } + } + + // Zoom Buttons + function ZoomButtons() { + this.el = null; + + this.init = function() { + this.el = $('
          ').addClass('mapplic-zoom-buttons').appendTo(self.container); + + if (!self.o.clearbutton) this.el.css('bottom', '0'); + + // Zoom in button + this.zoomin = $('').attr('href', '#').addClass('mapplic-zoomin-button').appendTo(this.el); + this.zoomin.on('click touchstart', function(e) { + e.preventDefault(); + + var scale = self.scale; + self.scale = normalizeScale(scale + scale * 0.8); + + self.x = normalizeX(self.x - (self.container.width() / 2 - self.x) * (self.scale / scale - 1)); + self.y = normalizeY(self.y - (self.container.height() / 2 - self.y) * (self.scale / scale - 1)); + + zoomTo(self.x, self.y, self.scale, 400, 'easeInOutCubic'); + }); + + // Zoom out button + this.zoomout = $('').attr('href', '#').addClass('mapplic-zoomout-button').appendTo(this.el); + this.zoomout.on('click touchstart', function(e) { + e.preventDefault(); + + var scale = self.scale; + self.scale = normalizeScale(scale - scale * 0.4); + + self.x = normalizeX(self.x - (self.container.width() / 2 - self.x) * (self.scale / scale - 1)); + self.y = normalizeY(self.y - (self.container.height() / 2 - self.y) * (self.scale / scale - 1)); + + zoomTo(self.x, self.y, self.scale, 400, 'easeInOutCubic'); + }); + + return this; + } + + this.update = function(scale) { + this.zoomin.removeClass('mapplic-disabled'); + this.zoomout.removeClass('mapplic-disabled'); + if (scale == self.fitscale) this.zoomout.addClass('mapplic-disabled'); + else if (scale == self.o.maxscale) this.zoomin.addClass('mapplic-disabled'); + } + } + + // Fullscreen + function Fullscreen() { + this.el = null; + + this.init = function() { + // Fullscreen Button + $('').attr('href', '#').attr('href', '#').addClass('mapplic-fullscreen-button').click(function(e) { + e.preventDefault(); + self.el.toggleClass('mapplic-fullscreen'); + $(document).resize(); + }).appendTo(self.container); + + // Esc key + $(document).keyup(function(e) { + if (e.keyCode === 27) { + $('.mapplic-element.mapplic-fullscreen').removeClass('mapplic-fullscreen'); + $(document).resize(); + } + }); + } + } + + // Functions + var processData = function(data) { + self.data = data; + var shownLevel = null; + + // Disable modules when landmark mode is active + self.o.landmark = self.el.data('landmark'); + if (self.o.landmark) { + self.o.sidebar = false; + self.o.zoombuttons = false; + self.o.deeplinking = false; + } + + self.container = $('
          ').addClass('mapplic-container').appendTo(self.el); + self.map = $('
          ').addClass('mapplic-map').appendTo(self.container); + if (self.o.zoom) self.map.addClass('mapplic-zoomable'); + + self.levelselect = $('').addClass('mapplic-levels-select'); + + self.contentWidth = parseFloat(data.mapwidth); + self.contentHeight = parseFloat(data.mapheight); + + // Create minimap + if (self.o.minimap) { + self.minimap = new Minimap(); + self.minimap.init(); + } + + // Create sidebar + if (self.o.sidebar) { + self.sidebar = new Sidebar(); + self.sidebar.init(); + self.sidebar.addCategories(data.categories); + } + else self.container.css('width', '100%'); + + // Iterate through levels + var nrlevels = 0; + + if (data.levels) { + $.each(data.levels, function(index, level) { + var source = level.map, + extension = source.substr((source.lastIndexOf('.') + 1)).toLowerCase(); + + // Create new map layer + var layer = $('
          ').addClass('mapplic-layer').attr('data-floor', level.id).hide().appendTo(self.map); + switch (extension) { + + // Image formats + case 'jpg': case 'jpeg': case 'png': case 'gif': + $('').attr('src', source).addClass('mapplic-map-image').appendTo(layer); + break; + + // Vector format + case 'svg': + $('
          ').addClass('mapplic-map-image').load(source, function() { + // Setting up the locations on the map + $(self.o.selector, this).each(function() { + var location = self.getLocationData($(this).attr('id')); + if (location) { + $(this).attr('class', 'mapplic-clickable'); + location.el = $(this); + + var fill = null; + if (location.fill) fill = location.fill; + else if (self.o.fillcolor) fill = self.o.fillcolor; + + if (fill) { + $(this).css('fill', fill); + $('> *', this).css('fill', fill); + } + + // Landmark mode + if (self.o.landmark === location.id) $(this).attr('class', 'mapplic-active'); + } + }); + + // Click event + $(self.o.selector, this).on('click touchend', function() { + if (!self.dragging) self.showLocation($(this).attr('id'), 600); + }); + + // Support for the old map format + $('svg a', this).each(function() { + var location = self.getLocationData($(this).attr('xlink:href').substr(1)); + if (location) { + $(this).attr('class', 'mapplic-clickable'); + location.el = $(this); + } + }); + + $('svg a', this).click(function(e) { + var id = $(this).attr('xlink:href').substr(1); + self.showLocation(id, 600); + e.preventDefault(); + }); + }).appendTo(layer); + break; + + // Other + default: + alert('File type ' + extension + ' is not supported!'); + } + + // Create new minimap layer + if (self.minimap) self.minimap.addLayer(level); + + // Build layer control + self.levelselect.prepend($('').attr('value', level.id).text(level.title)); + + // Shown level + if (!shownLevel || level.show) shownLevel = level.id; + + // Iterate through locations + $.each(level.locations, function(index, location) { + // Geolocation + if (location.lat && location.lng) { + var pos = latlngToPos(location.lat, location.lng); + location.x = pos.x; + location.y = pos.y; + } + + var top = location.y * 100, + left = location.x * 100; + + if (!location.pin) location.pin = 'default'; + if (location.pin.indexOf('hidden') == -1) { + if (self.o.markers) { + var pin = $('').attr('href', '#').addClass('mapplic-pin').css({'top': top + '%', 'left': left + '%'}).appendTo(layer); + pin.on('click touchend', function(e) { + e.preventDefault(); + self.showLocation(location.id, 600); + }); + if (location.label) pin.html(location.label); + if (location.fill) pin.css('background-color', location.fill); + pin.attr('data-location', location.id); + pin.addClass(location.pin); + location.el = pin; + } + } + + if (self.sidebar) self.sidebar.addLocation(location); + }); + + nrlevels++; + }); + } + + // COMPONENTS + + // Tooltip (default) + self.tooltip = new Tooltip().init(); + + // Lightbox + if (self.o.lightbox) self.lightbox = new Lightbox().init(); + + // Hover Tooltip + if (self.o.hovertip) self.hovertip = new HoverTooltip().init(); + + // Clear button + if (self.o.clearbutton) self.clearbutton = new ClearButton().init(); + + // Zoom buttons + if (self.o.zoombuttons) self.zoombuttons = new ZoomButtons().init(); + + // Fullscreen + if (self.o.fullscreen) self.fullscreen = new Fullscreen().init(); + + // Developer tools + if (self.o.developer) self.devtools = new DevTools().init(); + console.log(self.devtools); + + // Level switcher + if (nrlevels > 1) { + self.levels = $('
          ').addClass('mapplic-levels'); + var up = $('').addClass('mapplic-levels-up').appendTo(self.levels); + self.levelselect.appendTo(self.levels); + var down = $('').addClass('mapplic-levels-down').appendTo(self.levels); + self.container.append(self.levels); + + self.levelselect.change(function() { + var value = $(this).val(); + self.switchLevel(value); + }); + + up.click(function(e) { + e.preventDefault(); + if (!$(this).hasClass('mapplic-disabled')) self.switchLevel('+'); + }); + + down.click(function(e) { + e.preventDefault(); + if (!$(this).hasClass('mapplic-disabled')) self.switchLevel('-'); + }); + } + self.switchLevel(shownLevel); + + // Browser resize + $(window).resize(function() { + // Mobile + if ($(window).width() < 668) { + if (self.el.hasClass('mapplic-fullscreen')) self.container.height($(window).height()); + else { + var height = Math.min(Math.max(self.container.width() * self.contentHeight / self.contentWidth, $(window).height() * 2/3), $(window).height() - 66); + self.container.height(height); + } + } + else self.container.height('100%'); + + var wr = self.container.width() / self.contentWidth, + hr = self.container.height() / self.contentHeight; + + if (self.o.mapfill) { + if (wr > hr) self.fitscale = wr; + else self.fitscale = hr; + } + else { + if (wr < hr) self.fitscale = wr; + else self.fitscale = hr; + } + //if (!self.data.zoomlimit) self.o.maxscale = self.fitscale; + + self.scale = normalizeScale(self.scale); + self.x = normalizeX(self.x); + self.y = normalizeY(self.y); + + zoomTo(self.x, self.y, self.scale, 0); + + }).resize(); + + // Landmark mode + if (self.o.landmark) { + self.showLocation(self.o.landmark, 0); + } + else { + var init = self.getLocationData('init'); // Landmark with ID 'init' + if (init) self.moveTo(init.x, init.y, parseFloat(init.zoom), 0); + else self.moveTo(0.5, 0.5, self.fitscale, 0); + } + + // Deeplinking + if (self.o.deeplinking) { + if (history.pushState) self.deeplinking = new Deeplinking(); + else self.deeplinking = new DeeplinkingHash(); + + self.deeplinking.init(); + } + + // Trigger event + self.el.trigger('mapready', self); + + // Controls + if (self.o.zoom) addControls(); + } + + var addControls = function() { + var map = self.map, + mapbody = $('.mapplic-map-image', self.map); + + document.ondragstart = function() { return false; } // IE drag fix + + // Drag & drop + mapbody.on('mousedown', function(e) { + self.dragging = false; + + map.data('mouseX', e.pageX); + map.data('mouseY', e.pageY); + if (map.is(':animated')) { + map.stop(); + self.x = normalizeX(map.offset().left - self.container.offset().left); + self.y = normalizeY(map.offset().top - self.container.offset().top); + self.scale = normalizeScale(map.width() / self.contentWidth); + } + map.addClass('mapplic-dragging'); + + self.map.on('mousemove', function(e) { + self.dragging = true; + + var x = e.pageX - map.data('mouseX') + self.x, + y = e.pageY - map.data('mouseY') + self.y; + + x = normalizeX(x); + y = normalizeY(y); + + zoomTo(x, y); + map.data('lastX', x); + map.data('lastY', y); + }); + + $(document).on('mouseup', function() { + self.x = map.data('lastX'); + self.y = map.data('lastY'); + + self.map.off('mousemove'); + $(document).off('mouseup'); + + map.removeClass('mapplic-dragging'); + }); + }); + + // Double click + self.el.on('dblclick', '.mapplic-map-image', function(e) { + e.preventDefault(); + + var scale = self.scale; + self.scale = normalizeScale(scale * 2); + + self.x = normalizeX(self.x - (e.pageX - self.container.offset().left - self.x) * (self.scale/scale - 1)); + self.y = normalizeY(self.y - (e.pageY - self.container.offset().top - self.y) * (self.scale/scale - 1)); + + zoomTo(self.x, self.y, self.scale, 400, 'easeInOutCubic'); + }); + + // Mousewheel + if (self.o.mousewheel) { + $('.mapplic-layer', self.el).bind('mousewheel DOMMouseScroll', function(e, delta) { + var scale = self.scale; + + self.scale = normalizeScale(scale + scale * delta / 5); + + // Disable page scroll when zoom is applicable + //if (scale != self.scale) + e.preventDefault(); + + self.x = normalizeX(self.x - (e.pageX - self.container.offset().left - self.x) * (self.scale/scale - 1)); + self.y = normalizeY(self.y - (e.pageY - self.container.offset().top - self.y) * (self.scale/scale - 1)); + + zoomTo(self.x, self.y, self.scale, 200, 'easeOutCubic'); + }); + } + + // Touch support + if (!('ontouchstart' in window || 'onmsgesturechange' in window)) return true; + mapbody.on('touchstart', function(e) { + self.dragging = false; + + var orig = e.originalEvent, + pos = map.position(); + + map.data('touchY', orig.changedTouches[0].pageY - pos.top); + map.data('touchX', orig.changedTouches[0].pageX - pos.left); + + mapbody.on('touchmove', function(e) { + e.preventDefault(); + self.dragging = true; + + var orig = e.originalEvent; + var touches = orig.touches.length; + + if (touches == 1) { + self.x = normalizeX(orig.changedTouches[0].pageX - map.data('touchX')); + self.y = normalizeY(orig.changedTouches[0].pageY - map.data('touchY')); + + zoomTo(self.x, self.y, self.scale, 50); + } + else { + mapbody.off('touchmove'); + } + }); + + mapbody.on('touchend', function(e) { + mapbody.off('touchmove touchend'); + }); + }); + + // Pinch zoom + var hammer = new Hammer(self.map[0], { + transform_always_block: true, + drag_block_horizontal: true, + drag_block_vertical: true + }); + hammer.get('pinch').set({ enable: true }); + + var scale = 1, last_scale; + hammer.on('pinchstart', function(e) { + self.dragging = false; + + scale = self.scale / self.fitscale; + last_scale = scale; + }); + + hammer.on('pinch', function(e) { + self.dragging = true; + + if (e.scale != 1) scale = Math.max(1, Math.min(last_scale * e.scale, 100)); + + var oldscale = self.scale; + self.scale = normalizeScale(scale * self.fitscale); + + self.x = normalizeX(self.x - (e.center.x - self.container.offset().left - self.x) * (self.scale / oldscale - 1)); + self.y = normalizeY(self.y - (e.center.y - self.y) * (self.scale / oldscale - 1)); // - self.container.offset().top + + zoomTo(self.x, self.y, self.scale, 100); + }); + } + + /* PRIVATE METHODS */ + + // Web Mercator (EPSG:3857) lat/lng projection + var latlngToPos = function(lat, lng) { + var deltaLng = self.data.rightLng - self.data.leftLng, + bottomLatDegree = self.data.bottomLat * Math.PI / 180, + mapWidth = ((self.data.mapwidth / deltaLng) * 360) / (2 * Math.PI), + mapOffsetY = (mapWidth / 2 * Math.log((1 + Math.sin(bottomLatDegree)) / (1 - Math.sin(bottomLatDegree)))); + + lat = lat * Math.PI / 180; + + return { + x: ((lng - self.data.leftLng) * (self.data.mapwidth / deltaLng)) / self.data.mapwidth, + y: (self.data.mapheight - ((mapWidth / 2 * Math.log((1 + Math.sin(lat)) / (1 - Math.sin(lat)))) - mapOffsetY)) / self.data.mapheight + }; + } + + // jQuery bug add/remove class workaround (will be fixed in jQuery 3) + var addClass = function(element, c) { + var classes = element.attr('class'); + if (classes.indexOf(c) == -1) element.attr('class', classes + ' ' + c); + } + + var removeClass = function(element, c) { + var classes = element.attr('class'); + if (classes) element.attr('class', classes.replace(c, '').trim()); + } + + var hasClass = function(element, c) { + var classes = element.attr('class'); + return (classes.indexOf(c) > -1); + } + + // Normalizing x, y and scale + var normalizeX = function(x) { + var minX = self.container.width() - self.contentWidth * self.scale; + + if (minX < 0) { + if (x > 0) x = 0; + else if (x < minX) x = minX; + } + else x = minX/2; + + return x; + } + + var normalizeY = function(y) { + var minY = self.container.height() - self.contentHeight * self.scale; + + if (minY < 0) { + if (y >= 0) y = 0; + else if (y < minY) y = minY; + } + else y = minY/2; + + return y; + } + + var normalizeScale = function(scale) { + if (scale < self.fitscale) scale = self.fitscale; + else if (scale > self.o.maxscale) scale = self.o.maxscale; + + if (self.zoombuttons) self.zoombuttons.update(scale); + + return scale; + } + + var zoomTo = function(x, y, scale, d, easing) { + if (scale !== undefined) { + self.map.stop().animate({ + 'left': x, + 'top': y, + 'width': self.contentWidth * scale, + 'height': self.contentHeight * scale + }, d, easing, function() { + if (self.tooltip) self.tooltip.position(); + }); + } + else { + self.map.css({ + 'left': x, + 'top': y + }); + } + if (self.tooltip) self.tooltip.position(); + if (self.minimap) self.minimap.update(x, y); + + // Trigger event + self.el.trigger('positionchanged', location); + } + + /* PUBLIC METHODS */ + self.switchLevel = function(target) { + switch (target) { + case '+': + target = $('option:selected', self.levelselect).removeAttr('selected').prev().prop('selected', 'selected').val(); + break; + case '-': + target = $('option:selected', self.levelselect).removeAttr('selected').next().prop('selected', 'selected').val(); + break; + default: + $('option[value="' + target + '"]', self.levelselect).prop('selected', 'selected'); + } + + // No such layer + if (!target) return; + + var layer = $('.mapplic-layer[data-floor="' + target + '"]', self.el); + + // Target layer is already active + if (layer.is(':visible')) return; + + // Hide Tooltip + if (self.tooltip) self.tooltip.hide(); + + // Show target layer + $('.mapplic-layer:visible', self.map).hide(); + layer.show(); + + // Show target minimap layer + if (self.minimap) self.minimap.show(target); + + // Update control + var index = self.levelselect.get(0).selectedIndex, + up = $('.mapplic-levels-up', self.el), + down = $('.mapplic-levels-down', self.el); + + up.removeClass('mapplic-disabled'); + down.removeClass('mapplic-disabled'); + if (index == 0) up.addClass('mapplic-disabled'); + else if (index == self.levelselect.get(0).length - 1) down.addClass('mapplic-disabled'); + + // Trigger event + self.el.trigger('levelswitched', target); + } + + self.moveTo = function(x, y, s, duration, easing, ry) { + duration = typeof duration !== 'undefined' ? duration : 400; + ry = typeof ry !== 'undefined' ? ry : 0.5; + s = typeof s !== 'undefined' ? s : self.scale/self.fitscale; + + self.scale = normalizeScale(s); + + self.x = normalizeX(self.container.width() * 0.5 - self.scale * self.contentWidth * x); + self.y = normalizeY(self.container.height() * ry - self.scale * self.contentHeight * y); + + zoomTo(self.x, self.y, self.scale, duration, easing); + } + + self.getLocationData = function(id) { + var data = null; + $.each(self.data.levels, function(index, level) { + $.each(level.locations, function(index, location) { + if (location.id == id) { + data = location; + } + }); + }); + return data; + } + + self.showLocation = function(id, duration, check) { + $.each(self.data.levels, function(index, level) { + if (level.id == id) { + self.switchLevel(level.id); + return false; + } + $.each(level.locations, function(index, location) { + if (location.id == id) { + var action = (location.action && location.action != 'default') ? location.action : self.o.action; + switch (action) { + case 'open-link': + window.location.href = location.link; + return false; + case 'open-link-new-tab': + window.open(location.link); + return false; + case 'select': + if (location.el) { + if (hasClass(location.el, 'mapplic-active')) removeClass(location.el, 'mapplic-active'); + else addClass(location.el, 'mapplic-active'); + } + return false; + case 'none': + var zoom = location.zoom ? parseFloat(location.zoom) : self.o.maxscale; + self.switchLevel(level.id); + self.moveTo(location.x, location.y, zoom, 600, 'easeInOutCubic'); + break; + case 'lightbox': + self.switchLevel(level.id); + self.lightbox.show(location); + break; + default: + self.switchLevel(level.id); + self.tooltip.show(location); + } + + // Active state + removeClass($('.mapplic-active', self.el), 'mapplic-active'); + if (location.el) addClass(location.el, 'mapplic-active'); + + // Deeplinking + if ((self.deeplinking) && (!check)) self.deeplinking.update(id); + + // Trigger event + self.el.trigger('locationopened', location); + } + }); + }); + } + + self.hideLocation = function() { + removeClass($('.mapplic-active', self.el), 'mapplic-active'); + if (self.deeplinking) self.deeplinking.clear(); + if (self.tooltip) self.tooltip.hide(); + + // Trigger event + self.el.trigger('locationclosed'); + } + + self.updateLocation = function(id) { + var location = self.getLocationData(id); + + if ((location.id == id) && (location.el.is('a'))) { + // Geolocation + if (location.lat && location.lng) { + var pos = latlngToPos(location.lat, location.lng); + location.x = pos.x; + location.y = pos.y; + } + + var top = location.y * 100, + left = location.x * 100; + + location.el.css({'top': top + '%', 'left': left + '%'}); + } + } + + }; + + // Easing functions used by default + // For the full list of easing functions use jQuery Easing Plugin + $.extend($.easing, + { + def: 'easeOutQuad', + swing: function (x, t, b, c, d) { + //alert(jQuery.easing.default); + return jQuery.easing[jQuery.easing.def](x, t, b, c, d); + }, + easeOutQuad: function (x, t, b, c, d) { + return -c *(t/=d)*(t-2) + b; + }, + easeOutCubic: function (x, t, b, c, d) { + return c*((t=t/d-1)*t*t + 1) + b; + }, + easeInOutCubic: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t + b; + return c/2*((t-=2)*t*t + 2) + b; + } + }); + + // jQuery Plugin + $.fn.mapplic = function(options) { + + return this.each(function() { + var element = $(this); + + // Plugin already initiated on element + if (element.data('mapplic')) return; + + var instance = (new Mapplic(element)).init(options); + + // Store plugin object in element's data + element.data('mapplic', instance); + }); + }; + +})(jQuery); \ No newline at end of file diff --git a/src/assets/sass/_config.scss b/src/assets/sass/_config.scss new file mode 100644 index 0000000..bea4561 --- /dev/null +++ b/src/assets/sass/_config.scss @@ -0,0 +1,236 @@ +// +// Global Config +// + + + +// Init global functions and mixins +@import "global/init"; + +// Layout Breakpoints(bootstrap responsive breakpoints) +// Define the minimum and maximum dimensions at which your layout will change, adapting to different screen sizes, for use in media queries. +$kt-media-breakpoints: ( + // Extra small screen / phone + xs: 0, + + // Small screen / phone + sm: 576px, + + // Medium screen / tablet + md: 768px, + + // Large screen / desktop + lg: 1024px, //1024px, + + // Extra large screen / wide desktop + xl: 1399px +) !default; + +// Global rounded border mode +$kt-rounded: true !default; + +// Border Radius +$kt-border-radius: 4px !default; + +// Core icon codes(lineawesome icons: https://icons8.com/line-awesome) +$kt-action-icons: ( + close: '\f191', + down: '\f110', + up: '\f113', + left: '\f111', + right: '\f112', + plus: '\f2c2', + minus: '\f28e' +) !default; + +// Core bold icon codes(lineawesome icons: https://keenthemes.com/metronic/preview/default/components/icons/flaticon.html) +$kt-action-bold-icons: ( + down: '\f1a3', + up: '\f1a5', + left: '\f1a4', + right: '\f19d', + close: '\f1b2' +) !default; + +// Elevate shadow +$kt-elevate-shadow: 0px 0px 13px 0px rgba(82,63,105,0.05) !default; +$kt-elevate-shadow-2: 0px 0px 13px 0px rgba(82,63,105,0.1) !default; + +// Dropdown shadow +$kt-dropdown-shadow: 0px 0px 50px 0px rgba(82,63,105, 0.15) !default; + +// Custom scrollbar color +$kt-scroll-color: darken(#ebedf2, 6%) !default; + +// Transition +$kt-transition: all 0.3s !default; + +// Modal Z-index +$kt-modal-zindex: 1050 !default; + +// dropdown Z-index +$kt-dropdown-zindex: 95 !default; + +// State Color +$kt-state-colors: ( + // Metronic states + brand: ( + base: #5d78ff, + inverse: #ffffff + ), + light: ( + base: #ffffff, + inverse: #282a3c + ), + dark: ( + base: #282a3c, + inverse: #ffffff + ), + + // Bootstrap states + primary: ( + base: #5867dd, + inverse: #ffffff + ), + success: ( + base: #0abb87, //1dc9b7, + inverse: #ffffff + ), + info: ( + base: #5578eb, + inverse: #ffffff + ), + warning: ( + base: #ffb822, + inverse: #111111 + ), + danger: ( + base: #fd397a, + inverse: #ffffff + ) +) !default; + + +// Base colors +$kt-base-colors: ( + label: ( + 1: #a2a5b9, + 2: #74788d, + 3: #595d6e, + 4: #48465b + ), + shape: ( + 1: #f0f3ff, + 2: #e8ecfa, + 3: #93a2dd, + 4: #646c9a + ), + grey: ( + 1: #f7f8fa, //#f4f5f8 + 2: #ebedf2, + 3: darken(#ebedf2, 3%), + 4: darken(#ebedf2, 6%) + ) +) !default; + +// Social network colors(see: https://brandcolors.net/) +$kt-social-colors: ( + facebook: ( + base: #3b5998, + inverse: #ffffff + ), + google: ( + base: #dc4e41, + inverse: #ffffff + ), + twitter: ( + base: #4AB3F4, + inverse: #ffffff + ), + instagram: ( + base: #517fa4, + inverse: #ffffff + ), + youtube: ( + base: #b31217, + inverse: #ffffff + ), + linkedin: ( + base: #0077b5, + inverse: #ffffff + ), + skype: ( + base: #00aff0, + inverse: #ffffff + ) +) !default; + +// Root Font Settings +$kt-font-families: ( + regular: unquote('Poppins, Helvetica, sans-serif'), + heading: unquote('Poppins, Helvetica, sans-serif') +) !default; + +// Root Font Settings +$kt-font-size: ( + size: ( + desktop: 13px, + tablet: 12px, + mobile: 12px + ), + weight: 300 +) !default; + +// General Link Settings +$kt-font-color: ( + text: #646c9a, + link: ( + default: kt-state-color(brand), + hover: darken(kt-state-color(brand), 6%) + ) +) !default; + +// Portlet settings +$kt-portlet: ( + min-height: ( + default: ( + desktop: 60px, + mobile: 50px + ), + sm: ( + desktop: 50px, + mobile: 40px + ), + lg: ( + desktop: 80px, + mobile: 60px + ), + xl: ( + desktop: 100px, + mobile: 80px + ) + ), + space: ( + desktop: 25px, + mobile: 15px + ), + bottom-space: ( + desktop: 20px, + mobile: 20px + ), + border-color: kt-base-color(grey, 2), + bg-color: #ffffff, + shadow: 0px 0px 30px 0px rgba(82,63,105,0.05) +) !default; + +// Page padding +$kt-page-padding: ( + desktop: 25px, + mobile: 15px +) !default; + +// Page container width +$kt-page-container-width: 1380px !default; + +// Custom Scroll(Perfect Scrollbar) size +$kt-custom-scroll-size: 4px !default; diff --git a/src/assets/sass/custom/_example-1.scss b/src/assets/sass/custom/_example-1.scss new file mode 100644 index 0000000..069919e --- /dev/null +++ b/src/assets/sass/custom/_example-1.scss @@ -0,0 +1,25 @@ +// +// Custom Example 1 Style +// Here you can put your custom sass code, use global SASS mixings and variables to override the theme or add new styles according to your requirements. +// Most of the changes can be achieved via global or layout level sass variable changes. +// + + +.my-custom-style { + padding: 1rem 0.5rem; + color: kt-brand-color(); + + .my-custom-element { + margin-left: 1rem; + } +} + +@include kt-tablet-and-mobile { + .my-custom-style { + padding: 0.5rem 0.25rem; + + .my-custom-element { + margin-left: 0.5rem; + } + } +} diff --git a/src/assets/sass/custom/_example-2.scss b/src/assets/sass/custom/_example-2.scss new file mode 100644 index 0000000..b45629a --- /dev/null +++ b/src/assets/sass/custom/_example-2.scss @@ -0,0 +1,25 @@ +// +// Custom Example 2 Style +// Here you can put your custom sass code, use global SASS mixings and variables to override the theme or add new styles according to your requirements. +// Most of the changes can be achieved via global or layout level sass variable changes. +// + + +.my-custom-style { + padding: 1rem 0.5rem; + color: kt-brand-color(); + + .my-custom-element { + margin-left: 1rem; + } +} + +@include kt-tablet-and-mobile { + .my-custom-style { + padding: 0.5rem 0.25rem; + + .my-custom-element { + margin-left: 0.5rem; + } + } +} diff --git a/src/assets/sass/global/_functions.scss b/src/assets/sass/global/_functions.scss new file mode 100644 index 0000000..b518247 --- /dev/null +++ b/src/assets/sass/global/_functions.scss @@ -0,0 +1,118 @@ +// +// Helper Functions +// + + + + +@function kt-unitless($number) { + @if type-of($number) == 'number' and not unitless($number) { + @return $number / ($number * 0 + 1); + } + + @return $number; +} + +@function kt-get($map, $keys...) { + @if length($keys) == 1 { + $keys: nth($keys, 1); + } + + $warn: "#{nth($keys, 1)}"; + $length: length($keys); + $get: map-get($map, nth($keys, 1)); + + @if $length > 1 { + @for $i from 2 through $length { + @if $get != null and type-of($get) == 'map' { + $warn: $warn + "->#{nth($keys, $i)}"; + $get: map-get($get, nth($keys, $i)); + + @if $get == null { + @return null; + } + } + @else { + @return kt-get-warning($warn, $get, nth($keys, $i)); + } + } + } + + @return $get; +} + +@function kt-has($map, $keys...) { + @if length($keys) == 1 { + $keys: nth($keys, 1); + } + + $warn: "#{nth($keys, 1)}"; + $length: length($keys); + $get: map-get($map, nth($keys, 1)); + + @if $length > 1 { + @for $i from 2 through $length { + @if $get != null and type-of($get) == 'map' { + $warn: $warn + "->#{nth($keys, $i)}"; + $get: map-get($get, nth($keys, $i)); + + @if $get == null { + @return false; + } + } + @else { + @return false; + } + } + } + + @if $get != null { + @return true; + } + @else { + @return false; + } +} + +@function kt-get-warning($warn, $get, $key) { + @if $get == null { + @warn "Map has no value for key search `#{$warn}`"; + } + @else if type-of($get) != 'map' { + @warn "Non-map value found for key search `#{$warn}`, cannot search for key `#{$key}`"; + } + @return null; +} + +@function kt-display-color($color) { + @if (lightness( $color ) > 50) { + @return darken($color, 50%); + } + @else { + @return lighten($color, 50%); + } +} + +@function kt-state-color($name, $type: null) { + @if ($type == null) { + $type: base; + } + + @return kt-get($kt-state-colors, $name, $type); +} + +@function kt-brand-color($type: null) { + @return kt-state-color(brand, $type); +} + +@function kt-base-color($type, $level) { + @return kt-get($kt-base-colors, $type, $level); +} + +@function kt-media-breakpoint($type) { + @if (kt-has($kt-media-breakpoints, $type)) { + @return kt-get($kt-media-breakpoints, $type); + } @else { + @return $type; + } +} diff --git a/src/assets/sass/global/_include.angular.scss b/src/assets/sass/global/_include.angular.scss new file mode 100644 index 0000000..cf76ce7 --- /dev/null +++ b/src/assets/sass/global/_include.angular.scss @@ -0,0 +1,125 @@ +// +// Global Components And 3rd-party Plugin Customizations +// + + + +// 3rd-party plugins customizations +@import "integration/plugins/perfect-scrollbar"; +@import "integration/plugins/dropzone"; +@import "integration/plugins/fontawesome5"; +@import "integration/plugins/sweetalert2"; +@import "integration/plugins/quill"; +@import "integration/plugins/tagify"; +@import "integration/plugins/tinymce"; +@import "integration/plugins/ckeditor"; +@import "integration/plugins/kanban"; + +// Base components +@import "components/base/container"; +@import "components/base/page-loader"; +@import "components/base/normalize"; +@import "components/base/animations"; +@import "components/base/helpers"; +@import "components/base/mixins/grid"; +@import "components/base/grid"; +@import "components/base/portlet"; +@import "components/base/datatable"; +@import "components/base/scrolltop"; +@import "components/base/form"; +@import "components/base/input-icon"; +@import "components/base/checkbox"; +@import "components/base/radio"; +@import "components/base/switch"; +@import "components/base/option"; +@import "components/base/avatar"; +@import "components/base/spinner"; +@import "components/base/loader"; +@import "components/base/pulse"; +@import "components/base/dialog"; +@import "components/base/mixins/wave"; + +// General components +@import "components/general/grid-nav-v2"; +@import "components/general/grid-nav"; +@import "components/general/head"; +@import "components/general/list-pics"; +@import "components/general/list-timeline"; +@import "components/general/my-cart"; +@import "components/general/nav"; +@import "components/general/notification"; +@import "components/general/notification-v2"; +@import "components/general/profile"; +@import "components/general/notes"; +@import "components/general/timeline-v1"; +@import "components/general/timeline-v2"; +@import "components/general/timeline-v3"; +@import "components/general/user-card"; +@import "components/general/user-card-v2"; +@import "components/general/user-card-v3"; +@import "components/general/media"; +@import "components/general/pagination"; +@import "components/general/searchbar"; +@import "components/general/callout"; +@import "components/general/iconbox"; +@import "components/general/infobox"; +@import "components/general/ribbon"; +@import "components/general/chat"; + +// Layout components +@import "components/layout/demo-panel"; +@import "components/layout/offcanvas-panel"; +@import "components/layout/quick-panel"; +@import "components/layout/quick-search"; +@import "components/layout/scroll"; +@import "components/layout/sticky-toolbar"; +@import "components/layout/app"; +@import "components/layout/subheader"; + +// Typography components +@import "components/typography/badge"; +@import "components/typography/demo"; +@import "components/typography/divider"; +@import "components/typography/heading"; +@import "components/typography/link"; +@import "components/typography/section"; +@import "components/typography/separator"; +@import "components/typography/svg-icon"; + +// Widget components +@import "components/widgets/dashboard/widget1"; +@import "components/widgets/dashboard/widget2"; +@import "components/widgets/dashboard/widget3"; +@import "components/widgets/dashboard/widget4"; +@import "components/widgets/dashboard/widget5"; +@import "components/widgets/dashboard/widget6"; +@import "components/widgets/dashboard/widget7"; +@import "components/widgets/dashboard/widget9"; +@import "components/widgets/dashboard/widget10"; +@import "components/widgets/dashboard/widget11"; +@import "components/widgets/dashboard/widget12"; +@import "components/widgets/dashboard/widget13"; +@import "components/widgets/dashboard/widget14"; +@import "components/widgets/dashboard/widget15"; +@import "components/widgets/dashboard/widget16"; +@import "components/widgets/dashboard/widget17"; +@import "components/widgets/dashboard/widget19"; +@import "components/widgets/dashboard/widget20"; +@import "components/widgets/dashboard/widget21"; +@import "components/widgets/dashboard/widget24"; +@import "components/widgets/dashboard/widget25"; +@import "components/widgets/dashboard/widget26"; +@import "components/widgets/dashboard/widget27"; +@import "components/widgets/dashboard/widget28"; +@import "components/widgets/dashboard/widget29"; +@import "components/widgets/dashboard/widget30"; +@import "components/widgets/dashboard/widget31"; +@import "components/widgets/dashboard/widget32"; +@import "components/widgets/dashboard/widget33"; + +@import "components/widgets/general/profile-1"; +@import "components/widgets/general/profile-2"; +@import "components/widgets/general/profile-3"; +@import "components/widgets/general/profile-4"; +@import "components/widgets/general/users"; +@import "components/widgets/general/project-1"; diff --git a/src/assets/sass/global/_init.scss b/src/assets/sass/global/_init.scss new file mode 100644 index 0000000..2da0ddc --- /dev/null +++ b/src/assets/sass/global/_init.scss @@ -0,0 +1,22 @@ +// +// Main init file of global functions and mixins +// + + + +// Functions +@import "functions"; + +// Mixins +@import "mixins"; +@import "integration/plugins/mixins/perfect-scrollbar"; +@import "components/base/mixins/grid"; +@import "components/base/mixins/burger-menu"; +@import "components/base/mixins/menu-horizontal"; +@import "components/base/mixins/menu-vertical"; +@import "components/base/mixins/offcanvas"; +@import "components/base/mixins/spinner"; +@import "components/base/mixins/wave"; +@import "components/layout/mixins/app"; +@import "components/typography/mixins/link"; +@import "components/general/mixins/media"; diff --git a/src/assets/sass/global/_mixins.scss b/src/assets/sass/global/_mixins.scss new file mode 100644 index 0000000..e16b8ec --- /dev/null +++ b/src/assets/sass/global/_mixins.scss @@ -0,0 +1,387 @@ +// +// Global Mixins +// + + + + +@mixin kt-clearfix() { + &:before, + &:after { + content: " "; // 1 + display: table; // 2 + } + &:after { + clear: both; + } +} + +@mixin kt-button-reset() { + appearance: none; + box-shadow: none; + border-radius: none; + border: none; + cursor: pointer; + background: none; + outline: none !important; + margin: 0; + padding: 0; +} + +@mixin kt-input-reset() { + border: 0; + background: none; + outline: none !important; + box-shadow: none; +} + +@mixin kt-btn-reset() { + border: 0; + background: none; + outline: none !important; + box-shadow: none; + outline: none !important; +} + +@mixin kt-fix-fixed-position-lags() { + // webkit hack for smooth font view on fixed positioned elements + -webkit-backface-visibility:hidden; + backface-visibility:hidden; +} + +@mixin kt-fix-animation-lags() { + transform: translateZ(0); + -webkit-transform-style: preserve-3d; +} + +@mixin kt-attr($attr, $value, $important: '') { + @if $value != null { + #{$attr}: #{$value} #{$important}; + } +} + +@mixin kt-hack-ie { + //IE10 and IE11 + @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + @content; + } +} + +@mixin kt-hack-edge-all { + @supports (-ms-ime-align:auto) { + @content; + } +} + +@mixin kt-rounded { + @if $kt-rounded == true { + @content; + } +} + +@mixin kt-not-rounded { + @if $kt-rounded == false { + @content; + } +} + +// Input placeholder color +@mixin kt-input-placeholder($color) { + &::-moz-placeholder { + color: $color; + opacity: 1; + } + // See https://github.com/twbs/bootstrap/pull/11526 + &:-ms-input-placeholder { + color: $color; + } + // Internet Explorer 10+ + &::-webkit-input-placeholder { + color: $color; + } + // Safari and Chrome +} + +@mixin kt-hover-transition { + transition: $kt-transition; + + &:hover { + transition: $kt-transition; + } +} + +@mixin kt-transition { + transition: $kt-transition; +} + +// Icon Sizing +// SASS Map: (lineawesome: 1.1rem, fontawesome: 1.2rem, flaticon: 1.1rem) +@mixin kt-icons-size($config) { + // Lineawesome + [class^="la-"], + [class*=" la-"] { + font-size: kt-get($config, lineawesome); + } + + // Fontawesome + [class^="fa-"], + [class*=" fa-"] { + font-size: kt-get($config, fontawesome); + } + + // Flaticon + [class^="flaticon-"], + [class*=" flaticon-"], + [class^="flaticon2-"], + [class*=" flaticon2-"] { + font-size: kt-get($config, flaticon); + } +} + +// Icon attr +// SASS Map: (lineawesome: 1.1rem, fontawesome: 1.2rem, flaticon: 1.1rem) +@mixin kt-icons-style($attr, $config) { + // lineawesome + [class^="la-"], + [class*=" la-"] { + #{$attr}: kt-get($config, lineawesome); + } + + // Fontawesome + [class^="fa-"], + [class*=" fa-"] { + #{$attr}: kt-get($config, fontawesome); + } + + // Flaticon + [class^="flaticon-"], + [class*=" flaticon-"], + [class^="flaticon2-"], + [class*=" flaticon2-"] { + #{$attr}: kt-get($config, flaticon); + } +} + +// SASS Map: (lineawesome: 1.1rem, fontawesome: 1.2rem, flaticon: 1.1rem) +@mixin kt-icons { + [class^="la-"], + [class*=" la-"], + [class^="fa-"], + [class*=" fa-"], + [class^="flaticon-"], + [class*=" flaticon-"], + [class^="flaticon2-"], + [class*=" flaticon2-"] { + @content; + } +} + +// Lineawesome icon +@mixin kt-la-icon($icon) { + font-family: "LineAwesome"; + text-decoration: inherit; + text-rendering: optimizeLegibility; + text-transform: none; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-smoothing: antialiased; + + &:before { + content: "#{$icon}"; + } +} + +@mixin kt-la-icon-change($icon) { + &:before { + content: "#{$icon}"; + } +} + +@mixin kt-flaticon2-icon($icon) { + font-family: Flaticon2; + font-style: normal; + font-weight: normal; + font-variant: normal; + line-height: 1; + text-decoration: inherit; + text-rendering: optimizeLegibility; + text-transform: none; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-smoothing: antialiased; + content: "#{$icon}"; +} + +// Lineawesome icon +@mixin kt-la-icon-self($icon) { + font-family: "LineAwesome"; + text-decoration: inherit; + text-rendering: optimizeLegibility; + text-transform: none; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-smoothing: antialiased; + content: "#{$icon}"; +} + +// Close icon +@mixin kt-close-icon($self:null) { + @if $self == true { + @include kt-la-icon-self( kt-get($kt-action-icons, close) ); + } @else { + @include kt-la-icon( kt-get($kt-action-icons, close) ); + } +} + +// Arrow icon +@mixin kt-arrow-icon($dir, $self:null) { + @if $dir == down { + @if $self == true { + @include kt-la-icon-self( kt-get($kt-action-icons, down) ); + } @else { + @include kt-la-icon( kt-get($kt-action-icons, down) ); + } + } + + @if $dir == up { + @if $self == true { + @include kt-la-icon-self( kt-get($kt-action-icons, up) ); + } @else { + @include kt-la-icon( kt-get($kt-action-icons, up) ); + } + } + + @if $dir == left { + @if $self == true { + @include kt-la-icon-self( kt-get($kt-action-icons, left) ); + } @else { + @include kt-la-icon( kt-get($kt-action-icons, left) ); + } + } + + @if $dir == right { + @if $self == true { + @include kt-la-icon-self( kt-get($kt-action-icons, right) ); + } @else { + @include kt-la-icon( kt-get($kt-action-icons, right) ); + } + } +} + +// Svg icon color +@mixin kt-svg-icon-color($color) { + g { + [fill] { + transition: fill 0.3s ease; + fill: $color; + } + } + + &:hover { + g { + [fill] { + transition: fill 0.3s ease; + } + } + } +} + +// Breakpoint mixins +// Layout Breakpoints +// Define the minimum and maximum dimensions at which your layout will change, adapting to different screen sizes, for use in media queries. + +@mixin kt-media-below($width) { + @media (max-width: #{kt-media-breakpoint($width)}) { + @content; + } +} + +@mixin kt-media-above($width) { + @media (min-width: #{kt-media-breakpoint($width) + 1px}) { + @content; + } +} + +@mixin kt-media-range($from, $to) { + @media (min-width: #{kt-media-breakpoint($from) + 1px}) and (max-width: #{kt-media-breakpoint($to)}) { + @content; + } +} + +@mixin kt-minimal-desktop { + @media (min-width: #{kt-media-breakpoint(lg) + 1px}) and (max-width: #{kt-media-breakpoint(xl)}) { + @content; + } +} + +@mixin kt-minimal-desktop-and-below { + @media (max-width: #{kt-media-breakpoint(xl)}) { + @content; + } +} + +@mixin kt-desktop { + @media (min-width: #{kt-media-breakpoint(lg) + 1px}) { + @content; + } +} + +@mixin kt-desktop-xl { + @media (min-width: #{kt-media-breakpoint(xl) + 1px}) { + @content; + } +} + +@mixin kt-desktop-xxl { + @media (min-width: #{kt-media-breakpoint(xxl) + 1px}) { + @content; + } +} + +@mixin kt-desktop-and-tablet { + @media (min-width: #{kt-media-breakpoint(md) + 1px}) { + @content; + } +} + +@mixin kt-tablet { + @media (min-width: #{kt-media-breakpoint(md) + 1px}) and (max-width: #{kt-media-breakpoint(lg)}) { + @content; + } +} + +@mixin kt-tablet-and-mobile { + @media (max-width: #{kt-media-breakpoint(lg)}) { + @content; + } +} + +@mixin kt-mobile { + @media (max-width: #{kt-media-breakpoint(md)}) { + @content; + } +} + +@mixin kt-mobile-sm { + @media (max-width: #{kt-media-breakpoint(sm)}) { + @content; + } +} + +@mixin kt-responsive-below($width) { + @media (max-width: #{$width}) { + @content; + } +} + +@mixin kt-responsive-above($width) { + @media (min-width: #{$width}) { + @content; + } +} + +@mixin kt-responsive-range($from, $to) { + @media (min-width: #{$from}) and (max-width: #{$to}) { + @content; + } +} diff --git a/src/assets/sass/global/components/base/_animations.scss b/src/assets/sass/global/components/base/_animations.scss new file mode 100644 index 0000000..1815288 --- /dev/null +++ b/src/assets/sass/global/components/base/_animations.scss @@ -0,0 +1,88 @@ +// +// Base Animations +// + + + + +// Classes +.kt-animate-fade-in-up { + animation: kt-animate-fade-in-up .5s; +} + +.kt-animate-fade-out { + animation: kt-animate-fade-out .5s; +} + +.kt-animate-fade-in { + animation: kt-animate-fade-in .5s; +} + +.kt-animate-blink { + animation: kt-animate-blink 1s step-start 0s infinite; + animation-fill-mode: initial; +} + +.kt-animate-shake { + animation: kt-animate-shake 0.1s ease-in 0.1s infinite alternate; + animation-fill-mode: initial; +} + +.kt-animate-pause { + animation-play-state:paused; +} + +.kt-notransition { + transition: none !important; +} + +// Animations + +@keyframes kt-animate-fade-out { + from { opacity: 1; } + to { opacity: 0; } +} + +@keyframes kt-animate-fade-in { + from { opacity: 0; } + to { opacity: 1; } +} + +@keyframes kt-animate-fade-in-up { + from { + opacity: 0; + transform: translateY(15px); + } + + to { opacity: 1; + transform: translateY(0px); + } +} + +@keyframes kt-animate-fade-out-up { + from { + opacity: 1; + transform: translateY(15px); + } + + to { opacity: 0; + transform: translateY(0px); + } +} + +@keyframes kt-animate-blink { + 50% { + opacity: 0.0; + } +} + +@keyframes kt-animate-shake { + from { + transform: rotate(13deg); + } + + to { + -webkit-transform-origin:center center; + transform: rotate(-13deg); + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/base/_avatar.scss b/src/assets/sass/global/components/base/_avatar.scss new file mode 100644 index 0000000..373560e --- /dev/null +++ b/src/assets/sass/global/components/base/_avatar.scss @@ -0,0 +1,136 @@ +// +// Avatar +// + + + +// Base +.kt-avatar { + position: relative; + display: inline-block; + + .kt-avatar__holder { + width: 120px; + height: 120px; + border-radius: 3px; + background-repeat: no-repeat; + background-size: cover; + } + + .kt-avatar__upload { + cursor: pointer; + display:flex; + align-items: center; + justify-content: center; + position: absolute; + right: -10px; + top: -10px; + width: 30px; + height: 30px; + border-radius: 50%; + background-color: #ffffff; + box-shadow: 0px 0px 13px 0px rgba(#000000, 0.1); + + input { + width: 0 !important; + height: 0 !important; + overflow: hidden; + opacity: 0; + } + + i { + color: kt-brand-color(); + font-size: 0.9rem; + } + + + @include kt-transition(); + &:hover{ + @include kt-transition(); + background-color: kt-brand-color(); + + i { + color: kt-brand-color(inverse); + } + } + } + + .kt-avatar__cancel { + cursor: pointer; + align-items: center; + justify-content: center; + position: absolute; + top: auto; + right: -10px; + bottom: -5px; + width: 22px; + height: 22px; + border-radius: 50%; + background-color: #ffffff; + box-shadow: 0px 0px 13px 0px rgba(#000000, 0.1); + display: none; + + i { + @include kt-transition(); + color: kt-base-color(label, 2); + font-size: 0.9rem; + } + + &:hover{ + i { + @include kt-transition(); + color: kt-brand-color(); + } + } + } + + &.kt-avatar--changed { + .kt-avatar__cancel { + display: flex; + } + } + + // States + @each $name, $color in $kt-state-colors { + &.kt-avatar--#{$name} { + .kt-avatar__upload { + i { + color: kt-get($color, base); + } + + &:hover{ + background-color: kt-get($color, base); + + i { + color: kt-get($color, inverse); + } + } + } + } + } + + // Circle style + &.kt-avatar--circle { + .kt-avatar__holder { + border-radius: 50%; + } + + .kt-avatar__upload { + right: 0px; + top: 5px; + } + + .kt-avatar__cancel { + right: 3px; + bottom: 10px; + } + } + + // Bordered style + &.kt-avatar--outline { + .kt-avatar__holder { + border: 3px solid #ffffff; + box-shadow: 0px 0px 13px 0px rgba(#000000, 0.1); + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/base/_checkbox.scss b/src/assets/sass/global/components/base/_checkbox.scss new file mode 100644 index 0000000..2af4b14 --- /dev/null +++ b/src/assets/sass/global/components/base/_checkbox.scss @@ -0,0 +1,306 @@ +// +// Checkbox +// + + + + +// Config +$kt-checkbox-base-color: kt-base-color(grey, 1); + +$kt-checkbox-config: ( + self: ( + transition: all 0.3s ease, + size: 18px, + tick: 6px + ), + + outline: ( + border: ( + default: darken($kt-checkbox-base-color, 12%), + checked: darken($kt-checkbox-base-color, 15%) + ), + tick: darken($kt-checkbox-base-color, 18%) + ), + + solid: ( + bg: ( + default: darken($kt-checkbox-base-color, 6%), + checked: darken($kt-checkbox-base-color, 8%) + ), + tick: darken($kt-checkbox-base-color, 30%) + ) +); + +// Base +.kt-checkbox { + display: inline-block; + position: relative; + padding-left: 30px; + margin-bottom: 10px; + text-align: left; + cursor: pointer; + font-size: 1rem; + transition: kt-get($kt-checkbox-config, self, transition); + + &.kt-checkbox--disabled { + opacity: 0.8; + cursor: not-allowed; + } + + // Hide default browser input + > input { + position: absolute; + z-index: -1; + opacity: 0; + } + + > span { + @include kt-rounded { + border-radius: 3px; + } + + background: none; + position: absolute; + top: 1px; + left: 0; + height: kt-get($kt-checkbox-config, self, size); + width: kt-get($kt-checkbox-config, self, size); + + &:after { + content:''; + position: absolute; + display: none; // Hide check + top: 50%; + left: 50%; + margin-left: -2px; + margin-top: -6px; + width: 5px; + height: 10px; + border-width: 0 2px 2px 0#{'/*rtl:ignore*/'} !important; + transform: rotate(45deg)#{'/*rtl:ignore*/'}; + } + } + + > input:checked ~ span { + transition: kt-get($kt-checkbox-config, self, transition); + background: none; + &:after { + display: block; + } + } + + &:hover > input:not([disabled]):checked ~ span, + > input:checked ~ span { + transition: kt-get($kt-checkbox-config, self, transition); + + } + + > input:disabled ~ span { + opacity: 0.6; + pointer-events: none; + } + + &.kt-checkbox--solid { + > span { + border: 1px solid transparent; + } + + &:hover > input:not([disabled]) ~ span, + > input:focus ~ span { + transition: kt-get($kt-checkbox-config, self, transition); + } + } + + &.kt-checkbox--square { + > span { + border-radius: 0; + } + } + + &.kt-checkbox--bold > span { + border-width: 2px !important; + transition: kt-get($kt-checkbox-config, self, transition); + } + + .form-inline & { + margin-left: 15px; + margin-right: 15px; + } + + &.kt-checkbox--single { + width: kt-get($kt-checkbox-config, self, size); + height: kt-get($kt-checkbox-config, self, size); + + > span { + top: 0px; + } + + th > &, + td > & { + right: -5px; + } + } + + // Input group + .input-group & { + margin-bottom: 0 !important; + padding-left: 0; + } +} + +.kt-checkbox-list { + padding: 0 0; + + .form-horizontal .form-group & { + padding-top: 0; + } + + .kt-checkbox { + text-align: left; + display: block; + + &:last-child { + margin-bottom: 5px; + } + } +} + +.kt-checkbox-inline { + padding: 0 0; + + .kt-checkbox { + display: inline-block; + margin-right: 15px; + margin-bottom: 5px; + + &:last-child { + margin-right: 0; + } + } +} + +.form-group.row { + .kt-checkbox-inline { + margin-top: 0.75rem; + } + + .kt-checkbox-list { + margin-top: 2px; + } +} + +// Skin +@mixin kt-checkbox-theme( + $outline-border-color, + $outline-border-checked-color, + $outline-tick-color, + $solid-bg-color, + $solid-bg-checked-color, + $solid-tick-color) { + + &.kt-checkbox--disabled { + opacity: 0.7; + } + + // Outline + > span { + border: 1px solid $outline-border-color; + + &:after { + border: solid $outline-tick-color; + } + } + + > input:disabled ~ span { + &:after { + border-color: $outline-border-checked-color; + } + } + + > input:checked ~ span { + border: 1px solid $outline-border-checked-color; + } + + &.kt-checkbox--bold > input:checked ~ span { + border: 2px solid $outline-border-checked-color; + } + + > input:disabled ~ span { + opacity: 0.6; + } + + // Solid + &.kt-checkbox--solid { + > span { + background: $solid-bg-color; + border: 1px solid transparent !important; + + &:after { + border: solid $solid-tick-color; + } + } + + + > input:focus ~ span { + border: 1px solid transparent !important; + } + + > input:checked ~ span { + background: $solid-bg-checked-color; + } + } + + // Tick + &.kt-checkbox--tick { + > span { + background:kt-get($kt-checkbox-config, solid, bg, default); + border: 1px solid transparent !important; + + &:after { + border: solid $solid-tick-color; + } + } + + > input:focus ~ span { + border: 1px solid transparent !important; + } + + > input:checked ~ span { + border: 1px solid transparent !important; + background: kt-get($kt-checkbox-config, solid, bg, default); + + &:after { + border: solid $solid-bg-checked-color; + } + } + } +} + +// Default +.kt-checkbox { + // Base + @include kt-checkbox-theme( + kt-get($kt-checkbox-config, outline, border, default), + kt-get($kt-checkbox-config, outline, border, checked), + kt-get($kt-checkbox-config, outline, tick), + kt-get($kt-checkbox-config, solid, bg, default), + kt-get($kt-checkbox-config, solid, bg, checked), + kt-get($kt-checkbox-config, solid, tick) + ); + + // State Colors + @each $name, $color in $kt-state-colors { + // default state + &.kt-checkbox--#{$name} { + @include kt-checkbox-theme( + kt-get($color, base), + kt-get($color, base), + kt-get($color, base), + kt-get($color, base), + kt-get($color, base), + kt-get($color, inverse) + ); + } + } +} diff --git a/src/assets/sass/global/components/base/_container.scss b/src/assets/sass/global/components/base/_container.scss new file mode 100644 index 0000000..7ea78b6 --- /dev/null +++ b/src/assets/sass/global/components/base/_container.scss @@ -0,0 +1,37 @@ +// +// Container +// + + + +// Base +.kt-container { + &, + &.kt-container--fluid { + width: 100%; + margin: 0; + } + + &.kt-container--fit { + padding: 0 !important; + } + + &.kt-container--fit-left { + padding-left: 0 !important; + } + + &.kt-container--fit-right { + padding-right: 0 !important; + } +} +@media (min-width: #{$kt-page-container-width + (2 * kt-get($kt-page-padding, desktop)) - 1px}) { + .kt-container { + width: $kt-page-container-width; + margin: 0 auto; + + &.kt-container--fluid { + width: 100%; + margin: 0; + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/base/_datatable.scss b/src/assets/sass/global/components/base/_datatable.scss new file mode 100644 index 0000000..edace7e --- /dev/null +++ b/src/assets/sass/global/components/base/_datatable.scss @@ -0,0 +1,884 @@ +// +// KTDatatable +// + + + + +// Base +@mixin kt-datatable-base() { + // Pagination + $page-size: 2.25rem; + $table-space: kt-get($kt-portlet, space, desktop); + $table-space-mobile: kt-get($kt-portlet, space, mobile); + + .kt-datatable { + display: none; + } + + .kt-datatable.kt-datatable--default { + display: block; + margin-bottom: $table-space; + + // Base + > .kt-datatable__table { + border-collapse: collapse; + overflow: hidden; + display: none; + width: 100%; + + > .kt-datatable__head, + > .kt-datatable__body, + > .kt-datatable__foot { + visibility: hidden; + display: block; + + .kt-datatable__row { + width: 100%; + + > .kt-datatable__cell { + // Row cell base + vertical-align: middle; + padding: 10px; + font-size: 1rem; + + &:first-child { + padding-left: $table-space; + } + + &:last-child { + padding-right: $table-space; + } + + i { + //font-size: 1.4rem; + } + + &.kt-datatable__cell--left { + text-align: left; + > span { + text-align: left; + } + } + + &.kt-datatable__cell--right { + text-align: right; + > span { + text-align: right; + > i { + right: 0; + } + } + } + + &.kt-datatable__cell--center { + text-align: center; + > span { + text-align: center; + } + } + + &.kt-datatable__cell--sort { + cursor: pointer; + + i { + font-size: 0.6rem; + } + } + + &.kt-datatable__cell--resizing { + cursor: col-resize; + } + + > span { + display: block; + overflow: hidden; + text-overflow: ellipsis; + } + + // Row checkbox + &.kt-datatable__cell--check { + text-align: center; + + > span { + overflow: visible; + + > .kt-checkbox { + top: 2px; + padding: 0; + margin: 0 0 0 0; + } + } + } + + // Row details + &.kt-datatable__toggle-detail { + > span { + width: 12px; + } + > .kt-datatable__toggle-detail { + display: inline-block; + text-align: right; + + > i { + font-size: 1.4rem; + width: 12px; + } + } + } + + // Cell dropdown menu + .dropdown { + display: inline-block; + + .dropdown-menu { + margin-top: 0.5rem; + } + + &.dropup { + .dropdown-menu { + margin-top: auto; + margin-bottom: 0.5rem; + } + } + + .dropdown-menu.dropdown-menu-right { + margin-right: -0.8rem; + /*rtl:ignore*/ + margin-left: 65px; + } + + .dropdown-menu.dropdown-menu-left { + margin-left: -10rem; + } + } + } + } + + > .kt-datatable__lock { + border: 0; + } + } + + > .kt-datatable__head, + > .kt-datatable__foot { + .kt-datatable__row { + > .kt-datatable__cell { + > span { + font-weight: 500; + vertical-align: middle; + } + } + } + } + + > .kt-datatable__head { + .kt-datatable__row { + > .kt-datatable__cell { + padding: 16px 10px; + + > span { + > i { + display: inline-block; + position: relative; + right: -10px; + line-height: 0; + vertical-align: middle; + font-size: 1.1rem; + } + } + } + } + } + + > .kt-datatable__body { + &.ps { + padding-bottom: 0; + } + + .kt-datatable__row { + > .kt-datatable__cell { + font-weight: regular; + + &.kt-datatable__cell--check { + > span { + > .kt-checkbox { + top: 1px; + } + } + } + } + } + + .kt-datatable__row-detail { + display: block; + .kt-datatable__detail { + display: block; + padding: 0 ($table-space + 35px); + + .kt-datatable__row { + display: table-row; + + > .kt-datatable__cell { + padding: 8px 12px; + text-align: left; + vertical-align: top; + + > span { + width: auto !important; + } + + &:first-child { + font-weight: 500; + } + + &:last-child { + font-weight: regular; + padding-left: 20px; + } + } + } + } + } + } + } + + // Error message + &.kt-datatable--error { + .kt-datatable__body { + padding: 30px; + text-align: center; + } + } + + // Lock state + &.kt-datatable--lock { + > .kt-datatable__table { + > .kt-datatable__head, + > .kt-datatable__body, + > .kt-datatable__foot { + > .kt-datatable__lock { + display: inline-block; + position: relative; + vertical-align: top; + overflow: hidden; + } + } + } + } + + // Loaded state + &.kt-datatable--loaded { + display: block; + + > .kt-datatable__table { + display: block; + + > .kt-datatable__head, + > .kt-datatable__body, + > .kt-datatable__foot { + visibility: visible; + display: block; + position: relative; + + .kt-datatable__row { + display: table; + table-layout: initial; + + > .kt-datatable__cell { + //display: table-cell; + } + } + } + } + } + + // Scrollable state + &.kt-datatable--scroll { + > .kt-datatable__table { + display: block; + + > .kt-datatable__head, + > .kt-datatable__body, + > .kt-datatable__foot { + } + + > .kt-datatable__head, + > .kt-datatable__foot { + overflow: hidden; + + .kt-datatable__row { + position: relative; + } + } + + > .kt-datatable__body { + overflow: hidden; + } + } + } + + > .kt-datatable__pager { + margin: 0px; + padding: $table-space; + padding-bottom: 0; + display: flex; + justify-content: space-between; + flex-wrap: wrap; + + &.kt-datatable__pager--top { + margin-bottom: 20px; + } + + > .kt-datatable__pager-nav { + margin: 0; + padding: 0; + display: flex; + + > li { + padding: 0; + margin-right: 5px; + display: inline-block; + + &:last-child { + margin-right: 0; + } + + > .kt-datatable__pager-link { + cursor: pointer; + display: flex; + justify-content: center; + align-items: center; + height: $page-size; + min-width: $page-size; + padding: 0.5rem; + border-radius: 3px; + + @include kt-not-rounded { + border-radius: 0; + } + + position: relative; + font-size: 1rem; + line-height: 1rem; + font-weight: 500; + + > i { + font-size: 0.6rem; + text-align: center; + display: inline-block; + } + + &.kt-datatable__pager-link--more-prev, + &.kt-datatable__pager-link--more-next { + font-weight: 600; + } + } + + > .kt-pager-input { + height: $page-size; + width: 3.5rem; + text-align: center; + + @include kt-rounded { + border-radius: 3px !important; + } + } + } + } + + > .kt-datatable__pager-info { + display: flex; + align-items: center; + + .kt-datatable__pager-size { + margin-right: 10px; + + .btn.dropdown-toggle { + //border-radius: 3px !important; + height: $page-size; + padding: 0.45rem 1rem; + + @include kt-not-rounded { + border-radius: 0 !important; + } + } + + .dropdown-menu.inner > li.selected > a span.check-mark { + margin-top: -0.6rem; + } + } + } + } + + // Subtable + &.kt-datatable--subtable { + > .kt-datatable__table { + margin-bottom: 0; + + > .kt-datatable__head, + > .kt-datatable__body, + > .kt-datatable__foot { + .kt-datatable__row { + //width: 100%; + } + + .kt-datatable__toggle-subtable { + display: flex; + justify-content: center; + align-items: center; + + > i { + line-height: 0; + font-size: 1.4rem; + } + + &:hover { + text-decoration: none; + } + } + + .kt-datatable__row-subtable { + display: table; + width: 100%; + + > .kt-datatable__subtable { + padding: 20px; + + > .kt-datatable { + > .kt-datatable__pager { + padding-top: 10px; + padding-bottom: 10px; + } + } + } + } + } + } + } + } + + @include kt-mobile { + .kt-datatable.kt-datatable--default { + margin-bottom: $table-space-mobile; + + > .kt-datatable__table { + > .kt-datatable__head, + > .kt-datatable__body, + > .kt-datatable__foot { + .kt-datatable__row { + > .kt-datatable__cell { + &:first-child { + padding-left: $table-space-mobile; + } + + &:last-child { + padding-right: $table-space-mobile; + } + } + } + } + } + + > .kt-datatable__pager { + margin: 0; + padding: $table-space-mobile $table-space-mobile $table-space-mobile/2 $table-space-mobile; + + .kt-datatable__pager-nav, + .kt-datatable__pager-info { + margin-top: 10px; + } + } + } + } +} + +// Skin +@mixin kt-datatable-skin() { + .kt-datatable { + // Base color + $base_color: #f9fbfe; + + // Scrollbar + $scrollbar_color: darken(kt-base-color(shape, 2), 3%); + + // Table + $base_bg: #fff; + + // Head + $head_cell_bg: transparent; + $head_cell_color: kt-base-color(label, 3); + $head_cell_sorted_color: kt-state-color(brand); + $head_cell_icon_color: kt-state-color(brand); + + // Checkbox + $checkbox_bg: kt-base-color(shape, 1); + $checkbox_checked_bg: kt-base-color(shape, 2); + + // Row colors + $row-border-color: kt-base-color(shape, 1); + $row-even: transparent; + $row-hover: transparent; + $row-active: kt-base-color(grey, 1); + + // Body cell + $body_cell_font_color: kt-base-color(label, 3); + + // Lock table shadow + $lock-shadow: 0px 0px 17px 5px rgba(113, 106, 202, 0.14); + + // Subtable + $subtable_toggle_icon: kt-state-color(brand); + $subtable_expanded: $row-active; + $subtable_pager_pagel: $base-color; + $subtable_shadow: 0px 0px 15px 1px rgba(113, 106, 202, 0.1); + + $detail_icon_color: kt-state-color(brand); //kt-base-color(shape, 2); + $detail_icon_color_hover: kt-state-color(brand); + + // Pagination colors + $page-default: kt-base-color(shape, 1); + $page-default-font: kt-base-color(shape, 3); + $page-hover: kt-state-color(brand); + $page-hover-font: kt-state-color(brand, inverse); + $page-active: kt-state-color(brand); + $page-active-font: kt-state-color(brand, inverse); + + $page-info: kt-base-color(shape, 1); + $page-info-font: kt-base-color(shape, 3); + $page-info-hover: kt-state-color(brand); + $page-info-hover-font: kt-state-color(brand, inverse); + + // Base Table + > .kt-datatable__table { + background-color: $base_bg; + //border-bottom: 1px solid $row-border-color; + + // General + > .kt-datatable__head, + > .kt-datatable__body, + > .kt-datatable__foot { + > .kt-datatable__lock { + &.kt-datatable__lock--left { + z-index: 1; + box-shadow: $lock-shadow; + } + + &.kt-datatable__lock--right { + box-shadow: $lock-shadow; + } + + &.kt-datatable__lock--scroll { + position: relative; + } + } + + .kt-datatable__row { + border-bottom: 1px solid $row-border-color; + + > .kt-datatable__cell { + .kt-checkbox.kt-checkbox--solid > span { + background: $checkbox_bg; + } + + .kt-checkbox.kt-checkbox--solid > input:checked ~ span { + background: $checkbox_checked_bg; + } + } + } + } + + // Body + > .kt-datatable__body { + .kt-datatable__toggle-detail { + vertical-align: middle; + i { + transition: color 0.3s ease; + color: $detail_icon_color; + + &:before { + line-height: 0; + vertical-align: middle; + } + } + + &:hover, + &.kt-datatable__toggle-detail--active { + i { + transition: color 0.3s ease; + color: $detail_icon_color_hover; + } + } + } + + .kt-datatable__row-detail { + .kt-datatable__detail { + table { + border-left: 1px solid $row-border-color; + border-right: 1px solid $row-border-color; + } + } + } + } + + // Head & Foot + > .kt-datatable__head, + > .kt-datatable__foot { + .kt-datatable__row { + > .kt-datatable__cell { + background: $head_cell_bg; + + > span { + color: $head_cell_color; + } + } + } + } + + // Head + > .kt-datatable__head { + .kt-datatable__row { + > .kt-datatable__cell { + > span { + > i { + color: $head_cell_icon_color; + } + } + } + } + } + + // Error message + &.kt-datatable--error { + .kt-datatable__body { + .kt-datatable__error { + + } + } + } + } + + // Pagination + > .kt-datatable__pager { + > .kt-datatable__pager-nav { + > li { + > .kt-datatable__pager-link { + color: $page-default-font; + + @include kt-transition(); + + &.kt-datatable__pager-link--first, + &.kt-datatable__pager-link--prev, + &.kt-datatable__pager-link--next, + &.kt-datatable__pager-link--last { + background: $page-default; + + &:hover { + background: $page-hover; + color: $page-hover-font; + } + } + + &:hover { + @include kt-transition(); + background: $page-hover; + color: $page-hover-font; + } + + &.kt-datatable__pager-link--active { + background: $page-active; + color: $page-active-font; + } + + &.kt-datatable__pager-link--disabled, + &.kt-datatable__pager-link--disabled:hover { + color: $page-default-font; + background: $page-default; + opacity: 0.3; + } + } + + > .kt-pager-input { + @include kt-transition(); + background: $page-default; + border-color: $page-default; + + &:focus { + @include kt-transition(); + background: $page-hover; + border-color: $page-hover; + } + } + } + } + + > .kt-datatable__pager-info { + .kt-datatable__pager-size { + .btn.dropdown-toggle { + font-size: 1rem; + font-weight: 500; + border: 0 !important; + color: $page-info-font; + background: $page-info; + + i { + color: $page-info-hover-font; + } + } + + .btn.dropdown-toggle:focus, + .btn.dropdown-toggle:hover, + &.show > .btn.dropdown-toggle { + border: 0 !important; + color: $page-info-hover-font !important; + background: $page-info-hover; + + i { + color: $page-info-hover-font !important; + } + } + + .dropdown-menu { + z-index: 100; + + .modal & { + z-index: $kt-modal-zindex + 1; + } + } + } + } + } + + // Subtable + &.kt-datatable--subtable { + > .kt-datatable__table { + > .kt-datatable__body { + .kt-datatable__toggle-subtable { + > i { + color: $subtable_toggle_icon; + } + } + + .kt-datatable__row-subtable { + border-top: 0; + + .kt-datatable__pager { + //background: $subtable_pager_pagel; + } + } + } + } + } + + // Default Skin + &.kt-datatable--default { + // Base Table + > .kt-datatable__table { + > .kt-datatable__body { + .kt-datatable__row { + > .kt-datatable__cell { + transition: background 0.3s ease; + + > span { + color: $body_cell_font_color; + } + + &.kt-datatable__cell--hover { + transition: background 0.3s ease; + background: $row-hover; + } + } + + &.kt-datatable__row--even { + > .kt-datatable__cell { + background: $row-even; + } + } + + &.kt-datatable__row--active { + > .kt-datatable__cell { + background: $row-active; + } + } + + &.kt-datatable__row--hover:not(.kt-datatable__row--active) { + transition: background 0.3s ease; + + > .kt-datatable__cell { + transition: background 0.3s ease; + background: $row-hover; + } + } + } + } + + > .kt-datatable__head, + > .kt-datatable__foot { + .kt-datatable__row { + > .kt-datatable__cell { + &.kt-datatable__cell--sorted { + > span { + color: $head_cell_sorted_color; + } + } + } + } + } + + } + + // Subtable + &.kt-datatable--subtable { + > .kt-datatable__table { + > .kt-datatable__body { + .kt-datatable__row { + &.kt-datatable__row--subtable-expanded { + > .kt-datatable__cell { + background: $subtable_expanded !important; + } + } + } + + .kt-datatable__row-subtable { + background: $row-even; + + > .kt-datatable__subtable { + > .kt-datatable { + box-shadow: $subtable_shadow; + } + } + + &.kt-datatable__row-loading { + > .kt-datatable__subtable { + > .kt-datatable { + > .kt-datatable__table { + background: $row-even; + } + } + } + } + } + } + } + } + } + + // Scrollbar + .ps > .ps__rail-y > .ps__thumb-y, + .ps > .ps__rail-x > .ps__thumb-x { + background: $scrollbar_color; + + &:hover, + &:focus { + background: $scrollbar_color; + } + } + } +} + +// Build +// Base +@include kt-datatable-base(); + +// Skin +@include kt-datatable-skin(); \ No newline at end of file diff --git a/src/assets/sass/global/components/base/_dialog.scss b/src/assets/sass/global/components/base/_dialog.scss new file mode 100644 index 0000000..8cac38f --- /dev/null +++ b/src/assets/sass/global/components/base/_dialog.scss @@ -0,0 +1,59 @@ +// +// Loading +// + + + + +// Base +.kt-dialog { + $width: 130px; + width: $width; + margin: 0 auto; + position: fixed; + z-index: 1100; + justify-content: center; + padding: 1rem; + box-shadow: 0px 3px 12px 0px rgba(0,0,0,0.1); + background-color: #fff; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + // Placement + &.kt-dialog--top-center { + display: flex; + top: -100px; + left: 50%; + margin-left: -($width / 2); + transition: top 0.6s ease; + + @include kt-rounded { + border-top-left-radius: 0; + border-top-right-radius: 0; + } + + &.kt-dialog--shown { + top: 0px; + transition: top 0.6s ease; + } + } + + // Types + &.kt-dialog--loader { + font-size: 1rem; + padding: 0.75rem; + font-weight: 400; + color: kt-base-color(label, 3); + + // States + @each $name, $color in $kt-state-colors { + &.kt-dialog--#{$name} { + background-color: rgba(kt-get($color, base), 0.1); + color: kt-get($color, base); + box-shadow: 0px 0px 20px 0px rgba(kt-get($color, base), 0.3); + } + } + } +} diff --git a/src/assets/sass/global/components/base/_form.scss b/src/assets/sass/global/components/base/_form.scss new file mode 100644 index 0000000..6671d47 --- /dev/null +++ b/src/assets/sass/global/components/base/_form.scss @@ -0,0 +1,77 @@ +// +// Form +// + + + +.kt-form { + .kt-form__group { + &.kt-form__group--inline { + display: table; + padding: 0; + + > .kt-form__label { + display: table-cell; + vertical-align: middle; + margin: 0; + padding-right: 1rem; + + &.kt-form__label-no-wrap { + white-space:nowrap; + } + + > label { + margin: 0; + } + } + + > .kt-form__control { + display: table-cell; + vertical-align: middle; + margin: 0; + width: 100%; + } + } + } + + // Action bar + .kt-form__actions { + &.kt-form__actions--right { + text-align: right; + } + + &.kt-form__actions--center { + text-align: center; + } + } + + &.kt-form--center{ + width: 60%; + margin: 0 auto; + } +} + +// Validation feedback +.is-valid { + .valid-feedback { + display: inline-block; + } +} + +.is-invalid { + .invalid-feedback { + display: inline-block; + } +} + +@include kt-desktop { + .kt-form { + &.kt-form--label-right { + .form-group { + label:not(.kt-checkbox):not(.kt-radio):not(.kt-option) { + text-align: right; + } + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/base/_grid.scss b/src/assets/sass/global/components/base/_grid.scss new file mode 100644 index 0000000..bccf42e --- /dev/null +++ b/src/assets/sass/global/components/base/_grid.scss @@ -0,0 +1,32 @@ +// +// Grid +// + + + + +@include kt-grid-generate(general); + +@include kt-desktop { + @include kt-grid-generate(desktop); +} + +@include kt-desktop-xl { + @include kt-grid-generate(desktop-xl); +} + +@include kt-desktop-and-tablet { + @include kt-grid-generate(desktop-and-tablet); +} + +@include kt-tablet { + @include kt-grid-generate(tablet); +} + +@include kt-tablet-and-mobile { + @include kt-grid-generate(tablet-and-mobile); +} + +@include kt-mobile { + @include kt-grid-generate(mobile); +} \ No newline at end of file diff --git a/src/assets/sass/global/components/base/_helpers.scss b/src/assets/sass/global/components/base/_helpers.scss new file mode 100644 index 0000000..88d95f6 --- /dev/null +++ b/src/assets/sass/global/components/base/_helpers.scss @@ -0,0 +1,526 @@ +// +// Helpers +// + + + + +// Margin & Padding Helpers +@mixin kt-margin-and-padding($mode) { + @if $mode == general { + $mode: ''; + } @else { + $mode: "-" + $mode; + } + + @for $i from 0 through 20 { + $num: $i * 5; + + .kt-margin-#{$num}#{$mode} { + margin: #{$num}px !important; + } + + .kt-margin-t-#{$num}#{$mode} { + margin-top: #{$num}px !important; + } + + .kt-margin-b-#{$num}#{$mode} { + margin-bottom: #{$num}px !important; + } + + .kt-margin-l-#{$num}#{$mode} { + margin-left: #{$num}px !important; + } + + .kt-margin-r-#{$num}#{$mode} { + margin-right: #{$num}px !important; + } + + .kt-padding-#{$num}#{$mode} { + padding: #{$num}px !important; + } + + .kt-padding-t-#{$num}#{$mode} { + padding-top: #{$num}px !important; + } + + .kt-padding-b-#{$num}#{$mode} { + padding-bottom: #{$num}px !important; + } + + .kt-padding-l-#{$num}#{$mode} { + padding-left: #{$num}px !important; + } + + .kt-padding-r-#{$num}#{$mode} { + padding-right: #{$num}px !important; + } + + // short format + .kt-m#{$num}#{$mode} { + margin: #{$num}px !important; + } + + .kt-mt-#{$num}#{$mode} { + margin-top: #{$num}px !important; + } + + .kt-mb-#{$num}#{$mode} { + margin-bottom: #{$num}px !important; + } + + .kt-ml-#{$num}#{$mode} { + margin-left: #{$num}px !important; + } + + .kt-mr-#{$num}#{$mode} { + margin-right: #{$num}px !important; + } + + .kt-p#{$num}#{$mode} { + padding: #{$num}px !important; + } + + .kt-pt#{$num}#{$mode} { + padding-top: #{$num}px !important; + } + + .kt-pb-#{$num}#{$mode} { + padding-bottom: #{$num}px !important; + } + + .kt-pl#{$num}#{$mode} { + padding-left: #{$num}px !important; + } + + .kt-pr#{$num}#{$mode} { + padding-right: #{$num}px !important; + } + } +} + +@include kt-margin-and-padding(general); + +@include kt-desktop { + @include kt-margin-and-padding(desktop); +} + +@include kt-tablet { + @include kt-margin-and-padding(tablet); +} + +@include kt-tablet-and-mobile { + @include kt-margin-and-padding(tablet-and-mobile); +} + +@include kt-mobile { + @include kt-margin-and-padding(mobile); +} + +// Opacity +@mixin kt-opacity { + @for $i from 1 through 9 { + .kt-opacity-#{$i} { + opacity: #{$i * 0.1}; + } + } +} + +@include kt-opacity(); + +// Border radius +.kt-radius-100 { + border-radius: 100%; +} + +// General helpers +.kt-valign-top { + vertical-align: top; +} + +.kt-space-5 { + display: block; + height: 0; + margin-bottom: 5px; +} + +.kt-space-10 { + display: block; + height: 0; + margin-bottom: 10px; +} + +.kt-space-15 { + display: block; + height: 0; + margin-bottom: 15px; +} + +.kt-space-20 { + display: block; + height: 0; + margin-bottom: 20px; +} + +.kt-space-30 { + display: block; + height: 0; + margin-bottom: 30px; +} + +.kt-space-40 { + display: block; + height: 0; + margin-bottom: 40px; +} + +.kt-valign-middle { + vertical-align: middle; +} + +.kt-valign-bottom { + vertical-align: bottom; +} + +.kt-block-center { + margin-left: auto; + margin-right: auto; +} + +.kt-align-right { + text-align: right; +} + +.kt-align-left { + text-align: left; +} + +.kt-align-center { + text-align: center; +} + +.kt-pull-right { + float: right; +} + +.kt-pull-left { + float: left; +} + +.kt-img-rounded { + border-radius: 50% !important; +} + +.kt-block-inline { + display: inline-block; +} + +.kt-icon-middle { + &:before { + vertical-align: middle; + } +} + +// Element visibility +.kt-hidden, +.kt-hide { + display: none !important; +} + +// Font sizing +.kt-font-sm { + font-size: 0.8rem !important; +} + +.kt-font-md { + font-size: 0.9rem !important; +} + +.kt-font-lg { + font-size: 1.2rem !important; +} + +.kt-font-xl { + font-size: 1.5rem !important; +} + +.kt-clearfix { + @include kt-clearfix(); +} + +// Icon font sizing +.kt-icon-sm { + font-size: 0.75rem !important; +} + +.kt-icon-md { + font-size: 0.9rem !important; +} + +.kt-icon-lg { + font-size: 1.2rem !important; +} + +.kt-icon-xl { + font-size: 1.4rem !important; +} + + +.kt-marginless { + margin: 0 !important; +} + +.kt-img-centered { + text-align: center; +} + +// Text Transform +.kt-font-transform-u { + text-transform: uppercase; +} + +.kt-font-transform-l { + text-transform: lowercase; +} + +.kt-font-transform-c { + text-transform: capitalize; +} + +.kt-font-transform-i { + text-transform: initial; +} + +// Font Weights +.kt-font-regular { + font-weight: 400 !important; +} +.kt-font-bold { + font-weight: 500 !important; +} + +.kt-font-bolder { + font-weight: 600 !important; +} + +.kt-font-boldest { + font-weight: 700 !important; +} + +b, strong { + font-weight: bold; +} + +// State colors +@each $name, $color in $kt-state-colors { + .kt-font-#{$name} { + color: kt-get($color, base) !important; + } + + .kt-font-hover-#{$name}{ + &:hover{ + color: darken(kt-get($color, base),20%); + } + } + + .kt-font-inverse-#{$name} { + color: kt-get($color, inverse) !important; + } + + .kt-bg-#{$name} { + background-color: kt-get($color, base) !important; + } + + .kt-bg-fill-#{$name} { + background-color: kt-get($color, base) !important; + color: kt-get($color, inverse) !important; + + > i { + color: kt-get($color, inverse) !important; + } + } + + .kt-bg-light-#{$name} { + background-color: rgba(kt-get($color, base), 0.1) !important; + } +} + +// Social colors +@each $name, $color in $kt-social-colors { + .kt-font-#{$name} { + color: kt-get($color, base) !important; + } +} + +// Base colors +@each $name, $color in kt-get($kt-base-colors, label) { + .kt-label-font-color-#{$name} { + color: $color !important; + } + + .kt-label-bg-color-#{$name} { + background-color: $color !important; + } +} + +@each $name, $color in kt-get($kt-base-colors, shape) { + .kt-shape-font-color-#{$name} { + color: $color !important; + } + + .kt-shape-bg-color-#{$name} { + background-color: $color !important; + } +} + +// Responsive Helpers +.kt-visible-desktop, +.kt-visible-desktop-inline-block, +.kt-visible-desktop-inline, +.kt-visible-desktop-table, +.kt-visible-desktop-table-cell, + +.kt-visible-tablet, +.kt-visible-tablet-inline-block, +.kt-visible-tablet-inline, +.kt-visible-tablet-table, +.kt-visible-tablet-table-cell, + +.kt-visible-tablet-and-mobile, +.kt-visible-tablet-and-mobile-inline-block, +.kt-visible-tablet-and-mobile-inline, +.kt-visible-tablet-and-mobile-table, +.kt-visible-tablet-and-mobile-table-cell, + +.kt-visible-mobile, +.kt-visible-mobile-inline-block, +.kt-visible-mobile-inline, +.kt-visible-mobile-table, +.kt-visible-mobile-table-cell { + display: none !important; +} + +@include kt-desktop { + .kt-visible-desktop { + display: block !important; + } + + .kt-visible-desktop-inline-block { + display: inline-block !important; + } + + .kt-visible-desktop-inline { + display: inline !important; + } + + .kt-visible-desktop-table { + display: table !important; + } + + .kt-visible-desktop-table-cell { + display: table-cell !important; + } + + .kt-hidden-desktop { + display: none !important; + } +} + +@include kt-tablet { + .kt-visible-tablet { + display: block !important; + } + + .kt-visible-tablet-inline-block { + display: inline-block !important; + } + + .kt-visible-tablet-inline { + display: inline !important; + } + + .kt-visible-tablet-table { + display: table !important; + } + + .kt-visible-tablet-table-cell { + display: table-cell !important; + } + + .kt-hidden-tablet { + display: none !important; + } +} + +@include kt-tablet-and-mobile { + .kt-visible-tablet-and-mobile { + display: block !important; + } + + .kt-visible-tablet-and-mobile-inline-block { + display: inline-block !important; + } + + .kt-visible-tablet-and-mobile-inline { + display: inline !important; + } + + .kt-visible-tablet-and-mobile-table { + display: table !important; + } + + .kt-visible-tablet-and-mobile-table-cell { + display: table-cell !important; + } + + .kt-hidden-tablet-and-mobile { + display: none !important; + } +} + +@include kt-mobile { + .kt-visible-mobile { + display: block !important; + } + + .kt-visible-mobile-inline-block { + display: inline-block !important; + } + + .kt-visible-mobile-inline { + display: inline !important; + } + + .kt-visible-mobile-table { + display: table !important; + } + + .kt-visible-mobile-table-cell { + display: table-cell !important; + } + + .kt-hidden-mobile { + display: none !important; + } +} + +// Flexbox helpers + +.kt-space-between { + display: flex; + justify-content: space-between; +} + +// Rounded +.kt-rounded { + border-radius: $kt-border-radius !important; +} + +// Negative Spacing +.kt-negative-spacing { + @for $i from 1 through 10 { + &--#{$i}{ + margin-top: -#{$i}0px; + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/base/_input-icon.scss b/src/assets/sass/global/components/base/_input-icon.scss new file mode 100644 index 0000000..107bc88 --- /dev/null +++ b/src/assets/sass/global/components/base/_input-icon.scss @@ -0,0 +1,136 @@ +// +// Input Icon +// + + + + +// Config +$kt-input-icon: ( + default: ( + width: 3.2rem, + font-size: ( + flaticon: 1.3em, + fontawesome: 1.2em, + lineawesome: 1.4em + ) + ), + lg: ( + width: 4.2rem, + font-size: ( + flaticon: 1.4em, + fontawesome: 1.3em, + lineawesome: 1.6em + ) + ), + sm: ( + width: 2.7rem, + font-size: ( + flaticon: 1em, + fontawesome: 1em, + lineawesome: 1.1em + ) + ) +); + +// Base +.kt-input-icon { + position: relative; + padding: 0; + width: 100%; + + // icon input sizing + > .kt-input-icon__icon { + position: absolute; + height: 100%; + display: flex; + justify-content: center; + top: 0; + width: kt-get($kt-input-icon, default, width); + + &.kt-input-icon__icon--left { + left: 0; + } + + &.kt-input-icon__icon--right { + right: 0; + } + + > span { + display: flex; + align-items: center; + justify-content: center; + height: 100%; + + i { + display: flex; + align-items: center; + justify-content: center; + line-height: 0; + color: kt-base-color(label, 2); + } + } + + // set icon sizes + @include kt-icons-size( kt-get($kt-input-icon, default, font-size) ); + } + + .form-control.form-control-lg + .kt-input-icon__icon { + width: kt-get($kt-input-icon, lg, width); + + // set icon sizes + @include kt-icons-size( kt-get($kt-input-icon, lg, font-size) ); + } + + .form-control.form-control-sm ~ .kt-input-icon__icon { + width: kt-get($kt-input-icon, sm, width); + + // set icon sizes + @include kt-icons-size( kt-get($kt-input-icon, sm, font-size) ); + } + + // icon input alignments + &.kt-input-icon--left { + .form-control { + padding-left: (kt-get($kt-input-icon, default, width) - 0.4rem); + + &.form-control-lg { + padding-left: (kt-get($kt-input-icon, lg, width) - 0.6rem); + } + + &.form-control-sm { + padding-left: (kt-get($kt-input-icon, sm, width) - 0.2rem); + } + } + } + + &.kt-input-icon--right { + .form-control { + padding-right: (kt-get($kt-input-icon, default, width) - 0.4rem); + + &.form-control-lg { + padding-right: (kt-get($kt-input-icon, lg, width) - 0.6rem); + } + + &.form-control-sm { + padding-right: (kt-get($kt-input-icon, sm, width) - 0.2rem); + } + } + } + + // fixed width icon inputs + &.kt-input-icon--fixed { + display: inline-block; + width: kt-get($kt-input-icon, default, fixed); + } + + &.kt-input-icon--fixed-large { + display: inline-block; + width: kt-get($kt-input-icon, lg, fixed); + } + + &.kt-input-icon--fixed-small { + display: inline-block; + width: kt-get($kt-input-icon, sm, fixed); + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/base/_loader.scss b/src/assets/sass/global/components/base/_loader.scss new file mode 100644 index 0000000..f1fa6fe --- /dev/null +++ b/src/assets/sass/global/components/base/_loader.scss @@ -0,0 +1,78 @@ +// +// Loader +// + + + + +// Config +$kt-loader-config: ( + default: ( + size: 1.4rem, + width: 2px + ), + lg: ( + size: 2rem, + width: 3px + ), + sm: ( + size: 1rem, + width: 1px + ) +); + +// Base +@mixin kt-loader-base() { + // Spinner markup + .kt-loader { + display: inline-block; + width: kt-get($kt-loader-config, default, size); + height: kt-get($kt-loader-config, default, size); + margin: 0 auto; + border-radius: 100%; + background-color: kt-base-color(grey, 1); + opacity: 0; + animation: kt-loader-scaleout 0.9s infinite ease-in-out; + + &.kt-loader--lg { + width: kt-get($kt-loader-config, lg, size); + height: kt-get($kt-loader-config, lg, size); + } + + &.kt-loader--sm { + width: kt-get($kt-loader-config, sm, size); + height: kt-get($kt-loader-config, sm, size); + } + + .btn & { + position: relative; + line-height: 0; + } + } + + // States + @each $name, $color in $kt-state-colors { + .kt-loader.kt-loader--#{$name} { + background-color: kt-get($color, base); + } + } + + // Spinner animation + @keyframes kt-loader-scaleout { + 0% { + opacity: 0.3; + transform: scale(0); + } + 100% { + opacity: 1; + transform: scale(1.0); + } + } +} + +@mixin kt-loader-skin($color) { + background-color: $color; +} + +// Build +@include kt-loader-base(); \ No newline at end of file diff --git a/src/assets/sass/global/components/base/_normalize.scss b/src/assets/sass/global/components/base/_normalize.scss new file mode 100644 index 0000000..8755f6b --- /dev/null +++ b/src/assets/sass/global/components/base/_normalize.scss @@ -0,0 +1,104 @@ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ + +// +// 1. Set default font family to sans-serif. +// 2. Prevent iOS and IE text size adjust after device orientation change, +// without disabling user zoom. +// 3. Set 100% height for document body + +html { + font-family: sans-serif; // 1 + text-size-adjust: 100%; // 2 + -ms-text-size-adjust: 100%; // 2 + -webkit-text-size-adjust: 100%; // 2 + -webkit-tap-highlight-color: rgba(0,0,0,0); +} + +html, +body { + height: 100%; + margin: 0px; + padding: 0px; + + font-size: kt-get($kt-font-size, size, desktop); + font-weight: kt-get($kt-font-size, weight); + font-family: #{kt-get($kt-font-families, regular)}; + + -ms-text-size-adjust: 100%; // 2 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + a:hover, + a:active, + a:focus { + text-decoration: none !important; + } + + a, + button { + outline: none !important; + } +} + +body { + display: flex; + flex-direction: column; + color: kt-get($kt-font-color, text); +} + +// Angular integration +router-outlet { + display: none; +} + +canvas { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; +} + +/* Customize website's scrollbar like Mac OS */ +/* +::-webkit-scrollbar { + background-color:#f6f6f6; + width:14px; +} + +::-webkit-scrollbar-track { + transition: all 0.3s ease; + background-color:#f6f6f6; + width:14px; +} + +::-webkit-scrollbar-track:hover { + transition: all 0.3s ease; + background-color:#f6f6f6; +} + +::-webkit-scrollbar-thumb { + transition: all 0.3s ease; + background-color:#c1c1c1; +} + +::-webkit-scrollbar-thumb:hover { + transition: all 0.3s ease; + background-color: darken(#c1c1c1, 3%); +} +*/ + +/* set button(top and bottom of the scrollbar) */ +::-webkit-scrollbar-button {display:none} + +@include kt-tablet { + html, + body { + font-size: kt-get($kt-font-size, size, tablet); + } +} + +@include kt-mobile { + html, + body { + font-size: kt-get($kt-font-size, size, mobile); + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/base/_option.scss b/src/assets/sass/global/components/base/_option.scss new file mode 100644 index 0000000..4878b04 --- /dev/null +++ b/src/assets/sass/global/components/base/_option.scss @@ -0,0 +1,119 @@ + +// +// Option +// + + + + +// Base +@mixin kt-option-base() { + .kt-option { + display: flex; + padding: 1.4em; + border: 1px solid kt-base-color(grey, 2); + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + .kt-option__control { + width: 2.7rem; + padding-top: 0.1rem; + + .kt-radio { + display: block; + } + } + + .kt-option__label { + width: 100%; + + .kt-option__head { + display: flex; + justify-content: space-between; + + .kt-option__title { + font-size: 1.1rem; + font-weight: 400; + color: kt-base-color(label, 3); + } + + .kt-option__focus { + font-size: 1.1rem; + font-weight: 500; + color: kt-base-color(label, 4); + } + } + + .kt-option__body { + display: block; + padding-top: 0.7rem; + font-size: 0.9rem; + color: kt-base-color(label, 2); + } + } + + &.kt-option--plain { + border: 0; + padding: 0; + margin-top: -0.2rem; + margin-bottom: 2rem; + align-items: center; + + .kt-option__control { + vertical-align: middle; + width: 2.7rem; + + .kt-radio { + margin-bottom: 1.6rem; + } + } + + .kt-option__label { + .kt-option__head { + .kt-option__title { + + } + } + + .kt-option__body { + padding-top: 0.2rem; + } + } + } + + // Validation + .is-valid & { + border-color: kt-state-color(success, base); + } + + .is-invalid & { + border-color: kt-state-color(danger, base); + } + } + + +} + +// Validation State +@mixin kt-option-validation-state($state, $color) { + .has-#{$state} { + .kt-option { + .kt-option__label { + .kt-option__head { + .kt-option__title { + color: $color; + } + } + } + } + } +} + +// Base +@include kt-option-base(); + +// Validation States +@include kt-option-validation-state(success, kt-get($kt-state-colors, success, base)); +@include kt-option-validation-state(error, kt-get($kt-state-colors, warning, base)); \ No newline at end of file diff --git a/src/assets/sass/global/components/base/_page-loader.scss b/src/assets/sass/global/components/base/_page-loader.scss new file mode 100644 index 0000000..c99d397 --- /dev/null +++ b/src/assets/sass/global/components/base/_page-loader.scss @@ -0,0 +1,64 @@ +// +// Page loader +// + + + + +// CSS3 Transitions only after page load(.kt-page-loading class added to body tag and remove with JS on page load) +.kt-page--loading * { + transition: none !important; +} + +// Base +.kt-page-loader { + background: #fff; + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 1000; + display: none; + + .kt-page--loading & { + display: flex; + justify-content: center; + align-items: center; + } + + &.kt-page-loader--non-block { + background: transparent; + display: none; + position: fixed; + top: 50%; + left: 50%; + right: auto; + bottom: auto; + width: auto; + + .kt-page--loading-non-block & { + display: inline-block; + } + } + + &.kt-page-loader--logo { + flex-direction: column; + align-items: center; + + img { + display: block; + } + + .kt-spinner { + margin-top: 3rem; + + &:before { + width: 26px; + height: 26px; + margin-top: -13px; + margin-left: -13px; + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/base/_portlet.scss b/src/assets/sass/global/components/base/_portlet.scss new file mode 100644 index 0000000..f6147ac --- /dev/null +++ b/src/assets/sass/global/components/base/_portlet.scss @@ -0,0 +1,984 @@ +// +// Portlet +// + + + + +.kt-portlet { + display: flex; + flex-grow: 1; + flex-direction: column; + box-shadow: $kt-elevate-shadow; + background-color: kt-get($kt-portlet, bg-color); + margin-bottom: kt-get($kt-portlet, bottom-space, desktop); + + // Global white content mode + .kt-page-content-white & { + box-shadow: $kt-elevate-shadow-2; + } + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + // Base + .kt-portlet__head { + display: flex; + align-items: stretch; + justify-content: space-between; + position:relative; + padding: 0 kt-get($kt-portlet, space, desktop); + border-bottom: 1px solid kt-get($kt-portlet, border-color); + min-height: kt-get($kt-portlet, min-height, default, desktop); + + &.kt-portlet__head--right { + justify-content: flex-end; + } + + &.kt-portlet__head--noborder { + border-bottom: 0; + } + + @include kt-rounded { + border-top-left-radius: $kt-border-radius; + border-top-right-radius: $kt-border-radius; + } + + .kt-portlet__head-label { + display: flex; + align-items: center; + align-content: flex-first; + + .kt-portlet__head-title { + margin: 0; + padding: 0; + font-size: 1.2rem; + font-weight: 500; + color: kt-base-color(label, 4); + + small { + font-weight: 300; + padding-left: 0.5rem; + font-size: 1rem; + color: kt-base-color(label, 2); + } + } + + .kt-portlet__head-icon { + padding-right: 0.75rem; + font-size: 1.3rem; + color:kt-base-color(label, 2); + } + } + + .kt-portlet__head-toolbar { + display: flex; + align-items: center; + align-content: flex-end; + + .nav-pills, + .nav-tabs { + margin: 0; + } + + .kt-portlet__head-wrapper { + display: flex; + align-items: center; + } + } + + .kt-portlet__head-progress { + position: absolute; + left: 0; + right: 0; + } + } + + // Head sizing + &.kt-portlet--head-sm { + .kt-portlet__head { + min-height: kt-get($kt-portlet, min-height, sm, desktop); + } + } + + &.kt-portlet--head-lg { + .kt-portlet__head { + min-height: kt-get($kt-portlet, min-height, lg, desktop); + } + } + + &.kt-portlet--head-xl { + .kt-portlet__head { + min-height: kt-get($kt-portlet, min-height, xl, desktop); + } + } + + // Sticky portlet + &.kt-portlet--sticky { + > .kt-portlet__head { + height: kt-get($kt-portlet, min-height, default, desktop) - 10px; + min-height: kt-get($kt-portlet, min-height, default, desktop) - 10px; + + &.kt-portlet__head--sm { + height: kt-get($kt-portlet, min-height, sm, desktop) - 10px; + min-height: kt-get($kt-portlet, min-height, sm, desktop) - 10px; + } + + &.kt-portlet__head--lg { + height: kt-get($kt-portlet, min-height, lg, desktop) - 10px; + min-height: kt-get($kt-portlet, min-height, lg, desktop) - 10px; + } + + &.kt-portlet__head--xl { + height: kt-get($kt-portlet, min-height, xl, desktop) - 10px; + min-height: kt-get($kt-portlet, min-height, xl, desktop) - 10px; + } + } + } + + // Head overlay + &.kt-portlet--head-overlay { + .kt-portlet__head { + position: relative; + z-index: 1; + border: 0; + height: kt-get($kt-portlet, min-height, default, desktop); + } + + .kt-portlet__body { + margin-top: -(kt-get($kt-portlet, min-height, default, desktop)); + } + + // Head sizing + &.kt-portlet--head-sm { + .kt-portlet__head { + height: kt-get($kt-portlet, min-height, sm, desktop); + } + + .kt-portlet__body { + margin-top: -(kt-get($kt-portlet, min-height, sm, desktop)); + } + } + + &.kt-portlet--head-lg { + .kt-portlet__head { + height: kt-get($kt-portlet, min-height, lg, desktop); + } + + .kt-portlet__body { + margin-top: -(kt-get($kt-portlet, min-height, lg, desktop)); + } + } + + &.kt-portlet--head-xl { + .kt-portlet__head { + height: kt-get($kt-portlet, min-height, xl, desktop); + } + + .kt-portlet__body { + margin-top: -(kt-get($kt-portlet, min-height,xl, desktop)); + } + } + } + + .kt-portlet__body { + display: flex; + flex-direction: column; + padding: kt-get($kt-portlet, space, desktop); + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + .kt-portlet__content { + padding: 0; + margin: 0; + } + + // KTDatatable integration + > .kt-datatable { + > .kt-datatable__table { + @include kt-rounded { + border-radius: $kt-border-radius; + } + } + } + } + + .kt-portlet__foot { + padding: kt-get($kt-portlet, space, desktop); + border-top: 1px solid kt-get($kt-portlet, border-color); + + .kt-portlet__foot-wrapper { + display:flex; + flex-direction: row; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + } + + @include kt-rounded { + border-bottom-left-radius: $kt-border-radius; + border-bottom-right-radius: $kt-border-radius; + } + + &.kt-portlet__foot--sm { + padding-top: 10px; + padding-bottom: 10px; + } + + &.kt-portlet__foot--md { + padding-top: 1rem; + padding-bottom: 1rem; + } + + &.kt-portlet__foot--no-border { + border-top: 0; + } + + &.kt-portlet__foot--top { + border-top: 0; + border-bottom: 1px solid kt-get($kt-portlet, border-color); + } + + &.kt-portlet__foot--solid { + background-color: kt-base-color(grey, 1); + border-top: 0; + + &.kt-portlet__foot--top { + border-bottom: 0; + } + } + } + + .kt-portlet__separator { + height: 0; + border-top: 1px solid kt-get($kt-portlet, border-color); + } + + // Unelivate + &.kt-portlet--bordered { + box-shadow: none; + border: 1px solid kt-get($kt-portlet, border-color); + } + + // Unelivate + &.kt-portlet--unelevate { + box-shadow: none + } + + // Unround + &.kt-portlet--unround { + .kt-portlet__head { + border-top-left-radius: 0; + border-top-right-radius: 0; + } + + .kt-portlet__body { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } + + .kt-portlet__foot { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } + } + + // Marginless + &.kt-portlet--last { + margin-bottom: 0; + } + + // Portlet body alignment + .kt-portlet__body { + &.kt-portlet__body--center { + justify-content: center; + align-items: center; + } + + &.kt-portlet__body--center-x { + justify-content: center; + } + + &.kt-portlet__body--center-y { + align-items: center; + } + + .kt-portlet__body--hor-fit { + margin-left: -(kt-get($kt-portlet, space, desktop)); + margin-right: -(kt-get($kt-portlet, space, desktop)); + } + + &.kt-portlet__body--stick-bottom { + position: relative; + bottom: 0; + } + + &.kt-portlet__body--fluid { + height: 100%; + flex-direction: row; + flex-grow: 1; + width: 100%; + } + + // Full height + &.kt-portlet__body--fill { + flex-grow: 1 !important; + } + + // Non full height + &.kt-portlet__body--unfill { + flex-grow: 0 !important; + } + + &.kt-portlet__body--fullheight { + flex-grow: auto; + } + } + + // Padding options + &.kt-portlet--fit { + .kt-portlet__head { + padding: 0; + } + + .kt-portlet__body { + padding: 0; + } + + .kt-portlet__foot { + padding: 0; + } + + &.kt-portlet--height-fluid-half { + align-items: stretch; + + .kt-portlet__body { + height: 100%; + flex-direction: column; + align-items: stretch; + } + } + } + + // Contain inner elements + &.kt-portlet--contain { + overflow: hidden; + } + + &.kt-portlet--space { + padding-left: kt-get($kt-portlet, space, desktop); + padding-right: kt-get($kt-portlet, space, desktop); + + .kt-portlet__head, + .kt-portlet__body, + .kt-portlet__foot { + padding-left: 0; + padding-right: 0; + } + } + + // Options + // No border + &.kt-portlet--head-noborder { + .kt-portlet__head { + border-bottom: 0; + } + + .kt-portlet__body { + padding-top: kt-get($kt-portlet, space, desktop) / 2; + } + } + + // Tab style + &.kt-portlet--tabs { + .kt-portlet__head { + .kt-portlet__head-toolbar { + display: flex; + align-items: stretch; + } + } + } + + // Tab 3x border style + &.kt-portlet--tabs-border-3x { + .kt-portlet__head { + border-bottom: 3px solid kt-base-color(grey, 1); + + .nav.nav-tabs { + margin-bottom: -3px; + } + } + } + + @each $name, $color in $kt-state-colors { + // Solid style + &.kt-portlet--solid-#{$name} { + background: kt-get($color, base); + + .kt-portlet__head { + color: kt-get($color, inverse); + border-bottom: 1px solid transparent; + + .kt-portlet__head-title { + color: kt-get($color, inverse); + + small { + color: darken(kt-get($color, inverse), 6%); + } + } + + .kt-portlet__head-icon { + i { + color: darken(kt-get($color, inverse), 6%); + } + } + } + + .kt-portlet__body { + padding-top: 5px; + } + + .kt-portlet__wrapper, + .kt-portlet__body { + color: kt-get($color, inverse); + } + + .kt-portlet__foot { + color: kt-get($color, inverse); + border-top: 1px solid transparent; + background: darken(kt-get($color, base), 6%); + } + } + + // Tab 3x border states + &.kt-portlet--tabs-border-3x-#{$name} { + .kt-portlet__head { + border-bottom: 3px solid rgba(kt-get($color, base), 0.1); + } + } + + // Bottom Border + &.kt-portlet--border-bottom-#{$name} { + border-bottom: 3px solid rgba(kt-get($color, base), 0.2); + } + } + + // Sortable mode + // jQuery UI Draggable Portlets + &.kt-portlet--sortable { + .kt-portlet__head { + cursor: move; + } + } + + &.kt-portlet--sortable-empty { + visibility: hidden; + height: 45px; + min-height: 125px; + } + + &.ui-sortable-helper { + border: 1px dashed kt-base-color(grey, 2); + } + + // Sticky portlet head + .kt-portlet__head { + transition: left 0.3s, right 0.3s, height 0.3s + } + + &.kt-portlet--sticky { + > .kt-portlet__head { + transition: left 0.3s, right 0.3s, height 0.3s; + position: fixed; + box-shadow: 0px 1px 15px 1px rgba(69, 65, 78, 0.1); + z-index: 101; + background: #fff; + } + } + + // Dark skin + &.kt-portlet--skin-solid { + // Head + .kt-portlet__head { + .kt-portlet__head-label { + .kt-portlet__head-title { + color: #fff; + + small { + color: rgba(#fff, 0.8); + } + } + + .kt-portlet__head-icon { + color: rgba(#fff, 0.8); + } + } + + &:not(.kt-portlet__head--noborder) { + border-bottom: 1px solid rgba(#fff, 0.2); + } + } + + // Body + .kt-portlet__body { + color: #fff; + } + } + + // Spacing + .kt-portlet__space-x { + padding-left: kt-get($kt-portlet, space, desktop) !important; + padding-right: kt-get($kt-portlet, space, desktop) !important; + } + + .kt-portlet__space-y { + padding-top: kt-get($kt-portlet, space, desktop) !important; + padding-bottom: kt-get($kt-portlet, space, desktop) !important; + } + + // Collapsed Mode + &.kt-portlet--collapsed { + > .kt-form, + > .kt-portlet__body { + display: none; + } + } + + &.kt-portlet--collapsed, + &.kt-portlet--collapse { + .kt-portlet__head { + .kt-portlet__head-toolbar { + .la-angle-down { + &:before { + content: "\f113"; + } + } + + .la-plus { + &:before { + content: "\f28e"; + } + } + } + } + } + + .kt-portlet__head.kt-portlet__head--fit { + padding: 0; + } + + .kt-portlet__body.kt-portlet__body--fit { + padding: 0; + } + + .kt-portlet__body.kt-portlet__body--fit-top { + padding-top: 0 !important; + } + + .kt-portlet__body.kt-portlet__body--fit-bottom { + padding-bottom: 0 !important; + } + + .kt-portlet__body.kt-portlet__body--fit-x, + .kt-portlet__body.kt-portlet__body--hor-fit { + padding-left: 0; + padding-right: 0; + } + + .kt-portlet__body.kt-portlet__body--fit-y { + padding-top: 0; + padding-bottom: 0; + } + + .kt-portlet__foot.kt-portlet__foot--fit { + padding: 0; + } + + &.kt-portlet--space { + padding-left: kt-get($kt-portlet, space, desktop); + padding-right: kt-get($kt-portlet, space, desktop); + + .kt-portlet__head, + .kt-portlet__body, + .kt-portlet__foot { + padding-left: 0; + padding-right: 0; + } + } + + // Options + // No border + &.kt-portlet--head-noborder { + .kt-portlet__head { + border-bottom: 0; + } + + .kt-portlet__body { + padding-top: kt-get($kt-portlet, space, desktop) / 2; + } + } + + // Tab style + &.kt-portlet--tabs { + .kt-portlet__head { + .kt-portlet__head-toolbar { + display: flex; + align-items: stretch; + } + } + } + + // Tab 3x border style + &.kt-portlet--tabs-border-3x { + .kt-portlet__head { + border-bottom: 3px solid kt-base-color(grey, 1); + + .nav.nav-tabs { + margin-bottom: -3px; + } + } + } + + @each $name, $color in $kt-state-colors { + // Solid style + &.kt-portlet--solid-#{$name} { + background: kt-get($color, base); + + .kt-portlet__head { + color: kt-get($color, inverse); + border-bottom: 1px solid transparent; + + .kt-portlet__head-title { + color: kt-get($color, inverse); + + small { + color: darken(kt-get($color, inverse), 6%); + } + } + + .kt-portlet__head-icon { + i { + color: darken(kt-get($color, inverse), 6%); + } + } + } + + .kt-portlet__body { + padding-top: 5px; + } + + .kt-portlet__wrapper, + .kt-portlet__body { + color: kt-get($color, inverse); + } + + .kt-portlet__foot { + color: kt-get($color, inverse); + border-top: 1px solid transparent; + background: darken(kt-get($color, base), 6%); + } + } + + // Tab 3x border states + &.kt-portlet--tabs-border-3x-#{$name} { + .kt-portlet__head { + border-bottom: 3px solid rgba(kt-get($color, base), 0.1); + } + } + + // Bottom Border + &.kt-portlet--border-bottom-#{$name} { + border-bottom: 3px solid rgba(kt-get($color, base), 0.2); + } + } + + // Sortable mode + // jQuery UI Draggable Portlets + &.kt-portlet--sortable { + .kt-portlet__head { + cursor: move; + } + } + + &.kt-portlet--sortable-empty { + visibility: hidden; + height: 45px; + min-height: 125px; + } + + &.ui-sortable-helper { + border: 1px dashed kt-base-color(grey, 2); + } + + // Sticky portlet head + .kt-portlet__head { + transition: height 0.3s; + //transition: left 0.3s, right 0.3s, height 0.3s; + } + + &.kt-portlet--sticky { + > .kt-portlet__head { + transition: height 0.3s; + //transition: left 0.3s, right 0.3s, height 0.3s; + position: fixed; + box-shadow: 0px 1px 15px 1px rgba(69, 65, 78, 0.1); + z-index: 101; + background: #fff; + } + } + + // Dark skin + &.kt-portlet--skin-solid { + // Head + .kt-portlet__head { + .kt-portlet__head-label { + .kt-portlet__head-title { + color: #fff; + + small { + color: rgba(#fff, 0.8); + } + } + + .kt-portlet__head-icon { + color: rgba(#fff, 0.8); + } + } + + &:not(.kt-portlet__head--noborder) { + border-bottom: 1px solid rgba(#fff, 0.2); + } + } + + // Body + .kt-portlet__body { + color: #fff; + } + } + + // Spacing + .kt-portlet__space-x { + padding-left: kt-get($kt-portlet, space, desktop) !important; + padding-right: kt-get($kt-portlet, space, desktop) !important; + } + + .kt-portlet__space-y { + padding-top: kt-get($kt-portlet, space, desktop) !important; + padding-bottom: kt-get($kt-portlet, space, desktop) !important; + } + + // Collapsed Mode + &.kt-portlet--collapsed { + > .kt-form, + > .kt-portlet__body { + display: none; + } + } + + &.kt-portlet--collapsed, + &.kt-portlet--collapse { + .kt-portlet__head { + .kt-portlet__head-toolbar { + .la-angle-down { + &:before { + content: "\f113"; + } + } + + .la-plus { + &:before { + content: "\f28e"; + } + } + } + } + } +} + +// Portlet tools tooltip +.tooltip-portlet { + opacity: 1; +} + +@include kt-desktop { + .kt-portlet { + // Fluid Height + &.kt-portlet--height-fluid { + height: calc(100% - #{kt-get($kt-portlet, bottom-space, desktop)}); + + .kt-portlet__body { + flex-grow: 1; + } + } + + // Full height portlet mode + &.kt-portlet--height-fluid-half { + height: calc(50% - #{kt-get($kt-portlet, bottom-space, desktop)}); + + .kt-portlet__body { + flex-grow: 1; + } + } + } +} + +@include kt-tablet-and-mobile { + .kt-portlet { + margin-bottom: kt-get($kt-portlet, bottom-space, mobile); + + // Head sizing + .kt-portlet__head { + padding: 0 kt-get($kt-portlet, space, mobile); + min-height: kt-get($kt-portlet, min-height, default, mobile); + + &.kt-portlet__head--sm { + min-height: kt-get($kt-portlet, min-height, sm, mobile); + } + + &.kt-portlet__head--lg { + min-height: kt-get($kt-portlet, min-height, lg, mobile); + } + + &.kt-portlet__head--xl { + min-height: kt-get($kt-portlet, min-height, xl, mobile); + } + } + + &.kt-portlet--head-sm { + .kt-portlet__head { + min-height: kt-get($kt-portlet, min-height, sm, mobile); + } + } + + &.kt-portlet--head-lg { + .kt-portlet__head { + min-height: kt-get($kt-portlet, min-height, lg, mobile); + } + } + + &.kt-portlet--head-xl { + .kt-portlet__head { + min-height: kt-get($kt-portlet, min-height, xl, mobile); + } + } + + // Portlet body alignment + .kt-portlet__body { + padding: kt-get($kt-portlet, space, mobile); + + .kt-portlet__body--hor-fit { + margin-left: -(kt-get($kt-portlet, space, mobile)); + margin-right: -(kt-get($kt-portlet, space, mobile)); + } + } + + .kt-portlet__foot { + padding: kt-get($kt-portlet, space, mobile); + } + + // Marginless + &.kt-portlet--marginless { + margin-bottom: 0; + } + + // Sticky portlet + &.kt-portlet--sticky { + > .kt-portlet__head { + height: kt-get($kt-portlet, min-height, default, mobile) - 10px; + + &.kt-portlet__head--sm { + height: kt-get($kt-portlet, min-height, sm, mobile) - 10px; + } + + &.kt-portlet__head--lg { + height: kt-get($kt-portlet, min-height, lg, mobile) - 10px; + } + + &.kt-portlet__head--xl { + height: kt-get($kt-portlet, min-height, xl, mobile) - 10px; + } + } + } + + // Head overlay + &.kt-portlet--head-overlay { + .kt-portlet__head { + height: kt-get($kt-portlet, min-height, default, mobile); + } + + .kt-portlet__body { + margin-top: -(kt-get($kt-portlet, min-height, default, mobile)); + } + + // Head sizing + &.kt-portlet--head-sm { + .kt-portlet__head { + height: kt-get($kt-portlet, min-height, sm, mobile); + } + + .kt-portlet__body { + margin-top: -(kt-get($kt-portlet, min-height, sm, mobile)); + } + } + + &.kt-portlet--head-lg { + .kt-portlet__head { + height: kt-get($kt-portlet, min-height, lg, mobile); + } + + .kt-portlet__body { + margin-top: -(kt-get($kt-portlet, min-height, lg, mobile)); + } + } + + &.kt-portlet--head-xl { + .kt-portlet__head { + height: kt-get($kt-portlet, min-height, xl, mobile); + } + + .kt-portlet__body { + margin-top: -(kt-get($kt-portlet, min-height,xl, mobile)); + } + } + } + + // No border + &.kt-portlet--head--noborder { + .kt-portlet__body { + padding-top: kt-get($kt-portlet, space, mobile) / 2; + } + } + + // Spacing + .kt-portlet__space-x { + padding-left: kt-get($kt-portlet, space, mobile) !important; + padding-right: kt-get($kt-portlet, space, mobile) !important; + } + + .kt-portlet__space-y { + padding-top: kt-get($kt-portlet, space, mobile) !important; + padding-bottom: kt-get($kt-portlet, space, mobile) !important; + } + } +} + +@include kt-mobile { + .kt-portlet { + &.kt-portlet--head-break-sm { + .kt-portlet__head { + padding-top: kt-get($kt-portlet, space, mobile); + padding-bottom: kt-get($kt-portlet, space, mobile); + min-height: initial !important; + height: auto; + flex-wrap: wrap; + + .kt-portlet__head-label { + margin-bottom: 1rem; + } + } + } + } +} diff --git a/src/assets/sass/global/components/base/_pulse.scss b/src/assets/sass/global/components/base/_pulse.scss new file mode 100644 index 0000000..9f21b23 --- /dev/null +++ b/src/assets/sass/global/components/base/_pulse.scss @@ -0,0 +1,47 @@ +// +// Pulse +// + + + +// Base +.kt-pulse { + position: relative; + + .kt-pulse__ring { + display: block; + border-radius: 40px; + height: 40px; + width: 40px; + position: absolute; + animation: kt-pulse 3.5s ease-out; + animation-iteration-count: infinite; + opacity: 0; + border-width: 3px; + border-style: solid; + border-color: kt-base-color(grey, 4); + + @include kt-hack-ie { + top: 2px; + left: 2px; + } + } + + // State Colors + @each $name, $color in $kt-state-colors { + &.kt-pulse--#{$name} { + .kt-pulse__ring { + //background-color: rgba(kt-get($color, base), 0.8); + border-color: rgba(kt-get($color, base), 0.8); + } + } + } +} + + +@keyframes kt-pulse { + 0% {-webkit-transform: scale(0.1, 0.1); opacity: 0.0;} + 60% {-webkit-transform: scale(0.1, 0.1); opacity: 0.0;} + 65% {opacity: 1;} + 100% {-webkit-transform: scale(1.2, 1.2); opacity: 0.0;} +} \ No newline at end of file diff --git a/src/assets/sass/global/components/base/_radio.scss b/src/assets/sass/global/components/base/_radio.scss new file mode 100644 index 0000000..df6454c --- /dev/null +++ b/src/assets/sass/global/components/base/_radio.scss @@ -0,0 +1,299 @@ +// +// Checkbox +// + + + + +// Config +$kt-radio-base-color: kt-base-color(grey, 1); + +$kt-radio-config: ( + self: ( + transition: all 0.3s ease, + size: 18px, + tick: 6px + ), + + outline: ( + border: ( + default: darken($kt-radio-base-color, 12%), + checked: darken($kt-radio-base-color, 15%) + ), + tick: darken($kt-radio-base-color, 18%) + ), + + solid: ( + bg: ( + default: darken($kt-radio-base-color, 6%), + checked: darken($kt-radio-base-color, 8%) + ), + tick: darken($kt-radio-base-color, 30%) + ) +); + +// Base +.kt-radio { + display: inline-block; + position: relative; + padding-left: 30px; + text-align: left; + margin-bottom: 10px; + cursor: pointer; + font-size: 1rem; + transition: kt-get($kt-radio-config, self, transition); + + &.kt-radio--disabled { + opacity: 0.8; + cursor: not-allowed; + } + + // Hide default browser input + > input { + position: absolute; + z-index: -1; + opacity: 0; + } + + > span { + background: none; + position: absolute; + top: 1px; + left: 0; + height: kt-get($kt-radio-config, self, size); + width: kt-get($kt-radio-config, self, size); + border-radius: 50% !important; // Makes radio buttons circlular + + &:after { + content:''; + position: absolute; + display: none; // Hide check + top: 50%; + left: 50%; + margin-left: -(kt-get($kt-radio-config, self, tick) / 2); + margin-top: -(kt-get($kt-radio-config, self, tick) / 2); + width: kt-get($kt-radio-config, self, tick); + height: kt-get($kt-radio-config, self, tick); + border-radius: 100% !important; + } + } + + > input:checked ~ span { + transition: kt-get($kt-radio-config, self, transition); + background: none; + &:after { + display: block; + } + } + + &:hover > input:not([disabled]):checked ~ span, + > input:checked ~ span { + transition: kt-get($kt-radio-config, self, transition); + + } + + > input:disabled ~ span { + opacity: 0.6; + pointer-events: none; + } + + &.kt-radio--solid { + > span { + border: 1px solid transparent; + } + + &:hover > input:not([disabled]) ~ span, + > input:focus ~ span { + transition: kt-get($kt-radio-config, self, transition); + } + } + + &.kt-radio--square { + > span { + border-radius: 0; + } + } + + &.kt-radio--bold > span { + border-width: 2px !important; + transition: kt-get($kt-radio-config, self, transition); + } + + .form-inline & { + margin-left: 15px; + margin-right: 15px; + } + + &.kt-radio--single { + width: kt-get($kt-radio-config, self, size); + height: kt-get($kt-radio-config, self, size); + + > span { + top: 0px; + } + + th > &, + td > & { + right: -5px; + } + } + + // Input group + .input-group & { + margin-bottom: 0 !important; + padding-left: 0; + } +} + +.kt-radio-list { + padding: 0 0; + + .form-horizontal .form-group & { + padding-top: 0; + } + + .kt-radio { + display: block; + text-align: left; + + &:last-child { + margin-bottom: 5px; + } + } +} + +.kt-radio-inline { + padding: 0 0; + + .kt-radio { + display: inline-block; + margin-right: 15px; + margin-bottom: 5px; + + &:last-child { + margin-right: 0; + } + } +} + +.form-group.row { + .kt-radio-inline { + margin-top: 0.75rem; + } + + .kt-radio-list { + margin-top: 2px; + } +} + +// Skin +@mixin kt-radio-theme( + $outline-border-color, + $outline-border-checked-color, + $outline-tick-color, + $solid-bg-color, + $solid-bg-checked-color, + $solid-tick-color) { + + &.kt-radio--disabled { + opacity: 0.8; + } + + // Outline + > span { + border: 1px solid $outline-border-color; + + &:after { + border: solid $outline-tick-color; + background: $outline-tick-color; + } + } + + > input:disabled ~ span { + &:after { + border-color: $outline-border-checked-color; + } + } + + > input:checked ~ span { + border: 1px solid $outline-border-checked-color; + } + + &.kt-radio--bold > input:checked ~ span { + border: 2px solid $outline-border-checked-color; + } + + > input:disabled ~ span { + opacity: 0.6; + } + + // Solid + &.kt-radio--solid { + > span { + background: $solid-bg-color; + border: 1px solid transparent !important; + + &:after { + border: solid $solid-tick-color; + background: $solid-tick-color; + } + } + + + > input:focus ~ span { + border: 1px solid transparent !important; + } + + > input:checked ~ span { + background: $solid-bg-checked-color; + } + } + + // Tick + &.kt-radio--tick { + > span { + background: kt-get($kt-checkbox-config, solid, bg, default); + border: 1px solid transparent !important; + } + + > input:focus ~ span { + border: 1px solid transparent !important; + } + + > input:checked ~ span { + background: kt-get($kt-checkbox-config, solid, bg, default); + + &:after { + border: solid $solid-bg-checked-color; + background: $solid-bg-checked-color; + } + } + } +} + +// Default +.kt-radio { + @include kt-radio-theme( + kt-get($kt-radio-config, outline, border, default), + kt-get($kt-radio-config, outline, border, checked), + kt-get($kt-radio-config, outline, tick), + kt-get($kt-radio-config, solid, bg, default), + kt-get($kt-radio-config, solid, bg, checked), + kt-get($kt-radio-config, solid, tick) + ); + + // State Colors + @each $name, $color in $kt-state-colors { + // default state + &.kt-radio--#{$name} { + @include kt-radio-theme( + kt-get($color, base), + kt-get($color, base), + kt-get($color, base), + kt-get($color, base), + kt-get($color, base), + kt-get($color, inverse) + ); + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/base/_scrolltop.scss b/src/assets/sass/global/components/base/_scrolltop.scss new file mode 100644 index 0000000..ea0aa14 --- /dev/null +++ b/src/assets/sass/global/components/base/_scrolltop.scss @@ -0,0 +1,67 @@ +// +// Scrolltop +// + + + +// Base +.kt-scrolltop { + display: none; + justify-content: center; + align-items: center; + width: 40px; + height: 40px; + position: fixed; + bottom: 40px; + right: 20px; + cursor: pointer; + z-index: 100; + background: kt-brand-color(); + box-shadow: 0 0 15px 1px rgba(69,65,78, 0.2); + opacity: 0; + @include kt-transition(); + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + svg { + height: 20px; + width: 20px; + } + + > i { + font-size: 1.3rem; + color: kt-brand-color(inverse); + } + + @include kt-svg-icon-color(kt-brand-color(inverse)); + + &:hover { + > i { + color: kt-brand-color(inverse); + } + } + + .kt-scrolltop--on & { + opacity: 0.3; + animation: kt-scrolltop-show-animation .4s ease-out 1; + display: flex; + + &:hover { + @include kt-transition(); + opacity: 1; + } + } + + @include kt-tablet-and-mobile { + bottom: 30px; + right: 15px; + } +} + +// Animations +@keyframes kt-scrolltop-show-animation { + from { margin-bottom: -15px } + to { margin-bottom: 0; } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/base/_spinner.scss b/src/assets/sass/global/components/base/_spinner.scss new file mode 100644 index 0000000..a008b2d --- /dev/null +++ b/src/assets/sass/global/components/base/_spinner.scss @@ -0,0 +1,97 @@ +// +// Spinner +// + + + + +// Config +$kt-spinner-config: ( + size: ( + sm: 16px, + md: 20px, + lg: 24px + ) +); + +// Spinner Default +.kt-spinner { + position: relative; + + &:before { + content: ''; + box-sizing: border-box; + position: absolute; + top: 50%; + left: 0; + border-radius: 50%; + } + + // Sizes + &.kt-spinner--sm { + @include kt-spinner-size(sm); + } + + @include kt-spinner-size(md); + + &.kt-spinner--lg { + @include kt-spinner-size(lg); + } + + // Default Style + &:before { + animation: kt-spinner .5s linear infinite; + } + + // State Colors + @each $name, $color in $kt-state-colors { + &.kt-spinner--#{$name} { + &:before { + border: 2px solid kt-get($color, base); + border-right: 2px solid transparent; + } + } + } + + // Input mode + &.kt-spinner--input { + &.kt-spinner--right { + &:before { + left: auto; + right: $input-btn-padding-x; + } + } + + &.kt-spinner--left { + &:before { + right: auto; + left: $input-btn-padding-x; + } + } + } + + // Spinner Default + &.kt-spinner--v2 { + // Default Style + &:before { + animation: kt-spinner .5s linear infinite; + } + + // State Colors + @each $name, $color in $kt-state-colors { + &.kt-spinner--#{$name} { + &:before { + border: 2px solid lighten(kt-get($color, base), 30%); + border-top-color: darken(kt-get($color, base), 3%); + } + } + } + } +} + +// Animations +@keyframes kt-spinner { + to { + transform: rotate(360deg); + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/base/_switch.scss b/src/assets/sass/global/components/base/_switch.scss new file mode 100644 index 0000000..147cb13 --- /dev/null +++ b/src/assets/sass/global/components/base/_switch.scss @@ -0,0 +1,282 @@ +// +// Switch +// + + + + +// Component Base +@mixin kt-switch-base() { + .kt-switch { + // Base + display: inline-block; + font-size: 1rem; + + input:empty { + margin-left: -999px; + height: 0; + width: 0; + overflow: hidden; + position: absolute; + opacity: 0; + } + + input:empty ~ span { + display: inline-block; + position: relative; + float: left; + width: 1px; + text-indent: 0; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + + input:empty ~ span:before, + input:empty ~ span:after { + position: absolute; + display: block; + top: 0; + bottom: 0; + left: 0; + content: ' '; + -webkit-transition: all 100ms ease-in; + transition: all 100ms ease-in; + } + + // State icons + &.kt-switch--icon { + input:empty ~ span:after { + @include kt-la-icon-self('\f342'); + } + + input:checked ~ span:after { + content: '\f17b'; + } + } + + // State icons + &.kt-switch--icon-check { + input:checked ~ span:after { + @include kt-la-icon-self('\f17b'); + } + } + + // Default size + & { + $kt-switch-margin: 2px 0; + $kt-switch-width: 54px; + $kt-switch-height: 30px; + $kt-switch-line-height: 26px; + $kt-switch-space: 3px; + $kt-switch-checked-tick-pos: 26px; + $kt-switch-icon-font-size: 0.9em; + + @include kt-switch-size( + $kt-switch-margin, + $kt-switch-width, + $kt-switch-height, + $kt-switch-line-height, + $kt-switch-space, + $kt-switch-checked-tick-pos, + $kt-switch-icon-font-size + ); + } + + // Large size + &.kt-switch--lg { + $kt-switch-margin: 2px 0; + $kt-switch-width: 72px; + $kt-switch-height: 40px; + $kt-switch-line-height: 34px; + $kt-switch-space: 3px; + $kt-switch-checked-tick-pos: 34px; + $kt-switch-icon-font-size: 1em; + + @include kt-switch-size( + $kt-switch-margin, + $kt-switch-width, + $kt-switch-height, + $kt-switch-line-height, + $kt-switch-space, + $kt-switch-checked-tick-pos, + $kt-switch-icon-font-size + ); + } + + // Small size + &.kt-switch--sm { + $kt-switch-margin: 2px 0; + $kt-switch-width: 38px; + $kt-switch-height: 24px; + $kt-switch-line-height: 20px; + $kt-switch-space: 2px; + $kt-switch-checked-tick-pos: 16px; + $kt-switch-icon-font-size: 0.8em; + + @include kt-switch-size( + $kt-switch-margin, + $kt-switch-width, + $kt-switch-height, + $kt-switch-line-height, + $kt-switch-space, + $kt-switch-checked-tick-pos, + $kt-switch-icon-font-size + ); + } + + // Form group + .form-group.row & { + margin-top: 0.15rem; + + &.kt-switch--lg { + margin-top: 0rem; + position: relative; + top: -0.3rem; + } + + &.kt-switch--sm { + margin-top: 0.3rem; + } + } + } +} + +// Component Size +@mixin kt-switch-size($margin, $width, $height, $line-height, $space, $checked-tick-pos, $icon-font-size) { + input:empty ~ span { + line-height: $height; + margin: $margin; + height: $height; + width: $width + $space; + border-radius: ($height/2); + } + + input:empty ~ span:before, + input:empty ~ span:after { + width: $width; + border-radius: ($height/2); + } + + input:empty ~ span:after { + height: $height - 2 * $space; + width: $height - 2 * $space; + line-height: $line-height; + top: $space; + bottom: $space; + margin-left: $space; + font-size: $icon-font-size; + text-align: center; + vertical-align: middle; + } + + input:checked ~ span:after { + margin-left: $checked-tick-pos; + } +} + +// Component Skin +@mixin kt-switch-skin() { + $base-color: #e8ebf1; + + .kt-switch { + // Panel bg + input:empty ~ span:before { + background-color: $base-color; + } + + // Tick bg + input:empty ~ span:after { + color: lighten($base-color, 5%); + background-color: #ffffff; + } + + // Checked state + input:checked { + // Panel bg + ~ span:before { + background-color: $base-color; + //box-shadow: 0px 3px 20px 0px rgba($base-color, 0.41); + } + + // Tick bg + ~ span:after { + background-color: kt-state-color(brand, base); + color: kt-state-color(brand, inverse); + //box-shadow: 0px 3px 20px 0px rgba($base-color, 0.41); + } + } + + input[disabled] { + cursor: not-allowed; + + ~ span:after, + ~ span:before { + cursor: not-allowed; + opacity: 0.7; + } + } + + // States + @each $name, $color in $kt-state-colors { + // states + &.kt-switch--#{$name}:not(.kt-switch--outline) { + input:empty ~ span:before { + background-color: kt-get($color, base); + } + + input:empty ~ span:after { + color: kt-get($color, base); + background-color: kt-get($color, inverse); + opacity: 0.4; + } + + input:checked { + // Panel bg + ~ span:before { + background-color: kt-get($color, base); + } + + // Tick bg + ~ span:after { + opacity: 1; + } + } + } + + // outline style states + &.kt-switch--outline.kt-switch--#{$name} { + input:empty ~ span:before { + border: 2px solid darken($base-color, 3%); + background-color: $base-color; + } + + input:empty ~ span:after { + color: kt-get($color, inverse); + background-color: kt-get($color, panel); + } + + input:checked { + // Panel bg + ~ span:before { + background-color: kt-get($color, inverse); + } + + // Tick bg + ~ span:after { + background-color: kt-get($color, base); + opacity: 1; + } + } + } + } + } +} + +// Component Base +@include kt-switch-base(); + +// Component Skin +@include kt-switch-skin(); \ No newline at end of file diff --git a/src/assets/sass/global/components/base/mixins/_burger-menu.scss b/src/assets/sass/global/components/base/mixins/_burger-menu.scss new file mode 100644 index 0000000..0490744 --- /dev/null +++ b/src/assets/sass/global/components/base/mixins/_burger-menu.scss @@ -0,0 +1,204 @@ +// +// Burger Icon Mixins +// + + + + +@mixin kt-burger-icon-build($class, $config) { + $space: kt-get($config, thickness) + kt-get($config, space); + + .#{$class} { + display: inline-block; + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + font-size: 0; + text-indent: -9999px; + appearance: none; + box-shadow: none; + border-radius: none; + border: none; + cursor: pointer; + background: none; + outline: none !important; + width: kt-get($config, width); + height: kt-get($config, height); + transition: all kt-get($config, transition-duration) ease; + + span { + display: block; + position: absolute; + top: (kt-get($config, height) / 2) - (kt-get($config, thickness)) + 1px; + height: kt-get($config, thickness); + min-height: kt-get($config, thickness); + width: 100%; + + @include kt-rounded { + border-radius: kt-get($config, radius); + } + + transition: all kt-get($config, transition-duration) ease; + + &::before, + &::after { + position: absolute; + display: block; + left: 0; + width: 100%; + height: kt-get($config, thickness); + min-height: kt-get($config, thickness); + content: ""; + + @include kt-rounded { + border-radius: kt-get($config, radius); + } + + transition: all kt-get($config, transition-duration) ease; + } + + &::before { + top: -($space); + } + + &::after { + bottom: -($space); + } + } + + // left direction style + &.#{$class}--left { + span { + &:before { + transition: all kt-get($config, transition-duration) ease; + left: auto; + right: 0px; + width: 50%; + } + + &:after { + transition: all kt-get($config, transition-duration) ease; + left: auto; + right: 0px; + width: 75%; + } + } + + // hover states + &:hover { + span { + &:after, + &:before { + width: 100%; + transition: all kt-get($config, transition-duration) ease; + } + } + } + + // active state + &.#{$class}--active { + span { + &:before { + transition: all kt-get($config, transition-duration) ease; + left: 0px; + right: auto; + width: 50%; + } + + &:after { + transition: all kt-get($config, transition-duration) ease; + left: 0px; + right: auto; + width: 75%; + } + } + } + } + + // right direction style + &.#{$class}--right { + span { + &:before { + left: 0px; + right: auto; + width: 50%; + transition: width kt-get($config, transition-duration) ease; + } + + &:after { + left: 0px; + right: auto; + width: 75%; + transition: width kt-get($config, transition-duration) ease; + } + } + + // hover states + &:hover { + span { + &:after, + &:before { + width: 100%; + transition: width kt-get($config, transition-duration) ease; + } + } + } + + // active state + &.#{$class}--active { + span { + &:before { + left: auto; + right: 0px; + width: 50%; + transition: width kt-get($config, transition-duration) ease; + } + + &:after { + left: auto; + right: 0px; + width: 75%; + transition: width kt-get($config, transition-duration) ease; + } + } + } + } + } +} + +@mixin kt-burger-icon-skin($class, $config) { + .#{$class} { + span { + background: kt-get($config, default); + + &::before, + &::after { + background: kt-get($config, default); + } + } + + //active & hover state + &:hover { + span { + background: kt-get($config, hover); + + &::before, + &::after { + background: kt-get($config, hover); + } + } + } + + &.#{$class}--active { + span { + background: kt-get($config, active); + + &::before, + &::after { + background: kt-get($config, active); + } + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/base/mixins/_grid.scss b/src/assets/sass/global/components/base/mixins/_grid.scss new file mode 100644 index 0000000..534b780 --- /dev/null +++ b/src/assets/sass/global/components/base/mixins/_grid.scss @@ -0,0 +1,117 @@ +// +// Grid Mixins +// + + + + +@mixin kt-grid-generate($mode) { + $mode-class: ''; + $mode-dir: ''; + + // Grid mode + @if ($mode == general) { + $mode-class: ":not(.kt-grid--desktop):not(.kt-grid--desktop-and-tablet):not(.kt-grid--tablet):not(.kt-grid--tablet-and-mobile):not(.kt-grid--mobile)"; + } @else { + $mode-class: ".kt-grid--" + $mode; + $mode-dir: "-" + $mode; + } + + // Horizontal grid + .kt-grid.kt-grid--hor#{$mode-dir}#{$mode-class} { + display: flex; + flex-direction: column; + + &.kt-grid--root { + flex: 1; + -ms-flex: 1 0 0px; // IE10-11 fix + } + + > .kt-grid__item { + flex: none; + + &.kt-grid__item--fluid, + &.kt-grid__item--fluid#{$mode-dir} { + flex: 1 0 auto; + //-ms-flex: 1 0 0px; // IE10-11 fix + } + } + + // flex ordering + @for $i from 1 through 12 { + > .kt-grid__item.kt-grid__item--order-#{$i}#{$mode-dir} { + order: $i; + } + } + } + + // Vertical grid + .kt-grid.kt-grid--ver#{$mode-dir}#{$mode-class} { + display: flex; + flex-direction: row; + + &.kt-grid--root { + flex: 1; + -ms-flex: 1 0 0px; // IE10-11 fix + } + + > .kt-grid__item { + flex: 0 0 auto; + + &.kt-grid__item--fluid, + &.kt-grid__item--fluid#{$mode-dir} { + flex: 1 auto; + -ms-flex: 1 0 0px; // IE10-11 fix + min-width: 0; + + @include kt-hack-ie { + min-width: none; // IE10-11 fix + } + } + } + + // flex ordering + @for $i from 1 through 12 { + > .kt-grid__item.kt-grid__item--order-#{$i}#{$mode-dir} { + order: $i; + } + } + } + + // Grid item order + .kt-grid { + // horizontal items aligment + &.kt-grid--center { + align-content: center; + } + + &.kt-grid--stretch { + align-items: stretch; + } + + // vertical item alignment + > .kt-grid__item { + max-width:100%; + + &.kt-grid__item--top { + align-self: flex-start; + } + + &.kt-grid__item--middle { + align-self: center; + } + + + &.kt-grid__item--bottom { + align-self: flex-end; + } + } + + // flex ordering + @for $i from 1 through 12 { + > .kt-grid__item.kt-grid__item--order-#{$i} { + order: $i; + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/base/mixins/_menu-horizontal.scss b/src/assets/sass/global/components/base/mixins/_menu-horizontal.scss new file mode 100644 index 0000000..59ed37d --- /dev/null +++ b/src/assets/sass/global/components/base/mixins/_menu-horizontal.scss @@ -0,0 +1,986 @@ +// +// Horizontal Menu Mixins +// + + + + +// Helpers +@mixin kt-menu-hor-item-base($item) { + // item + @include kt-attr(margin, kt-get($item, self, margin)); + @include kt-attr(padding, kt-get($item, self, padding)); + + // link + > .kt-menu__link { + transition: all 0.3s ease; + cursor: pointer; + @include kt-attr(padding, kt-get($item, link, self, padding)); + @include kt-attr(margin, kt-get($item, link, self, margin)); + + &:hover { + transition: all 0.3s ease; + } + + // link icon + .kt-menu__link-icon { + font-size: kt-get($item, link, icon, font-size); + width: kt-get($item, link, icon, width); + padding: kt-get($item, link, icon, padding); + line-height: 0; + + // duo-tone svg icon + svg { + @include kt-attr(height, kt-get($item, link, icon, svg-width)); + @include kt-attr(width, kt-get($item, link, icon, svg-width)); + margin-left: -2px; + } + } + + // link bullet + .kt-menu__link-bullet { + width: kt-get($item, link, bullet, self, width); + + @if kt-has($item, link, bullet, padding) { + padding: kt-get($item, link, bullet, padding); + } + + > span { + vertical-align: middle; + display: inline-block; + } + + &.kt-menu__link-bullet--dot { + > span { + width: kt-get($item, link, bullet, dot, size); + height: kt-get($item, link, bullet, dot, size); + border-radius: 100%; + } + } + + &.kt-menu__link-bullet--line { + > span { + width: kt-get($item, link, bullet, line, width); + height: kt-get($item, link, bullet, line, height); + } + } + } + + // link text + .kt-menu__link-text { + font-weight: kt-get($item, link, text, font-weight); + font-size: kt-get($item, link, text, font-size); + text-transform: kt-get($item, link, text, font-transform); + + @if kt-has($item, link, text, padding) { + padding: kt-get($item, link, text, padding); + } + } + + // link badge + .kt-menu__link-badge { + padding: kt-get($item, link, badge, padding); + justify-content: kt-get($item, link, badge, align); + } + + // link arrow icon + .kt-menu__hor-arrow { + font-size: kt-get($item, link, arrow, font-size); + width: kt-get($item, link, arrow, width); + justify-content: flex-end; + + @if kt-has($item, link, arrow, padding) { + padding: kt-get($item, link, arrow, padding); + } + + &:before { + [direction="rtl"] & { + content: "#{kt-get($kt-action-icons, left)}" !important; + } + } + } + + // link border radius + @include kt-rounded { + @include kt-attr(border-radius, kt-get($item, link, self, border-radius)); + } + + // menu root level "here" arrow + .kt-menu__item-here { + display: none; + } + } +} + +@mixin kt-menu-hor-item-skin($item) { + // link + > .kt-menu__link { + background-color: kt-get($item, link, self, bg-color, default); + + // link icon + .kt-menu__link-icon { + color: kt-get($item, link, icon, font-color, default); + + // Due-tone icon + svg { + @include kt-svg-icon-color(kt-get($item, link, icon, font-color, default)); + } + } + + // link bullet + .kt-menu__link-bullet { + &.kt-menu__link-bullet--dot { + > span { + background-color: kt-get($item, link, bullet, dot, bg-color, default); + } + } + + &.kt-menu__link-bullet--line { + > span { + background-color: kt-get($item, link, bullet, line, bg-color, default); + } + } + } + + // link text + .kt-menu__link-text { + color: kt-get($item, link, text, font-color, default); + + @if kt-has($item, link, text, font-weight) { + font-weight: kt-get($item, link, text, font-weight); + } + } + + // link arrow icon + .kt-menu__hor-arrow { + color: kt-get($item, link, arrow, font-color, default); + } + } + + // active state + &.kt-menu__item--active { + > .kt-menu__link { + // link bg color + background-color: kt-get($item, link, self, bg-color, active); + + // link icon + .kt-menu__link-icon { + color: kt-get($item, link, icon, font-color, active); + + // Due-tone icon + svg { + @include kt-svg-icon-color(kt-get($item, link, icon, font-color, active)); + } + } + + // link bullet + .kt-menu__link-bullet { + &.kt-menu__link-bullet--dot { + > span { + background-color: kt-get($item, link, bullet, dot, bg-color, active); + } + } + + &.kt-menu__link-bullet--line { + > span { + background-color: kt-get($item, link, bullet, line, bg-color, active); + } + } + } + + .kt-menu__link-text { + color: kt-get($item, link, text, font-color, active); + } + + // link arrow icon + > .kt-menu__hor-arrow { + color: kt-get($item, link, arrow, font-color, active); + } + } + } + + // here state + &.kt-menu__item--here { + > .kt-menu__link { + // link bg color + background-color: kt-get($item, link, self, bg-color, here); + + // link icon + .kt-menu__link-icon { + color: kt-get($item, link, icon, font-color, here); + + // Due-tone icon + svg { + @include kt-svg-icon-color(kt-get($item, link, icon, font-color, here)); + } + } + + // link bullet + .kt-menu__link-bullet { + &.kt-menu__link-bullet--dot { + > span { + background-color: kt-get($item, link, bullet, dot, bg-color, here); + } + } + + &.kt-menu__link-bullet--line { + > span { + background-color: kt-get($item, link, bullet, line, bg-color, here); + } + } + } + + .kt-menu__link-text { + color: kt-get($item, link, text, font-color, here); + } + + // link arrow icon + > .kt-menu__hor-arrow { + color: kt-get($item, link, arrow, font-color, here); + } + } + } + + // hover state + &:hover:not(.kt-menu__item--here):not(.kt-menu__item--active), + &.kt-menu__item--hover:not(.kt-menu__item--here):not(.kt-menu__item--active) { + > .kt-menu__link { + // link bg color + background-color: kt-get($item, link, self, bg-color, hover); + + // link icon + .kt-menu__link-icon { + color: kt-get($item, link, icon, font-color, hover); + + // Due-tone icon + svg { + @include kt-svg-icon-color(kt-get($item, link, icon, font-color, hover)); + } + } + + // link bullet + .kt-menu__link-bullet { + &.kt-menu__link-bullet--dot { + > span { + background-color: kt-get($item, link, bullet, dot, bg-color, hover); + } + } + + &.kt-menu__link-bullet--line { + > span { + background-color: kt-get($item, link, bullet, line, bg-color, hover); + } + } + } + + // link text + .kt-menu__link-text { + color: kt-get($item, link, text, font-color, hover); + } + + // link arrow icon + > .kt-menu__hor-arrow { + color: kt-get($item, link, arrow, font-color, hover); + } + } + } +} + +@mixin kt-menu-hor-item-heading-base($item) { + // heading + padding: kt-get($item, self, padding); + + // text + > .kt-menu__link-text { + font-weight: kt-get($item, caption, text, font-weight); + font-size: kt-get($item, caption, text, font-size); + text-transform: kt-get($item, caption, text, font-transform); + } + + // icon + > .kt-menu__link-icon { + font-size: kt-get($item, caption, icon, font-size); + flex: 0 0 kt-get($item, caption, icon, width); + justify-content: kt-get($item, caption, icon, align); + padding: kt-get($item, caption, icon, padding); + } + + // badge + .kt-menu__link-badge { + padding: kt-get($item, caption, badge, padding); + text-align: kt-get($item, caption, badge, align); + } +} + +@mixin kt-menu-hor-item-heading-skin($item) { + // text + > .kt-menu__link-text { + color: kt-get($item, caption, text, font-color); + } + + // icon + > .kt-menu__link-icon { + color: kt-get($item, caption, icon, font-color); + } +} + +@mixin kt-menu-hor-submenu-width($config) { + @include kt-media-range(lg, xl) { + .#{kt-get($config, base, class)} { + .kt-menu__nav { + // menu root item + > .kt-menu__item { + // general submenu + .kt-menu__submenu { + &.kt-menu__submenu--full, + &.kt-menu__submenu--fixed, + &.kt-menu__submenu--auto, + &.kt-menu__submenu--auto.kt-menu__submenu--mimimal-desktop-wide, + &.kt-menu__submenu--fixed-xl, + &.kt-menu__submenu--fixed-xxl { + margin: 0 auto; + width: auto; + left: 20px; + right: 20px; + } + } + } + } + } + } + + // Responsive container widths + @each $breakpoint, $breakpoint-width in $kt-media-breakpoints { + @media (min-width: $breakpoint-width) { + .#{kt-get($config, base, class)} { + .kt-menu__nav { + // menu root item + > .kt-menu__item { + // general submenu + .kt-menu__submenu.kt-menu__submenu--fixed-#{$breakpoint} { + width: map-get($kt-media-breakpoints, $breakpoint) - 60px; + } + } + } + } + } + } +} + +@mixin kt-menu-hor-base($config) { + .#{kt-get($config, base, class)} { + display: flex; + align-items: stretch; + height: 100%; + margin: kt-get($config, build, layout, self, margin); + + // general menu + .kt-menu__nav { + list-style: none; + margin: 0; + padding: 0; + display: flex; + align-items: stretch; + + // menu root item + > .kt-menu__item { + // general link + .kt-menu__link { + display: flex; + text-decoration: none; + position: relative; + vertical-align: middle; + align-items: stretch; + outline: none !important; + text-decoration: none; + cursor: pointer; + + .kt-menu__link-text { + display: flex; + align-items: center; + flex-grow: 1; + padding: 0; + } + + .kt-menu__link-badge { + display: flex; + align-items: center; + line-height: 0; + white-space: nowrap; + } + + // link icon + .kt-menu__link-icon { + display: flex; + align-items: center; + } + + // sub menu link arrow icon + .kt-menu__hor-arrow { + display: flex; + align-items: center; + } + + // hide sidebar sub menu link arrow icon + .kt-menu__ver-arrow { + display: none; + } + + &:hover, + &:active, + &:focus { + text-decoration: none; + } + } + + // primary link + > .kt-menu__link { + > .kt-menu__link-text { + width: auto; + } + } + + // icon only menu item + &.kt-menu__item--icon-only { + > .kt-menu__link { + justify-content: center; + + > .kt-menu__link-icon { + justify-content: center; + } + } + } + + // general submenu + .kt-menu__submenu { + @include kt-fix-animation-lags(); + display: none; + z-index: kt-get($config, build, layout, item, submenu, self, zindex); + position: absolute; + top: 100%; + + @include kt-rounded { + border-radius: kt-get($config, build, layout, item, submenu, self, border-radius); + } + + @include kt-attr(margin, kt-get($config, build, layout, item, submenu, self, margin)); + @include kt-attr(padding, kt-get($config, build, layout, item, submenu, self, padding, classic)); + + .kt-menu__scroll { + position: relative; + overflow: hidden; + display: flex; + flex-direction: column; + flex-grow: 1; + } + + .kt-menu__subnav { + list-style: none !important; + padding: 0; + margin: 0; + } + + // classic submenu + & { + width: kt-get($config, build, layout, item, submenu, self, width, classic); + margin: 0 auto; + left: auto; + right: auto; + } + + // full width + &.kt-menu__submenu--full { + margin: 0 auto; + width: auto; + left: kt-get($config, build, layout, item, submenu, self, width, full, offset); + right: kt-get($config, build, layout, item, submenu, self, width, full, offset); + } + + // fixed width options + &.kt-menu__submenu--fixed { + left: auto; + right: auto; + width: auto; + } + + // alignment right + &.kt-menu__submenu--right { + right: 0; + left: auto; + + &.kt-menu__submenu--pull { + margin-right: -40px; + } + } + + // alignment left + &.kt-menu__submenu--left { + right: auto; + left: 0; + + &.kt-menu__submenu--pull { + margin-left: -40px; + } + } + + // alignment center + &.kt-menu__submenu--center { + margin: 0 auto; + left: 0; + right: 0; + } + + // sub menu dropdown + > .kt-menu__subnav { + > .kt-menu__item.kt-menu__item--submenu { + position: relative; + padding: 0; + margin: 0; + + > .kt-menu__submenu { + top:0; + display: none; + margin-top: 0; + + &.kt-menu__submenu--left { + right: 100%; + left: auto; + } + + &.kt-menu__submenu--right { + left: 100%; + right: auto; + } + } + } + } + + // mega menu content + .kt-menu__content { + display: flex; + list-style: none; + padding: 0; + margin: 0; + + > .kt-menu__item { + padding: 0; + margin: 0; + display: flex; + flex-direction: column; + flex-grow: 1; + + &:last-child { + border-right: 0; + } + } + } + + // mega heading + .kt-menu__heading { + display: flex; + align-items: center; + padding: 0; + margin: 0; + text-decoration: none; + position: relative; + + .kt-menu__link-text { + display: flex; + align-items: center; + flex-grow: 1 + } + + .kt-menu__link-badge { + display: flex; + align-items: center; + white-space: nowrap; + } + + // link icon + .kt-menu__link-icon { + display: flex; + align-items: center; + font-size: 18px; + padding: 0 10px 0 0; + } + + // sub menu link arrow icon + .kt-menu__hor-arrow { + display: flex; + align-items: center; + padding: 0 0 0 10px; + } + + // hide sidebar sub menu link arrow icon + .kt-menu__ver-arrow { + display: none; + } + } + } + + .kt-menu__inner, + .kt-menu__subnav { + list-style: none; + margin: 0; + padding: 0; + + > .kt-menu__item { + display: flex; + flex-grow: 1; + margin: 0; + padding: 10px 20px; + + .kt-menu__link { + display: flex; + align-items: center; + flex-grow: 1; + text-decoration: none; + position: relative; + + &:hover, + &:active, + &:focus { + outline: none; + text-decoration: none; + } + + .kt-menu__link-text { + display: flex; + align-items: center; + font-weight: kt-get($config, build, layout, item, submenu, item, link, text, font-weight); + color: kt-get($config, build, layout, item, submenu, item, link, text, font-color, default); + font-size: kt-get($config, build, layout, item, submenu, item, link, text, font-size); + text-transform: kt-get($config, build, layout, item, submenu, item, link, text, font-transform); + } + + .kt-menu__link-badge { + display: flex; + align-items: center; + white-space: nowrap; + padding: kt-get($config, build, layout, item, submenu, item, link, badge, padding); + text-align: kt-get($config, build, layout, item, submenu, item, link, badge, align); + } + + // link icon + .kt-menu__link-icon { + display: flex; + align-items: center; + flex: 0 0 kt-get($config, build, layout, item, submenu, item, link, icon, width); + padding: kt-get($config, build, layout, item, submenu, item, link, icon, padding); + color: kt-get($config, build, layout, item, submenu, item, link, icon, font-color, default); + font-size: kt-get($config, build, layout, item, submenu, item, link, icon, font-size); + text-align: kt-get($config, build, layout, item, submenu, item, link, icon, align); + } + + // menu item link's icon part + .kt-menu__link-bullet { + display: flex; + align-items: center; + line-height: 0; + } + + // sub menu link arrow icon + .kt-menu__hor-arrow { + display: flex; + align-items: center; + padding: kt-get($config, build, layout, item, submenu, item, link, arrow, padding); + } + + // hide sidebar sub menu link arrow icon + .kt-menu__ver-arrow { + display: none; + } + } + } + } + + .kt-menu__inner { + padding: 0; + } + + // sub dropdown menu space + @if kt-has($config, build, layout, item, submenu, self, space) { + .kt-menu__submenu { + .kt-menu__submenu { + margin-left: kt-get($config, build, layout, item, submenu, self, space); + + &.kt-menu__submenu--left { + margin-right: kt-get($config, build, layout, item, submenu, self, space); + } + } + } + } + + // tabs integration + &.kt-menu__item--submenu.kt-menu__item--tabs > .kt-menu__submenu > .kt-menu__subnav > .kt-menu__item.kt-menu__item--submenu { + > .kt-menu__submenu { + top:100%; + + &.kt-menu__submenu--left { + right: 100%; + left: 0; + } + + &.kt-menu__submenu--right { + left: 100%; + right: 0; + } + } + } + } + } + + // root menu + .kt-menu__nav { + > .kt-menu__item { + display: flex; + align-items: center; + padding: kt-get($config, build, layout, item, self, padding); + + // used for classic submenus + &.kt-menu__item--rel { + position: relative; + } + + @include kt-menu-hor-item-base( kt-get($config, build, layout, item) ); + + // submenu + .kt-menu__submenu { + padding: kt-get($config, build, layout, item, submenu, self, padding, megamenu); + @include kt-rounded { + border-radius: kt-get($config, build, layout, item, submenu, self, border-radius); + } + + > .kt-menu__subnav { + > .kt-menu__item { + @include kt-menu-hor-item-base(kt-get($config, build, layout, item, submenu, item)); + } + + // mega submenu + .kt-menu__content { + align-items: stretch; + // separator + > .kt-menu__item { + flex-grow: 1; + flex-basis: 0; + + &:last-child { + border-right:0 !important; + } + } + + // heading + .kt-menu__heading { + @include kt-menu-hor-item-heading-base(kt-get($config, build, layout, item, submenu, item, column, heading)); + } + + // mega menu + .kt-menu__inner { + padding: kt-get($config, build, layout, item, submenu, item, column, self, padding); + + > .kt-menu__item { + @include kt-menu-hor-item-base(kt-get($config, build, layout, item, submenu, item)); + } + } + } + } + + &.kt-menu__submenu--classic { + padding: kt-get($config, build, layout, item, submenu, self, padding, classic); + > .kt-menu__subnav { + + } + } + + // inline submenu + &.kt-menu__submenu--inline { + display: flex; + flex: 0 0 auto; + + > .kt-menu__subnav { + > .kt-menu__item { + display: flex; + padding: 5px 0; + } + } + } + } + } + + // general submenu hover effect + .kt-menu__item { + // menu resize item + &.kt-menu__item--resize { + display: none; + } + + // menu item hover + &.kt-menu__item--active-tab, + &.kt-menu__item--hover { + .kt-menu__submenu { + display: block; + animation: #{kt-get($config, base, class)}-submenu-fade-in .3s ease 1, #{kt-get($config, base, class)}-submenu-move-down .3s ease-out 1; + + // ie8-11 versions hack + @include kt-hack-ie { + animation: none; + } + + > .kt-menu__subnav > .kt-menu__item.kt-menu__item--hover { + > .kt-menu__submenu { + display: block; + animation: #{kt-get($config, base, class)}-submenu-fade-in .3s ease 1, #{kt-get($config, base, class)}-submenu-move-up .3s ease-out 1; + + // ie8-11 versions hack + @include kt-hack-ie { + animation: none; + } + } + } + } + } + } + } + } +} + +@mixin kt-menu-hor-skin($base-class, $config) { + .#{$base-class} { + // root level items + @if kt-has($config, item, link) { + .kt-menu__nav { + > .kt-menu__item { + @if kt-get($config, item, self) { + &.kt-menu__item--hover, + &:hover { + background-color: kt-get($config, item, self, bg-color, hover); + } + + &.kt-menu__item--here { + background-color: kt-get($config, item, self, bg-color, here); + } + + &.kt-menu__item--open, + &.kt-menu__item--active { + background-color: kt-get($config, item, self, bg-color, active); + } + } + + @include kt-menu-hor-item-skin(kt-get($config, item)); + } + } + } + + // submenu level items + .kt-menu__nav { + > .kt-menu__item { + // classic submenu + .kt-menu__submenu { + background-color: kt-get($config, item, submenu, self, bg-color); + box-shadow: kt-get($config, item, submenu, self, box-shadow); + + > .kt-menu__subnav { + // submenu item + > .kt-menu__item { + @include kt-menu-hor-item-skin(kt-get($config, item, submenu, item)); + } + + // mega submenu + .kt-menu__content { + // separator + > .kt-menu__item { + border-right: kt-get($config, item, submenu, item, column, separator, border); + } + + // heading + .kt-menu__heading { + @include kt-menu-hor-item-heading-skin(kt-get($config, item, submenu, item, column, heading)); + } + + // mega menu + .kt-menu__inner { + > .kt-menu__item { + @include kt-menu-hor-item-skin(kt-get($config, item, submenu, item)); + } + } + } + } + } + } + } + } +} + +// Build +// Build Skin +@mixin kt-menu-hor-build-skin($config, $skin) { + $skin-config: (); + + @if ($skin == default) { + $skin-config: kt-get($config, build, skin); + } @else { + $skin-config: kt-get($config, build, skins, $skin); + } + + // Base vertical menu + @if (kt-get($config, base, mode) == general) { + + @include kt-menu-hor-skin(kt-get($config, base, class), $skin-config); + + } @else if (kt-get($config, base, mode) == desktop) { + + @include kt-desktop { + @include kt-menu-hor-skin(kt-get($config, base, class), $skin-config); + } + + } @else if (kt-get($config, base, mode) == desktop-and-tablet) { + + @include kt-desktop-and-tablet { + @include kt-menu-hor-skin(kt-get($config, base, class), $skin-config); + } + } +} + +// Build Layout +@mixin kt-menu-hor-build-layout($config) { + // Base vertical menu + @if (kt-get($config, base, mode) == general) { + + @include kt-menu-hor-base($config); + + } @else if (kt-get($config, base, mode) == desktop) { + + @include kt-desktop { + @include kt-menu-hor-base($config); + } + + @include kt-menu-hor-submenu-width($config); + + } @else if (kt-get($config, base, mode) == desktop-and-tablet) { + + @include kt-desktop-and-tablet { + @include kt-menu-hor-base($config); + } + } + + // Horizontal Menu Hoverable Submenu Animations + @keyframes #{kt-get($config, base, class)}-submenu-fade-out { + from { opacity: 1; } + to { opacity: 0; } + } + + @keyframes #{kt-get($config, base, class)}-submenu-fade-in { + from { opacity: 0; } + to { opacity: 1; } + } + + @keyframes #{kt-get($config, base, class)}-submenu-move-up { + from { margin-top: kt-get($config, build, layout, item, submenu, self, animation, offset); } + to { margin-top: 0; } + } + + @keyframes #{kt-get($config, base, class)}-submenu-move-down { + from { margin-top: -(kt-get($config, build, layout, item, submenu, self, animation, offset)); } + to { margin-top: 0; } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/base/mixins/_menu-vertical.scss b/src/assets/sass/global/components/base/mixins/_menu-vertical.scss new file mode 100644 index 0000000..076f71d --- /dev/null +++ b/src/assets/sass/global/components/base/mixins/_menu-vertical.scss @@ -0,0 +1,1288 @@ +// +// Vertical Menu Generator Helpers +// + + + +// Item +@mixin kt-menu-ver-item-base($item) { + // item + @include kt-attr(margin, kt-get($item, self, margin)); + @include kt-attr(padding, kt-get($item, self, padding)); + + // item link and heading + > .kt-menu__heading, + > .kt-menu__link { + cursor: pointer; + + // link height + min-height: kt-get($item, link, self, height); + + // link margin + @include kt-attr(margin, kt-get($item, link, self, margin)); + + // menu item link's text part + .kt-menu__link-text { + font-weight: kt-get($item, link, text, font-weight); + font-size: kt-get($item, link, text, font-size); + text-transform: kt-get($item, link, text, font-transform); + } + + // menu item link's icon + .kt-menu__link-icon { + text-align: kt-get($item, link, icon, align); + flex: 0 0 kt-get($item, link, icon, width); + font-size: kt-get($item, link, icon, font-size); + + // duo-tone svg icon + svg { + @include kt-attr(height, kt-get($item, link, icon, svg-width)); + @include kt-attr(width, kt-get($item, link, icon, svg-width)); + margin-left: -2px; + } + } + + // menu item link's bullet + .kt-menu__link-bullet { + vertical-align: middle; + text-align: left; + flex: 0 0 kt-get($item, link, bullet, self, width); + + > span { + vertical-align: middle; + display: inline-block; + } + + &.kt-menu__link-bullet--dot { + > span { + width: kt-get($item, link, bullet, dot, size); + height: kt-get($item, link, bullet, dot, size); + border-radius: 100%; + } + } + + &.kt-menu__link-bullet--line { + > span { + width: kt-get($item, link, bullet, line, width); + height: kt-get($item, link, bullet, line, height); + } + } + } + + // menu item link's icon part + .kt-menu__link-badge { + padding: kt-get($item, link, badge, padding); + text-align: kt-get($item, link, badge, align); + } + + // menu item link's arrow part + .kt-menu__ver-arrow { + text-align: kt-get($item, link, arrow, align); + flex: 0 0 kt-get($item, link, arrow, width); + font-size: kt-get($item, link, arrow, font-size); + + &:before { + display: inline-block; + transition: kt-get($item, link, arrow, transition); + + [direction="rtl"] & { + content: "#{kt-get($kt-action-icons, left)}" !important; + } + } + } + + // menu root level "here" arrow + .kt-menu__item-here { + display: none; + } + + // link border radius + @include kt-rounded { + @include kt-attr(border-radius, kt-get($item, link, self, border-radius)); + } + } + + // item link open state + &.kt-menu__item--open { + > .kt-menu__heading, + > .kt-menu__link { + // menu item link's arrow part + .kt-menu__ver-arrow { + &:before { + transition: kt-get($item, link, arrow, transition); + } + } + } + } +} + +@mixin kt-menu-ver-item-skin($item) { + // item + @include kt-attr(background-color, kt-get($item, self, bg-color, default)); + + // item link and heading + > .kt-menu__heading, + > .kt-menu__link { + // menu item link's text part + .kt-menu__link-text { + @include kt-attr(color, kt-get($item, link, text, font-color, default)); + @if kt-has($item, link, text, font-weight) { + font-weight: kt-get($item, link, text, font-weight); + } + } + + // menu item link's icon + .kt-menu__link-icon { + @include kt-attr(color, kt-get($item, link, icon, font-color, default)); + + // Due-tone icon + svg { + @include kt-svg-icon-color(kt-get($item, link, icon, font-color, default)); + } + } + + // menu item link's bullet + .kt-menu__link-bullet { + + &.kt-menu__link-bullet--dot { + > span { + @include kt-attr(background-color, kt-get($item, link, bullet, dot, bg-color, default)); + } + } + + &.kt-menu__link-bullet--line { + > span { + @include kt-attr(background-color, kt-get($item, link, bullet, line, bg-color, default)); + } + } + } + + // menu item link's arrow part + .kt-menu__ver-arrow { + @include kt-attr(color, kt-get($item, link, arrow, font-color, default)); + } + } + + // item link open state + &.kt-menu__item--open { + transition: background-color 0.3s; + @include kt-attr(background-color, kt-get($item, self, bg-color, open)); + + > .kt-menu__heading, + > .kt-menu__link { + @include kt-attr(background-color, kt-get($item, link, self, bg-color, open)); + + // menu item link's text part + .kt-menu__link-text { + @include kt-attr(color, kt-get($item, link, text, font-color, open)); + } + + // menu item link's icon part + .kt-menu__link-icon { + @include kt-attr(color, kt-get($item, link, icon, font-color, open)); + + // Due-tone icon + svg { + @include kt-svg-icon-color(kt-get($item, link, icon, font-color, open)); + } + } + + // menu item link's bullet + .kt-menu__link-bullet { + &.kt-menu__link-bullet--dot { + > span { + @include kt-attr(background-color, kt-get($item, link, bullet, dot, bg-color, open)); + } + } + + &.kt-menu__link-bullet--line { + > span { + @include kt-attr(background-color, kt-get($item, link, bullet, line, bg-color, open)); + } + } + } + + // menu item link's arrow part + .kt-menu__ver-arrow { + @include kt-attr(color, kt-get($item, link, arrow, font-color, open)); + } + } + } + + // item link open state + &.kt-menu__item--here { + transition: background-color 0.3s; + @include kt-attr(background-color, kt-get($item, self, bg-color, here)); + + > .kt-menu__heading, + > .kt-menu__link { + @include kt-attr(background-color, kt-get($item, link, self, bg-color, here)); + + // menu item link's text part + .kt-menu__link-text { + @include kt-attr(color, kt-get($item, link, text, font-color, here)); + } + + // menu item link's icon part + .kt-menu__link-icon { + @include kt-attr(color, kt-get($item, link, icon, font-color, here)); + + // Due-tone icon + svg { + @include kt-svg-icon-color(kt-get($item, link, icon, font-color, here)); + } + } + + // menu item link's bullet + .kt-menu__link-bullet { + &.kt-menu__link-bullet--dot { + > span { + @include kt-attr(background-color, kt-get($item, link, bullet, dot, bg-color, here)); + } + } + + &.kt-menu__link-bullet--line { + > span { + @include kt-attr(background-color, kt-get($item, link, bullet, line, bg-color, here)); + } + } + } + + // menu item link's arrow part + .kt-menu__ver-arrow { + @include kt-attr(color, kt-get($item, link, arrow, font-color, here)); + } + } + } + + // item link active state + &.kt-menu__item--active { + transition: background-color 0.3s; + @include kt-attr(background-color, kt-get($item, self, bg-color, active)); + + > .kt-menu__heading, + > .kt-menu__link { + @include kt-attr(background-color, kt-get($item, link, self, bg-color, active)); + + // menu item link's text part + .kt-menu__link-text { + @include kt-attr(color, kt-get($item, link, text, font-color, active)); + } + + // menu item link's icon part + .kt-menu__link-icon { + @include kt-attr(color, kt-get($item, link, icon, font-color, active)); + + // Due-tone icon + svg { + @include kt-svg-icon-color(kt-get($item, link, icon, font-color, active)); + } + } + + // menu item link's bullet + .kt-menu__link-bullet { + &.kt-menu__link-bullet--dot { + > span { + @include kt-attr(background-color, kt-get($item, link, bullet, dot, bg-color, active)); + } + } + + &.kt-menu__link-bullet--line { + > span { + @include kt-attr(background-color, kt-get($item, link, bullet, line, bg-color, active)); + } + } + } + + // menu item link's arrow part + .kt-menu__ver-arrow { + @include kt-attr(color, kt-get($item, link, arrow, font-color, active)); + } + } + } + + // item link hover state + &:not(.kt-menu__item--parent):not(.kt-menu__item--open):not(.kt-menu__item--here):not(.kt-menu__item--active):hover { + transition: background-color 0.3s; + @include kt-attr(background-color, kt-get($item, self, bg-color, hover)); + + > .kt-menu__heading, + > .kt-menu__link { + @include kt-attr(background-color, kt-get($item, link, self, bg-color, hover)); + + // menu item link's text part + .kt-menu__link-text { + @include kt-attr(color, kt-get($item, link, text, font-color, hover)); + } + + // menu item link's icon part + .kt-menu__link-icon { + @include kt-attr(color, kt-get($item, link, icon, font-color, hover)); + + // Due-tone icon + svg { + @include kt-svg-icon-color(kt-get($item, link, icon, font-color, hover)); + } + } + + // menu item link's bullet + .kt-menu__link-bullet { + &.kt-menu__link-bullet--dot { + > span { + @include kt-attr(background-color, kt-get($item, link, bullet, dot, bg-color, hover)); + } + } + + &.kt-menu__link-bullet--line { + > span { + @include kt-attr(background-color, kt-get($item, link, bullet, line, bg-color, hover)); + } + } + } + + // menu item link's arrow part + .kt-menu__ver-arrow { + @include kt-attr(color, kt-get($item, link, arrow, font-color, hover)); + } + } + } +} + +// Section +@mixin kt-menu-ver-section-base($section) { + margin: kt-get($section, self, margin); + height: kt-get($section, self, height); + + .kt-menu__section-text { + font-size: kt-get($section, text, font-size); + font-weight: kt-get($section, text, font-weight); + text-transform: kt-get($section, text, font-transform); + letter-spacing: kt-get($section, text, letter-spacing); + } + + @if kt-has($section, icon) { + .kt-menu__section-icon { + padding: kt-get($section, icon, padding); + } + } +} + +@mixin kt-menu-ver-section-skin($section) { + .kt-menu__section-text { + @include kt-attr(color, kt-get($section, text, font-color)); + } + + @if kt-has($section, icon) { + .kt-menu__section-icon { + @include kt-attr(color, kt-get($section, icon, font-color)); + } + } +} + +// Separator +@mixin kt-menu-ver-separator-base($separator) { + margin: kt-get($separator, margin); + + .kt-menu__separator--marginles { + margin: 0; + } +} + +@mixin kt-menu-ver-separator-skin($separator) { + @include kt-attr(border-bottom, kt-get($separator, border)); +} + +// Minimize Parent Item +@mixin kt-menu-ver-minimize-parent-item-base($item) { + // item + margin: kt-get($item, self, margin); + + // item link and heading + > .kt-menu__link { + height: kt-get($item, link, self, height); + padding: kt-get($item, link, self, padding); + + // menu item link's text part + .kt-menu__link-text { + font-weight: kt-get($item, link, text, font-weight); + font-size: kt-get($item, link, text, font-size); + text-transform: kt-get($item, link, text, font-transform); + cursor: text !important; + } + + // menu item link's icon part + .kt-menu__link-badge { + padding: kt-get($item, link, badge, padding); + text-align: kt-get($item, link, badge, align); + } + } +} + +@mixin kt-menu-ver-minimize-parent-item-skin($item) { + // item + @include kt-attr(background-color, kt-get($item, self, bg-color, default)); + + // item link and heading + > .kt-menu__link { + // menu item link's text part + > .kt-menu__link-text { + @include kt-attr(color, kt-get($item, link, text, font-color, default)); + } + } +} + +// Base +@mixin kt-menu-ver-base($base-config, $layout) { + .#{kt-get($base-config, class)} { + // menu nav + .kt-menu__nav { + margin: 0; + list-style: none; + padding: kt-get($layout, default, self, padding); + + // Base markup + .kt-menu__scroll { + position: relative; + overflow: hidden; + display: flex; + flex-direction: column; + flex-grow: 1; + } + + .kt-menu__subnav { + display: flex; + flex-direction: column; + flex-grow: 1; + padding: 0; + margin: 0; + list-style: none !important; + } + + // general submenu + .kt-menu__inner, + .kt-menu__submenu { + display: none; + float: none; + margin: 0; + padding: 0; + + @if kt-get($base-config, mode) == "tablet-and-mobile" or kt-get($base-config, mode) == "mobile" { + width: auto !important; + } + + // Content + .kt-menu__content { + padding: 0; + margin: 0; + + > .kt-menu__item { + padding: 0; + margin: 0; + list-style: none; + + &.kt-menu--no-heading { + > .kt-menu__inner { + display: flex; + + > li > .kt-menu__link { + margin: 0; + } + } + } + } + } + } + + // general item + .kt-menu__item { + display: flex; + flex-direction: column; + flex-grow: 1; + float: none; + padding: 0; + + // item link and heading + > .kt-menu__heading, + > .kt-menu__link { + display: flex; + flex-grow: 1; + align-items: stretch; + margin: 0; + padding: 0; + text-decoration: none; + position: relative; + outline: none; + + &:hover { + text-decoration: none; + cursor: pointer; + } + + .kt-menu__link-text { + display: flex; + align-items: center; + flex-grow: 1; + padding: 0; + } + + .kt-menu__link-badge { + display: flex; + align-items: center; + white-space: nowrap; + } + + // menu item link's icon part + .kt-menu__link-icon { + display: flex; + align-items: center; + line-height: 0; + } + + // menu item link's icon part + .kt-menu__link-bullet { + display: flex; + align-items: center; + line-height: 0; + } + + // menu item link's arrow part + .kt-menu__ver-arrow { + display: flex; + align-items: center; + justify-content: flex-end; + line-height: 0; + + &:before { + -webkit-transform: translate3d(0,0,0); + } + } + + .kt-menu__hor-arrow { + display: none; + } + } + + // item link open state + &.kt-menu__item--open { + > .kt-menu__heading, + > .kt-menu__link { + // menu item link's arrow part + > .kt-menu__ver-arrow { + &:before { + transform: rotateZ(90deg)#{'/*rtl:ignore*/'}; + + [direction="rtl"] & { + transform: rotateZ(-90deg)#{'/*rtl:ignore*/'}; + } + } + } + } + + > .kt-menu__submenu, + > .kt-menu__inner { + display: flex; + flex-grow: 1; + flex-direction: column; + } + } + + // submenu items + .kt-menu__submenu { + // submenu item + .kt-menu__item { + // item link and heading + > .kt-menu__heading, + > .kt-menu__link { + padding: kt-get($layout, default, item, submenu, item, link, padding); + } + } + + // parent item used for minimized menu's dropdown submenus + .kt-menu__item--parent { + display: none; + } + } + } + + // general section + .kt-menu__section { + display: flex; + padding: kt-get($layout, default, section, self, padding); + + &.kt-menu__section--first { + margin-top: 0 !important; + } + + .kt-menu__section-text { + display:flex; + margin: 0; + padding: 0; + align-items: center; + } + + .kt-menu__section-icon { + display: none; + align-items: center; + justify-content: center; + } + } + + // general separator + .kt-menu__separator { + height: 0; + overflow: hidden; + + &.kt-menu__separator--marginles { + margin: 0; + } + } + + // Custom markup + // menu item + > .kt-menu__item { + position: relative; + @include kt-menu-ver-item-base(kt-get($layout, default, item)); + + .kt-menu__submenu { + .kt-menu__subnav { + @include kt-attr(margin, kt-get($layout, default, item, submenu, self, margin)); + @include kt-attr(padding, kt-get($layout, default, item, submenu, self, padding)); + } + + // menu item + .kt-menu__item { + @include kt-menu-ver-item-base(kt-get($layout, default, item, submenu, item)); + } + + // menu section + .kt-menu__section { + @include kt-menu-ver-section-base(kt-get($layout, default, item, submenu, section)); + } + + // menu item separator + .kt-menu__separator { + @include kt-menu-ver-separator-base(kt-get($layout, default, item, submenu, separator)); + } + } + } + + // menu section + > .kt-menu__section { + @include kt-menu-ver-section-base(kt-get($layout, default, section)); + } + + // menu item separator + > .kt-menu__separator { + @include kt-menu-ver-separator-base(kt-get($layout, default, separator)); + } + + // submenu link paddings and indentions + // item + $item-link-padding: kt-get($layout, default, item, link, self, padding); + $item-section-padding: kt-get($layout, default, section, self, padding); + + // item submenu + $item-submenu-padding-left: kt-get($layout, default, item, submenu, item, link, self, padding-x); + + $item-submenu-indent: kt-get($layout, default, item, submenu, self, indent); + $item-submenu-link-padding: kt-get($layout, default, item, submenu, item, link, self, padding); + + $item-submenu-section-indent: kt-get($layout, default, item, submenu, section, self, indent); + $item-submenu-section-padding: kt-get($layout, default, item, submenu, section, padding); + + > .kt-menu__item { + > .kt-menu__link { + padding: $item-link-padding; + } + + > .kt-menu__submenu { + .kt-menu__subnav { + // item link paddings + .kt-menu__content { + .kt-menu__heading { + padding: $item-submenu-link-padding; + padding-left: $item-submenu-padding-left + (1 * $item-submenu-section-indent); + } + + .kt-menu__inner { + padding: 0; + margin: 0; + + .kt-menu__link { + padding: $item-submenu-link-padding; + padding-left: $item-submenu-padding-left + (2 * $item-submenu-section-indent); + } + } + } + + > .kt-menu__item { + > .kt-menu__link { + padding: $item-submenu-link-padding; + padding-left: $item-submenu-padding-left + (1 * $item-submenu-indent); + } + + > .kt-menu__submenu { + padding: 0; + + .kt-menu__subnav { + padding: 0; + + > .kt-menu__item { + > .kt-menu__link { + padding: $item-submenu-link-padding; + padding-left: $item-submenu-padding-left + (2 * $item-submenu-indent); + } + + > .kt-menu__submenu { + padding: 0; + + .kt-menu__subnav { + > .kt-menu__item { + > .kt-menu__link { + padding: $item-submenu-link-padding; + padding-left: $item-submenu-padding-left + (3 * $item-submenu-indent); + } + } + } + } + } + } + } + } + + // section paddings + > .kt-menu__section { + padding: $item-submenu-section-padding; + padding-left:$item-submenu-padding-left + (1 * $item-submenu-section-indent); + } + + > .kt-menu__item { + > .kt-menu__submenu { + padding: 0; + .kt-menu__subnav { + > .kt-menu__section { + padding: $item-submenu-section-padding; + padding-left: $item-submenu-padding-left + (2 * $item-submenu-section-indent); + } + + > .kt-menu__item { + > .kt-menu__submenu { + padding: 0; + .kt-menu__subnav { + > .kt-menu__section { + padding: $item-submenu-section-padding; + padding-left:$item-submenu-padding-left + (3 * $item-submenu-section-indent); + } + } + } + } + } + } + } + } + } + } + } + } +} + +@mixin kt-menu-ver-skin($base-config, $layout) { + .#{kt-get($base-config, class)} { + @include kt-attr(background-color, kt-get($layout, default, self, bg-color)); + + .kt-menu__nav { + // menu item + > .kt-menu__item { + @include kt-menu-ver-item-skin(kt-get($layout, default, item)); + + > .kt-menu__arrow { + color: kt-get($layout, default, self, bg-color); + } + } + + // menu section + > .kt-menu__section { + @include kt-menu-ver-section-skin(kt-get($layout, default, section)); + } + + // menu item separator + > .kt-menu__separator { + @include kt-menu-ver-separator-skin(kt-get($layout, default, separator)); + } + + // menu item + > .kt-menu__item { + .kt-menu__submenu { + .kt-menu__subnav { + @include kt-attr(background-color, kt-get($layout, default, item, submenu, self, bg-color, default)); + } + // menu item + .kt-menu__item { + @include kt-menu-ver-item-skin(kt-get($layout, default, item, submenu, item)); + } + + // menu section + .kt-menu__section { + @include kt-menu-ver-section-skin(kt-get($layout, default, item, submenu, section)); + } + + // menu item separator + .kt-menu__separator { + @include kt-menu-ver-separator-skin(kt-get($layout, default, item, submenu, separator)); + } + } + } + } + } +} + +// Dropdown +@mixin kt-menu-ver-dropdown-base($base-config, $layout) { + // base dropdown submenu + .#{kt-get($base-config, parent-class)}--minimize .#{kt-get($base-config, class)}, + .#{kt-get($base-config, class)}.#{kt-get($base-config, class)}--dropdown { + .kt-menu__nav { + .kt-menu__item:not([data-ktmenu-submenu-mode=accordion]) { + > .kt-menu__link { + > .kt-menu__ver-arrow { + &:before { + @include kt-fix-animation-lags(); + } + } + } + + > .kt-menu__submenu { + display: none !important; + @include kt-fix-animation-lags(); + } + + &.kt-menu__item--hover { + position: relative; + + > .kt-menu__submenu { + top: kt-get($layout, dropdown, item, submenu, self, offset, inner, default); + position: absolute; + z-index: kt-get($layout, dropdown, item, self, zindex); + display: flex !important; + width: kt-get($layout, dropdown, item, submenu, self, width); + margin-left: kt-get($layout, dropdown, item, submenu, self, width); + + @include kt-rounded { + border-radius: kt-get($layout, dropdown, item, submenu, self, border-radius); + } + + &.kt-menu__submenu--up { + bottom: 0; + top: auto; + } + + animation:#{kt-get($base-config, class)}-submenu-fade-in .3s ease 1, #{kt-get($base-config, class)}-submenu-move-up .3s ease-out 1; + + &.kt-menu__submenu--up { + top: auto; + bottom: kt-get($layout, dropdown, item, submenu, self, offset, inner, up); + animation: #{kt-get($base-config, class)}-submenu-fade-in .3s ease 1, #{kt-get($base-config, class)}-submenu-move-down .3s ease-out 1; + + @include kt-hack-ie { + animation: none; + } + } + + .kt-menu__subnav { + padding: kt-get($layout, dropdown, item, submenu, self, padding); + + > .kt-menu__item { + .kt-menu__link { + justify-content: flex-start; + padding: kt-get($layout, dropdown, item, submenu, item, link, self, padding); + + .kt-menu__link-title { + display: flex; + } + + .kt-menu_link-text { + @include kt-fix-animation-lags(); + } + + .kt-menu__link-icon { + display: flex; + } + + .kt-menu__link-bullet { + display: flex; + } + + .kt-menu__link-badge { + display: flex; + } + + .kt-menu__ver-arrow { + display: flex; + } + } + + .kt-menu__submenu { + .kt-menu__subnav { + padding: kt-get($layout, dropdown, item, submenu, self, padding); + + > .kt-menu__item { + > .kt-menu__link { + padding: kt-get($layout, dropdown, item, submenu, item, link, self, padding); + } + + .kt-menu__submenu { + .kt-menu__subnav { + padding: kt-get($layout, dropdown, item, submenu, self, padding); + + > .kt-menu__item { + > .kt-menu__link { + padding: kt-get($layout, dropdown, item, submenu, item, link, self, padding); + } + } + } + } + } + + > .kt-menu__section { + padding: kt-get($layout, dropdown, item, submenu, section, self, padding); + } + } + } + + @include kt-menu-ver-item-base(kt-get($layout, dropdown, item, submenu, item)); + } + + > .kt-menu__section { + @include kt-menu-ver-section-base( kt-get($layout, dropdown, item, submenu, section) ); + } + + > .kt-menu__separator { + @include kt-menu-ver-separator-base( kt-get($layout, dropdown, item, submenu, separator) ); + } + } + } + } + } + + > .kt-menu__item:not([data-ktmenu-submenu-mode=accordion]) { + &.kt-menu__item--hover { + > .kt-menu__submenu { + margin-left: kt-get($layout, dropdown, item, submenu, self, parent-width); + top: kt-get($layout, dropdown, item, submenu, self, offset, root, default); + + &.kt-menu__submenu--up { + bottom: kt-get($layout, dropdown, item, submenu, self, offset, root, up); + } + } + } + } + } + } +} + +@mixin kt-menu-ver-dropdown-skin($base-config, $layout) { + .#{kt-get($base-config, parent-class)}--minimize .#{kt-get($base-config, class)}, + .#{kt-get($base-config, class)}.#{kt-get($base-config, class)}--dropdown { + .kt-menu__nav { + .kt-menu__item:not([data-ktmenu-submenu-mode=accordion]) { + &.kt-menu__item--hover { + > .kt-menu__submenu { + background-color: kt-get($layout, dropdown, item, submenu, self, bg-color); + box-shadow: kt-get($layout, dropdown, item, submenu, self, box-shadow); + + .kt-menu__subnav { + .kt-menu__item { + @include kt-menu-ver-item-skin( kt-get($layout, dropdown, item, submenu, item) ); + } + + .kt-menu__section { + @include kt-menu-ver-section-skin( kt-get($layout, dropdown, item, submenu, section) ); + } + + .kt-menu__separator { + @include kt-menu-ver-separator-skin( kt-get($layout, dropdown, item, submenu, separator) ); + } + } + } + } + } + } + } +} + +// Minimize +@mixin kt-menu-ver-minimize-base($base-config, $layout) { + .#{kt-get($base-config, class)} { + .kt-menu__nav { + padding: kt-get($layout, minimize, self, padding); + + > .kt-menu__item { + > .kt-menu__link { + .kt-menu__link-icon { + width: 100%; + } + + .kt-menu__link-bullet { + display: none; + } + + .kt-menu__link-text { + display: none; + } + + .kt-menu__link-badge { + padding: 0; + position: relative; + right: kt-get($layout, minimize, item, link, badge, right); + + .kt-badge { + text-indent: -9999px; + position: relative; + padding: 0; + min-width: kt-get($layout, minimize, item, link, badge, size); + width: kt-get($layout, minimize, item, link, badge, size); + min-height: kt-get($layout, minimize, item, link, badge, size); + height: kt-get($layout, minimize, item, link, badge, size); + } + } + + .kt-menu__ver-arrow { + display: none; + } + } + + > .kt-menu__submenu { + display: none !important; + } + + &.kt-menu__item--here { + > .kt-menu__arrow { + display: inline-block; + } + } + + &.kt-menu__item--hover { + position: relative; + z-index: kt-get($layout, minimize, item, self, zindex); + width: kt-get($layout, minimize, item, self, width); + + &.kt-menu__item--open { + background: transparent; + } + + > .kt-menu__link { + width: kt-get($layout, minimize, self, width); + + .kt-menu__link-title { + display: none; + } + } + + > .kt-menu__submenu { + top: 0; + bottom: auto; + display: flex !important; + margin-left: kt-get($layout, minimize, item, submenu, self, margin-left) !important; + + @if kt-has($layout, minimize, item, submenu) { + .kt-menu__subnav { + > .kt-menu__item.kt-menu__item--parent { + display: flex; + @include kt-menu-ver-minimize-parent-item-base( kt-get($layout, minimize, item, submenu, parent-item) ); + + & + .kt-menu__item { + margin-top: kt-get($layout, minimize, item, submenu, parent-item, link, self, margin-bottom); + } + } + } + } + } + + > .kt-menu__arrow { + display: none; + } + } + } + + > .kt-menu__section { + justify-content: center; + + .kt-menu__section-text { + display: none; + } + + .kt-menu__section-icon { + display: flex; + justify-content: center; + align-items: center; + padding: kt-get($layout, minimize, section, icon, padding); + animation: kt-animate-fade-in .7s; + } + } + } + } +} + +@mixin kt-menu-ver-minimize-skin($base-config, $layout) { + .#{kt-get($base-config, class)} { + // base vertical menu + .kt-menu__nav { + > .kt-menu__item { + background: transparent; + + > .kt-menu__link { + background-color: kt-get($layout, minimize, item, link, self, bg-color, default); + + > .kt-menu__link-icon { + color: kt-get($layout, minimize, item, link, icon, font-color, default); + } + } + + &.kt-menu__item--hover, + &.kt-menu__item--open { + background: transparent !important; + + > .kt-menu__link { + background-color: kt-get($layout, minimize, item, link, self, bg-color, open); + + > .kt-menu__link-icon { + @include kt-attr(color, kt-get($layout, minimize, item, link, icon, font-color, open)); + } + } + } + + &.kt-menu__item--here, + &.kt-menu__item--active { + background: transparent !important; + + > .kt-menu__link { + background-color: kt-get($layout, minimize, item, link, self, bg-color, active); + + > .kt-menu__link-icon { + @include kt-attr(color, kt-get($layout, minimize, item, link, icon, font-color, active)); + } + } + } + + &:hover { + background: transparent; + + > .kt-menu__link { + background-color: kt-get($layout, minimize, item, link, self, bg-color, hover); + + > .kt-menu__link-icon { + @include kt-attr(color, kt-get($layout, minimize, item, link, icon, font-color, hover), !important); + } + } + } + + @if kt-has($layout, minimize, item, submenu) { + &.kt-menu__item--hover > .kt-menu__submenu { + .kt-menu__subnav > .kt-menu__item.kt-menu__item--parent { + display: flex; + @include kt-menu-ver-minimize-parent-item-skin( kt-get($layout, minimize, item, submenu, parent-item) ); + } + } + } + } + + > .kt-menu__section { + .kt-menu__section-icon { + color: kt-get($layout, minimize, section, icon, font-color); + } + } + } + } +} + +// Build +// Custom Skin +@mixin kt-menu-ver-build-skin($config, $skin) { + $skin-config: (); + + @if ($skin == default) { + $skin-config: kt-get($config, build, skin); + } @else { + $skin-config: kt-get($config, build, skins, $skin); + } + + @if (kt-get($config, base, mode) == general) { + @include kt-menu-ver-skin((class: kt-get($config, base, class)), $skin-config); + } @else if (kt-get($config, base, mode) == tablet-and-mobile) { + @include kt-tablet-and-mobile { + @include kt-menu-ver-skin((class: kt-get($config, base, class)), $skin-config); + } + } @else if (kt-get($config, base, mode) == mobile) { + @include kt-mobile { + @include kt-menu-ver-skin((class: kt-get($config, base, class)), $skin-config); + } + } + + @if (kt-has($skin-config, minimize)) { + @include kt-desktop { + .#{kt-get($config, base, parent-class)}--minimize { + @include kt-menu-ver-minimize-skin((class: kt-get($config, base, class), parent-class: kt-get($config, base, parent-class)), $skin-config); + } + } + } + + @if (kt-has($skin-config, dropdown)) { + @include kt-desktop { + @include kt-menu-ver-dropdown-skin((class: kt-get($config, base, class), parent-class: kt-get($config, base, parent-class)), $skin-config); + } + } +} + +// Build Layout +@mixin kt-menu-ver-build-layout( $config ) { + // Base menu + @if (kt-get($config, base, mode) == general) { + @include kt-menu-ver-base( kt-get($config, base), kt-get($config, build, layout) ); + } @else if (kt-get($config, base, mode) == tablet-and-mobile) { + @include kt-tablet-and-mobile { + @include kt-menu-ver-base( kt-get($config, base), kt-get($config, build, layout) ); + } + } @else if (kt-get($config, base, mode) == mobile) { + @include kt-mobile { + @include kt-menu-ver-base( kt-get($config, base), kt-get($config, build, layout) ); + } + } + + // Base dropdown menu submenu mode + @if (kt-has($config, build, layout, dropdown)) { + // Desktop only dropdown vertical menu + @include kt-desktop { + @include kt-menu-ver-dropdown-base( kt-get($config, base), kt-get($config, build, layout) ); + } + + // Dropdown Submenu Animations + @keyframes #{kt-get($config, base, class)}-submenu-fade-out { + from { opacity: 1; } + to { opacity: 0; } + } + + @keyframes #{kt-get($config, base, class)}-submenu-fade-in { + from { opacity: 0; } + to { opacity: 1; } + } + + @keyframes #{kt-get($config, base, class)}-submenu-move-up { + from { margin-top: kt-get($config, build, layout, dropdown, item, submenu, self, animation, offset); } + to { margin-top: 0; } + } + + @keyframes #{kt-get($config, base, class)}-submenu-move-down { + from { margin-bottom: kt-get($config, build, layout, dropdown, item, submenu, self, animation, offset); } + to { margin-bottom: 0; } + } + } + + // Base minimize menu mode + @if (kt-has($config, build, layout, minimize)) { + @include kt-desktop { + .#{kt-get($config, base, parent-class)}--minimize { + @include kt-menu-ver-minimize-base( kt-get($config, base), kt-get($config, build, layout) ); + } + } + } +} diff --git a/src/assets/sass/global/components/base/mixins/_offcanvas.scss b/src/assets/sass/global/components/base/mixins/_offcanvas.scss new file mode 100644 index 0000000..19e94f4 --- /dev/null +++ b/src/assets/sass/global/components/base/mixins/_offcanvas.scss @@ -0,0 +1,206 @@ +// +// Offcanvas Mixins +// + + + + +@mixin kt-offcanvas-base($class, $layout) { + $width: kt-get($layout, self, width); + $transition: left 0.3s ease, right 0.3s ease; + + // Base + .#{$class} { + //display: block !important; + z-index: kt-get($layout, self, zindex); + position: fixed; + -webkit-overflow-scrolling: touch; + top: 0; + bottom: 0; + overflow-y: auto; + -webkit-transform: translate3d(0, 0, 0); + backface-visibility: hidden; + -webkit-backface-visibility: hidden; + width: $width !important; + transition: $transition; + left: -($width + 20px); + + &.#{$class}--on { + transition: $transition; + left: 0; + } + + @include kt-hack-ie { + transition: none !important; + } + } + + // Pull from right + .#{$class}--right { + .#{$class} { + right: -($width + 20px); + left: auto; + + &.#{$class}--on { + transition: $transition; + right: 0; + left: auto; + } + } + } + + // Close icon + @if kt-get($layout, close) != null { + // Mobile close button + .#{$class}-close { + width: kt-get($layout, close, size); + height: kt-get($layout, close, size); + top: 1px; + z-index: kt-get($layout, self, zindex) + 1; + transition: $transition; + position: fixed; + border: 0; + box-shadow: none; + @include kt-rounded { + border-radius: 3px; + } + cursor: pointer; + outline: none !important; + display: flex; + justify-content: center; + align-items: center; + + @include kt-hack-ie { + transition: none !important; + } + + > i { + line-height: 0; + font-size: kt-get($layout, close, font-size); + } + + &:hover { + text-decoration: none; + } + + left: - (kt-get($layout, close, size)); + + // Pull from right + .#{$class}--right & { + left: auto; + right: - (kt-get($layout, close, size)); + } + + .#{$class}--on & { + transition: $transition; + left: $width - kt-get($layout, close, size) - 1px; + } + + // Pull from right + .#{$class}--on.#{$class}--right & { + left: auto; + right: $width - kt-get($layout, close, size) - 1px; + } + } + } + + // Overlay + .#{$class}-overlay { + position: fixed; + top: 0; + left: 0; + bottom: 0; + right: 0; + overflow: hidden; + z-index: kt-get($layout, self, zindex) - 1; + background: rgba(#000000, 0.1); + animation: kt-animate-fade-in .3s linear 1; + } +} + +@mixin kt-offcanvas-skin($class, $skin) { + .#{$class} { + @if (kt-has($skin, self, bg-color)) { + background: kt-get($skin, self, bg-color); + } + + @if (kt-has($skin, self, shadow)) { + box-shadow: kt-get($skin, self, shadow); + } + } + + .#{$class}-overlay { + background: kt-get($skin, overlay, bg-color); + } + + @if (kt-has($skin, close)) { + .#{$class}-close { + background-color: kt-get($skin, close, bg-color, default); + + > i { + color: kt-get($skin, close, icon-color, default); + } + + &:hover { + background-color: kt-get($skin, close, bg-color, hover); + + > i { + color: kt-get($skin, close, icon-color, hover); + } + } + } + } +} + +@mixin kt-offcanvas-build($class, $mode, $config) { + // close icon + .#{$class}-close { + display: none; + } + + @if $mode == default { + @include kt-offcanvas-base($class, kt-get($config, layout)); + @include kt-offcanvas-skin($class, kt-get($config, skin)); + } + + @if $mode == desktop { + @include kt-desktop { + @include kt-offcanvas-base($class, kt-get($config, layout)); + @include kt-offcanvas-skin($class, kt-get($config, skin)); + } + } + + @if $mode == desktop-and-tablet { + @include kt-desktop-and-tablet { + @include kt-offcanvas-base($class, kt-get($config, layout)); + @include kt-offcanvas-skin($class, kt-get($config, skin)); + } + } + + @if $mode == tablet { + @include kt-tablet { + @include kt-offcanvas-base($class, kt-get($config, layout)); + @include kt-offcanvas-skin($class, kt-get($config, skin)); + } + } + + @if $mode == tablet-and-mobile { + @include kt-tablet-and-mobile { + @include kt-offcanvas-base($class, kt-get($config, layout)); + @include kt-offcanvas-skin($class, kt-get($config, skin)); + } + } + + @if $mode == mobile { + @include kt-mobile { + @include kt-offcanvas-base($class, kt-get($config, layout)); + @include kt-offcanvas-skin($class, kt-get($config, skin)); + } + } + + @include kt-responsive-below(kt-get($config, layout, self, width) + 50px) { + .#{$class} { + width: 90% !important; + } + } +} diff --git a/src/assets/sass/global/components/base/mixins/_spinner.scss b/src/assets/sass/global/components/base/mixins/_spinner.scss new file mode 100644 index 0000000..fed4549 --- /dev/null +++ b/src/assets/sass/global/components/base/mixins/_spinner.scss @@ -0,0 +1,41 @@ +// +// Mixins +// + + + +@mixin kt-spinner-size($size) { + &:before { + width: kt-get($kt-spinner-config, size, $size); + height: kt-get($kt-spinner-config, size, $size); + margin-top: -(kt-get($kt-spinner-config, size, $size)/2); + } + + &.kt-spinner--center { + &:before { + left: 50%; + margin-left: -(kt-get($kt-spinner-config, size, $size)/2); + } + } + + &.kt-spinner--left { + &:before { + left: 0; + right: auto; + } + } + + &.kt-spinner--right { + &:before { + left: auto; + right: 0; + } + } +} + +@mixin kt-spinner-skin($color) { + &:before { + border: 2px solid $color; + border-right: 2px solid transparent; + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/base/mixins/_wave.scss b/src/assets/sass/global/components/base/mixins/_wave.scss new file mode 100644 index 0000000..3c5755a --- /dev/null +++ b/src/assets/sass/global/components/base/mixins/_wave.scss @@ -0,0 +1,43 @@ +// +// Wave Babkground Mixins +// + + + +@mixin wave($important:""){ + @if $important != "" { + background-color: kt-base-color(grey, 1) !important; + } + @else { + background-color: kt-base-color(grey, 1); + } + overflow: hidden; + position: relative; + + > div{ + z-index: 1; + } + + &:before{ + content: ' '; + position: absolute; + top: 0; + left:0; + right: 0; + bottom: 0; + background-color: #fff; + z-index: -1; + } + + &:after{ + content: ' '; + width: 1000px; + height: 1025px; + position: absolute; + bottom: 65%; + left: -250px; + border-radius: 35%; + background: rgba(255, 255, 255, 1); + z-index: 0; + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/general/_callout.scss b/src/assets/sass/global/components/general/_callout.scss new file mode 100644 index 0000000..d6710f5 --- /dev/null +++ b/src/assets/sass/global/components/general/_callout.scss @@ -0,0 +1,100 @@ +// +// Callout +// + + +.kt-callout{ + padding: 1.5rem; + + .kt-callout__body{ + display: flex; + align-items: center; + + .kt-callout__content{ + flex: 2; + + .kt-callout__title{ + font-size: 1.85rem; + font-weight: 500; + color: kt-base-color(label, 4); + margin-bottom: 1rem; + } + + .kt-callout__desc{ + font-size: 1.15rem; + line-height: 2rem; + color: #9392a0; + padding-right: 2rem; + font-weight: 400; + + &:last-child{ + margin-bottom: 0; + } + } + } + + .kt-callout__action{ + flex: 1; + display: flex; + flex-direction: column; + align-items: flex-end; + justify-content: center; + + .btn.btn-custom { + padding: 1rem 1.3rem; + font-size: 0.9rem; + } + } + } + + &--diagonal-bg{ + overflow: hidden; + position: relative; + background-color: #fff; + + .kt-callout__body{ + position: relative; + z-index: 2; + } + + &:before{ + content: ' '; + position: absolute; + top: 0; + left:0; + right: 0; + bottom: 0; + background-color: kt-base-color(grey, 1); + z-index: 1; + } + + &:after{ + content: ' '; + width: 200%; + height: 1000px; + position: absolute; + z-index: 1; + top: 0; + left:45%; + transform: rotate(20deg); + background-color: #fff; + } + + } + + @each $name, $color in $kt-state-colors{ + + &--#{$name}{ + background-color: rgba(kt-state-color(#{$name}), 0.07); + + &.kt-callout--diagonal-bg{ + background-color: #fff; + + &:before{ + background-color: rgba(kt-state-color(#{$name}), 0.15); + } + } + } + } +} + diff --git a/src/assets/sass/global/components/general/_chat.scss b/src/assets/sass/global/components/general/_chat.scss new file mode 100644 index 0000000..12fe49c --- /dev/null +++ b/src/assets/sass/global/components/general/_chat.scss @@ -0,0 +1,223 @@ +// +// Chat +// + + + +.kt-chat { + .kt-portlet__head { + align-items: center; + flex-grow: 1; + } + + .kt-chat__head { + display: flex; + align-items: center; + flex-direction: row; + flex-grow: 1; + + .kt-chat__label { + .kt-chat__title { + font-size: 1.1rem; + color: kt-base-color(label, 4); + font-weight: 600; + margin: 0; + padding: 0; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + + .kt-chat__status { + color: kt-base-color(label, 2); + font-size: 0.9rem; + font-weight: 500; + display: block; + } + } + + .kt-chat__left { + flex-grow: 1; + text-align: left; + } + + .kt-chat__right { + flex-grow: 1; + text-align: right; + } + + .kt-chat__center { + flex-grow: 1; + text-align: center; + } + } + + .kt-chat__messages { + .kt-chat__message { + margin-bottom: 1rem; + + .kt-chat__user { + .kt-chat__username { + padding: 0 0.4rem; + font-size: 1.1rem; + color: kt-base-color(label, 4); + font-weight: 500; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + + .kt-chat__datetime { + color: kt-base-color(label, 2); + font-size: 0.9rem; + font-weight: 400; + } + } + + .kt-chat__text { + display: inline-block; + padding: 1.2rem 1.7rem; + padding: 1.1rem 3.5rem 1.1rem 1.6rem; + margin-top: 0.8rem; + color: #6c7293; + font-weight: 500; + font-size: 1.1rem; + + b { + color: kt-base-color(label, 3); + font-weight: 0; + } + + @include kt-rounded { + border-radius: $kt-border-radius; + } + } + + &.kt-chat__message--right { + text-align: right; + + .kt-chat__text { + text-align: right; + padding: 1.1rem 1.6rem 1.1rem 3.5rem; + } + } + } + + &.kt-chat__messages--solid { + width: 100%; + + .kt-chat__message { + padding: 1.3rem 1.7rem; + margin: 1.5rem 0; + display: inline-block; + + &:first-child { + margin-top: 0; + } + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + .kt-chat__text { + padding: 0; + margin-top: 0.5rem; + background: none !important; + } + + &.kt-chat__message--right { + float: right; + } + + @each $name, $color in $kt-state-colors { + &.kt-chat__message--#{$name} { + background: rgba(kt-get($color, base), 0.1); + } + } + } + } + } + + .kt-chat__input { + .kt-chat__editor { + textarea { + width: 100%; + border: 0 !important; + outline: none !important; + background-color: transparent !important; + + @include kt-input-placeholder(kt-base-color(label, 1)); + color: kt-base-color(label, 1); + } + } + + .kt-chat__toolbar { + margin-top: 1rem; + display: flex; + justify-content: space-between; + align-items: center; + + .kt_chat__tools { + a { + i { + margin-right: 1.1rem; + color: #cdd1e9; + font-size: 1.4rem; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + } + } + } + } +} + +@include kt-tablet-and-mobile { + .kt-chat { + .kt-chat__messages { + .kt-chat__message { + margin-bottom: 0.75rem; + + .kt-chat__user { + .kt-chat__username { + padding: 0 0.25rem; + font-size: 1rem; + } + } + + .kt-chat__text { + display: inline-block; + padding: 0.75rem 1rem; + margin-top: 0.5rem; + } + + &.kt-chat__message--right { + .kt-chat__text { + padding: 0.75rem 1rem; + } + } + } + } + + .kt-chat__input { + .kt-chat__toolbar { + margin-top: 0.75rem; + .kt_chat__tools { + a { + i { + margin-right: 0.75rem; + font-size: 1.3rem; + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/general/_grid-nav-v2.scss b/src/assets/sass/global/components/general/_grid-nav-v2.scss new file mode 100644 index 0000000..3ecef4b --- /dev/null +++ b/src/assets/sass/global/components/general/_grid-nav-v2.scss @@ -0,0 +1,77 @@ +// +// Grid Navigation +// + + + + +.kt-grid-nav-v2 { + display: flex; + align-items: flex-start; + flex-wrap: wrap; + + .kt-grid-nav-v2__item { + display: flex; + width: calc(50% - 3px); + min-height: 180px; + border-radius: 6px; + + // IE10, IE11 fix + @include kt-hack-ie() { + height: 180px; + } + + flex-direction: column; + justify-content: center; + align-items: center; + padding: 1rem; + background: kt-base-color(grey, 1); + + .kt-grid-nav-v2__item-icon { + display: inline-block; + text-align: center; + margin-bottom: 0.5rem; + + i { + font-size: 2.25rem; + color: kt-brand-color(); + } + } + + .kt-grid-nav-v2__item-title { + display: inline-block; + text-align: center; + font-size: 1.2rem; + font-weight: 500; + color: #5d5b6f; + } + + @include kt-transition(); + + &:hover { + @include kt-transition(); + text-transform: none; + background: kt-brand-color(); + + .kt-grid-nav-v2__item-icon { + i { + color: kt-brand-color(inverse); + } + } + + .kt-grid-nav-v2__item-title { + color: kt-brand-color(inverse); + } + } + + &:nth-of-type(odd) { + margin: 3px 3px 3px 0; + } + + &:nth-of-type(even) { + margin: 3px 0 3px 3px; + } + } +} + + \ No newline at end of file diff --git a/src/assets/sass/global/components/general/_grid-nav.scss b/src/assets/sass/global/components/general/_grid-nav.scss new file mode 100644 index 0000000..76b0f3b --- /dev/null +++ b/src/assets/sass/global/components/general/_grid-nav.scss @@ -0,0 +1,164 @@ +// +// Grid Nav +// + + + + +// Component Base +@mixin kt-grid-nav-base() { + .kt-grid-nav { + padding:0; + margin: 0; + display: table; + table-layout: fixed; + width: 100%; + background-size: cover; + background-repeat: no-repeat; + + // nav row + > .kt-grid-nav__row { + display: table-row; + + // nav item + > .kt-grid-nav__item { + display: table-cell; + vertical-align: middle; + text-align: center; + padding: 3.3rem 0.75rem; + @include kt-transition(); + + &:hover { + text-decoration: none; + @include kt-transition(); + } + + // nav icon + .kt-grid-nav__icon { + text-align: center; + font-size: 2.5rem; + } + + // nav text + .kt-grid-nav__title { + display: block; + line-height: 1; + text-align: center; + margin: 10px 0 0 0; + font-size: 1.2rem; + font-weight: 500; + } + + // nav text + .kt-grid-nav__desc { + display: block; + line-height: 1; + text-align: center; + margin: 10px 0 0 0; + font-size: 1rem; + font-weight:400; + } + } + } + + .dropdown-menu & { + @include kt-rounded { + border-bottom-left-radius: $kt-border-radius; + border-bottom-right-radius: $kt-border-radius; + } + } + } + + @include kt-tablet-and-mobile { + .kt-grid-nav { + // nav row + > .kt-grid-nav__row { + // nav item + > .kt-grid-nav__item { + padding: 1rem 0.5rem; + } + } + } + } +} + +// Component Skin +@mixin kt-grid-nav-skin() { + .kt-grid-nav { + .kt-grid-nav__row { + .kt-grid-nav__item { + border-right: 1px solid kt-base-color(grey, 2); + border-bottom: 1px solid kt-base-color(grey, 2); + + &:last-child { + border-right: 0; + } + + .kt-grid-nav__icon { + color: kt-state-color(brand); + } + + .kt-grid-nav__title { + color: kt-brand-color(); + } + + .kt-grid-nav__desc { + color: kt-base-color(label, 2); + } + + &:hover { + background: kt-base-color(grey, 1); + + .kt-grid-nav__icon { + color: kt-base-color(label, 3); + } + } + } + + &:last-child { + .kt-grid-nav__item { + border-bottom: 0 !important; + } + } + } + + // Dark skin + &.kt-grid-nav--skin-dark { + .kt-grid-nav__item { + border-right: 1px solid rgba(#fff, 0.1); + border-bottom: 1px solid rgba(#fff, 0.1); + + &:last-child { + border-right: 0; + } + + .kt-grid-nav__icon { + color: kt-brand-color(); + } + + .kt-grid-nav__title { + color: #fff; + } + + .kt-grid-nav__desc { + color: rgba(#fff, 0.5); + } + + &:hover { + background: transparent; + + .kt-grid-nav__icon { + color: kt-brand-color(); + } + } + } + } + } +} + +// Build +// Component Base +@include kt-grid-nav-base(); + +// Component Skin +@include kt-grid-nav-skin(); \ No newline at end of file diff --git a/src/assets/sass/global/components/general/_head.scss b/src/assets/sass/global/components/general/_head.scss new file mode 100644 index 0000000..1f07e63 --- /dev/null +++ b/src/assets/sass/global/components/general/_head.scss @@ -0,0 +1,120 @@ +// +// Head +// + + + +$kt-head-skin-light-bg-color: #f9fafe; + +.kt-head { + padding: 2.5rem 1rem; + margin: 0; + background-size: cover; + background-repeat: no-repeat; + + // Modifiers + &.kt-head--space-sm { + padding: 1.5rem 1rem; + } + + &.kt-head--space-lg { + padding: 3rem 1rem; + } + + &.kt-head--fit-x { + padding-left: 0; + padding-right: 0; + } + + &.kt-head--fit-b { + padding-bottom: 0 !important; + } + + &.kt-head--fit-t { + padding-top: 0 !important; + } + + &.kt-head--space-bottom-sm { + padding-bottom: 1rem; + } + + // Elements + .kt-head__title { + font-size: 1.3rem; + font-weight: 500; + text-align: center; + margin: 0; + } + + .kt-head__sub { + margin-top: 0.5rem; + font-size: 1rem; + font-weight: 400; + text-align: center; + } + + // Skins + &.kt-head--skin-dark { + .kt-head__title { + color: #fff; + } + + .kt-head__sub { + color: darken(#fff, 6%); + } + + .nav.nav-tabs-line { + border-bottom-color: rgba(#fff, 0.3) !important; + + .nav-item { + .nav-link { + color: rgba(#fff, 0.5); + + > i { + color: rgba(#fff, 0.4); + } + + &:hover, + &.active { + color: #fff; + + > i { + color: #fff; + } + } + } + } + } + } + + &.kt-head--skin-light { + background-color: $kt-head-skin-light-bg-color; + + .kt-head__title { + color: kt-base-color(label, 3); + } + + .kt-head__sub { + color: kt-base-color(label, 2); + } + } + + // Tabs + .nav { + margin: 1rem 0 0 0; + } +} + +.dropdown-menu:not(.dropdown-menu-top-unround) { + .kt-head { + @include kt-rounded { + border-top-left-radius: $kt-border-radius; + border-top-right-radius: $kt-border-radius; + } + } +} + +// Util classes +.kt-head-skin-light-bg-color { + background-color: $kt-head-skin-light-bg-color; +} \ No newline at end of file diff --git a/src/assets/sass/global/components/general/_iconbox.scss b/src/assets/sass/global/components/general/_iconbox.scss new file mode 100644 index 0000000..6922725 --- /dev/null +++ b/src/assets/sass/global/components/general/_iconbox.scss @@ -0,0 +1,129 @@ +// +// Iconbox +// + + +.kt-iconbox{ + padding: 1.5rem; + + .kt-iconbox__body{ + display: flex; + flex-wrap: nowrap; + + .kt-iconbox__icon{ + $svg-size: 50px; + flex: 0 0 $svg-size; + padding-right: 20px; + + svg{ + height: $svg-size; + width: $svg-size; + } + } + + .kt-iconbox__desc{ + display: flex; + flex-direction: column; + + .kt-iconbox__title{ + font-size: 1.55rem; + color: kt-base-color(label, 4); + + .kt-link{ + color: kt-base-color(label, 4); + } + } + + .kt-iconbox__content{ + font-size: 1.1rem; + font-weight: 400; + color: #9392a0; + } + } + } + + a.kt-iconbox__body { + cursor: pointer; + } + + &--wave{ + @include wave; + + &:after{ + transform: rotate(45deg); + } + } + + &--animate{ + @include wave; + + &:after{ + animation: wave 15s infinite linear; + } + + &-slower{ + @include wave; + + &:after{ + animation: wave 30s infinite linear; + } + } + + &-slow{ + @include wave; + + &:after{ + animation: wave 25s infinite linear; + } + } + + &-fast{ + @include wave; + + &:after{ + animation: wave 10s infinite linear; + } + } + + &-faster{ + @include wave; + + &:after{ + animation: wave 5s infinite linear; + } + } + } + + @each $name, $color in $kt-state-colors{ + + &--#{$name}{ + + .kt-iconbox__body{ + + .kt-iconbox__icon{ + + svg{ + g { + [fill] { + fill: kt-get($color, base) !important; + } + } + } + } + } + + &.kt-iconbox--animate, + &.kt-iconbox--animate-slow, + &.kt-iconbox--animate-slower, + &.kt-iconbox--animate-fast, + &.kt-iconbox--animate-faster{ + background-color: rgba(kt-state-color(#{$name}), 0.07) !important; + } + } + } +} + +@keyframes wave { + from { transform: rotate(0deg);} + from { transform: rotate(360deg);} +} diff --git a/src/assets/sass/global/components/general/_infobox.scss b/src/assets/sass/global/components/general/_infobox.scss new file mode 100644 index 0000000..733654f --- /dev/null +++ b/src/assets/sass/global/components/general/_infobox.scss @@ -0,0 +1,110 @@ +// +// Infobox +// + + + +.kt-infobox{ + padding:1.5rem; + + .kt-infobox__title{ + font-size: 2rem; + color: kt-base-color(label, 4); + } + + .kt-infobox__subtitle { + font-size: 1.3rem; + font-weight: 400; + color: kt-base-color(label, 4); + margin-bottom: 1.2rem; + } + + .kt-infobox__header{ + margin-bottom: 2rem; + display: flex; + align-items: center; + + .kt-infobox__badge{ + margin: auto 0 auto auto; + font-size: 1rem; + font-weight: 500; + padding: 0.5rem 1rem; + border-radius: 5px; + color: kt-state-color(brand, base); + background-color: rgba(kt-state-color(brand, base), 0.15); + } + } + + .kt-infobox__body{ + .kt-infobox__section{ + margin-bottom: 2rem; + + .kt-infobox__content{ + font-weight: 400; + color: #9392a0; + font-size: 1.15rem; + line-height: 2rem; + + .table{ + font-size: 1rem; + + thead{ + th{ + padding-top: 0.8rem; + padding-bottom: 0.8rem; + } + } + } + } + + &:last-child{ + margin-bottom: 0; + } + } + + .kt-nav{ + .kt-nav__item{ + .kt-nav__link{ + .kt-nav__link-text{ + font-size: 1.25rem; + } + } + } + } + + .accordion{ + + .card{ + .card-header{ + .card-title{ + font-size: 1.25rem; + font-weight: 400; + } + } + .card-body{ + font-size: 1.15rem; + line-height: 2rem; + font-weight: 400; + color: #9392a0; + } + + &:last-child{ + margin-bottom: 0; + } + } + } + } + + @each $name, $color in $kt-state-colors { + &--#{$name}{ + + .kt-infobox__header{ + + .kt-infobox__badge{ + color: kt-state-color(#{$name}, base); + background-color: rgba(kt-state-color(#{$name}, base), 0.15); + } + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/general/_list-pics.scss b/src/assets/sass/global/components/general/_list-pics.scss new file mode 100644 index 0000000..d924924 --- /dev/null +++ b/src/assets/sass/global/components/general/_list-pics.scss @@ -0,0 +1,46 @@ +// +// User Pics List +// + + + + +.kt-list-pics { + > a { + margin-right: 0.25rem; + + > img { + width: 3.36rem; + border-radius: 50%; + + @include kt-rounded { + border-radius: 3px; + } + } + } + + &.kt-list-pics--circle { + > a { + > img { + width: 3.36rem; + border-radius: 50%; + } + } + } + + &.kt-list-pics--sm { + > a { + > img { + width: 2.14rem; + } + } + } + + &.kt-list-pics-rounded--sm { + > a { + > img { + width: 2.14rem; + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/general/_list-timeline.scss b/src/assets/sass/global/components/general/_list-timeline.scss new file mode 100644 index 0000000..a215af2 --- /dev/null +++ b/src/assets/sass/global/components/general/_list-timeline.scss @@ -0,0 +1,157 @@ +// +// Timeline v1 +// + + + + +.kt-list-timeline { + .kt-list-timeline__group { + margin: 0 0 2rem 0; + } + + .kt-list-timeline__heading { + margin: 0 0 1.25rem 0; + font-weight: 700; + font-size: 1rem; + text-transform: uppercase; + } + + .kt-list-timeline__items { + position: relative; + padding: 0; + margin: 0; + + &:before { + background-color: kt-base-color(grey, 2); + position: absolute; + display: block; + content: ''; + width: 1px; + height: 100%; + top: 0; + bottom: 0; + left: 3px; + } + + .kt-list-timeline__item { + position: relative; + display: table; + table-layout: fixed; + width: 100%; + padding: 0.3rem 0; + margin: 0.5rem 0; + + &:first-child, + &:last-child { + &:before { + background-color: white; + position: absolute; + display: block; + content: ''; + width: 1px; + height: 50%; + top: 0; + bottom: 0; + left: 3px; + } + } + + &:last-child { + &:before { + top: auto; + bottom: 0; + } + } + + .kt-list-timeline__badge { + text-align: left; + vertical-align: middle; + display: table-cell; + position: relative; + width: 20px; + &:before { + background-color: kt-base-color(grey, 2); + position: absolute; + display: block; + content: ''; + width: 7px; + height: 7px; + left: 0; + top: 50%; + margin-top: -(7px / 2); + border-radius: 100%; + } + + @each $name, $color in $kt-state-colors { + &.kt-list-timeline__badge--#{$name} { + &:before { + background-color: kt-get($color, base); + } + } + } + } + + .kt-list-timeline__icon { + text-align: left; + vertical-align: middle; + display: table-cell; + width: 30px; + padding: 0 5px 0 0; + line-height: 0; + color: kt-base-color(label, 2); + } + + @include kt-icons-size( (fontawesome: 1.2rem, lineawesome: 1.6rem, flaticon: 1.6rem)); + + .kt-list-timeline__text { + display: table-cell; + text-align: left; + vertical-align: middle; + width: 100%; + padding: 0 0 0 5px; + font-size: 1rem; + color: kt-base-color(label, 3); + &:hover { + text-decoration: none; + } + } + + .kt-list-timeline__time { + display: table-cell; + text-align: right; + vertical-align: middle; + width: 80px; + padding: 0 0 0 5px; + font-size: 0.9rem; + color: kt-base-color(label, 2); + } + + &:first-child { + padding-top: 0; + margin-top: 0; + } + + &:last-child { + padding-bottom: 0; + margin-bottom: 0; + } + + &:first-child, + &:last-child { + &:before { + background-color: #fff; + } + } + + &.kt-list-timeline__item--read { + .kt-list-timeline__badge, + .kt-list-timeline__icon, + .kt-list-timeline__text, + .kt-list-timeline__time { + opacity: 0.5; + } + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/general/_media.scss b/src/assets/sass/global/components/general/_media.scss new file mode 100644 index 0000000..e397afb --- /dev/null +++ b/src/assets/sass/global/components/general/_media.scss @@ -0,0 +1,162 @@ +// +// Media +// + + + +.kt-media { + display: inline-flex; + + background-repeat: no-repeat; + background-position: center center; + background-size: cover; + + @include kt-media-size(50px, 1.3rem); + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + img { + display: flex; + @include kt-rounded { + border-radius: $kt-border-radius; + } + } + + span { + display: flex; + align-items: center; + justify-content: center; + font-weight: 600; + color: kt-base-color(label, 2); + + @include kt-rounded { + border-radius: $kt-border-radius; + } + } + + // State colors + &.kt-media--default { + background-color: kt-base-color(grey, 2); + } + + @each $name, $color in $kt-state-colors { + &.kt-media--#{$name} { + span { + background: rgba(kt-get($color, base), 0.1); + color: kt-get($color, base); + } + } + } + + // sizing + &.kt-media--xs { + @include kt-media-size(24px, 0.8rem); + } + + &.kt-media--sm { + @include kt-media-size(30px, 0.9rem); + } + + &.kt-media--md { + @include kt-media-size(47px, 1rem); + } + + &.kt-media--lg { + @include kt-media-size(65px, 1.3rem); + } + + &.kt-media--xl { + @include kt-media-size(80px, 1.7rem); + } + + // circle style + &.kt-media--circle { + @include kt-rounded { + border-radius: 50%; + } + + img { + @include kt-rounded { + border-radius: 50%; + } + } + + span { + @include kt-rounded { + border-radius: 50%; + } + } + } +} + +.kt-media-card { + display: flex; + align-items: center; + padding: 0; + margin: 0; + + .kt-media { + margin-right: 0.75rem; + } + + .kt-media-card__info { + display: flex; + align-items: center; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + + .kt-media-card__title { + color: kt-base-color(label, 3); + font-weight: 500; + font-size: 1.2rem; + transition: color 0.3s ease; + } + + a.kt-media-card__title { + transition: color 0.3s ease; + &:hover { + transition: color 0.3s ease; + color: kt-brand-color(); + } + } + + .kt-media-card__desc { + color: kt-base-color(label, 2); + font-weight: 400; + font-size: 0.9rem; + } + + a.kt-media-card__desc { + transition: color 0.3s ease; + &:hover { + transition: color 0.3s ease; + color: kt-brand-color(); + } + } + } +} + +.kt-media-group { + display: flex; + align-items: center; + + .kt-media { + position: relative; + z-index: 0; + margin-left: -10px; + border: 2px solid #fff; + transition: all 0.3s ease; + + &:first-child { + margin-left: 0; + } + + &:hover { + transition: all 0.3s ease; + z-index: 1; + } + } +} diff --git a/src/assets/sass/global/components/general/_my-cart.scss b/src/assets/sass/global/components/general/_my-cart.scss new file mode 100644 index 0000000..673350e --- /dev/null +++ b/src/assets/sass/global/components/general/_my-cart.scss @@ -0,0 +1,197 @@ +// +// My Cart +// + + + + +.kt-mycart { + .kt-mycart__head { + display: flex; + justify-content: space-between; + padding: 2.8rem 2rem; + background-position: center; + background-size: cover; + + .kt-mycart__info { + display: flex; + align-items: center; + + .kt-mycart__icon { + display: flex; + justify-content: center; + align-items: center; + width: 3rem; + height: 3rem; + background: rgba(#3850a8, 0.65); + + i { + font-size: 1.4rem; + font-weight: 500; + position: absolute; + } + + @include kt-rounded { + border-radius: 4px; + } + } + + .kt-mycart__title { + padding-left: 1rem; + color: #fff; + font-size: 1.3rem; + font-weight: 500; + margin: 0; + } + } + + .kt-mycart__button { + display: flex; + align-items: center; + + .btn { + padding: 0.3rem 0.5rem; + } + } + } + + .kt-mycart__body { + margin: 0.5rem 0; + + .kt-mycart__item { + border-bottom: 1px solid kt-base-color(grey, 2); + + .kt-mycart__container { + display: flex; + align-items: center; + justify-content: space-between; + padding: 1.5rem 2rem; + + .kt-mycart__info { + .kt-mycart__title { + color: #5e5b70; + font-size: 1.1rem; + font-weight: 500; + } + + .kt-mycart__desc { + padding: 0.5rem 0; + color: kt-base-color(label, 2); + font-weight: 400; + } + + .kt-mycart__action { + display: flex; + align-items: center; + + .kt-mycart__price { + margin-right: 0.5rem; + color: kt-base-color(label, 3); + font-size: 1.2rem; + font-weight: 500; + } + + .kt-mycart__text { + color: kt-base-color(label, 2); + font-weight: 400; + } + + .kt-mycart__quantity { + margin-left: 0.5rem; + color: kt-base-color(label, 3); + font-size: 1.2rem; + font-weight: 500; + } + + .btn { + font-size: 1.4rem; + display: flex; + justify-content: center; + align-items: center; + margin-left: 0.5rem; + width: 19px !important; + height: 19px !important; + padding-top: 0.1rem; + + &:hover { + color: #fff; + } + } + } + span { + display: block; + } + } + + .kt-mycart__pic { + width: 5rem; + + img { + width: 5rem; + height: 5rem; + background-position: center; + background-size: cover; + border-radius: 4px; + } + } + } + } + + .ps__rail-y { + .ps__thumb-y { + right: 5px !important; + } + } + } + + .kt-mycart__footer { + padding: 0.4rem 2rem 1.5rem 2rem; + + .kt-mycart__section { + display: flex; + align-items: center; + justify-content: space-between; + + .kt-mycart__subtitel { + span { + display: block; + color: #5e5b70; + font-size: 1rem; + font-weight: 500; + + &:not(:first-child):not(:last-child) { + padding: 0.4rem 0; + } + + &:last-child { + font-size: 1.1rem; + font-weight: 600; + } + } + } + + .kt-mycart__prices { + span { + display: block; + text-align: right; + color: kt-base-color(label, 2); + font-size: 1.2rem; + font-weight: 500; + + &:not(:first-child):not(:last-child) { + padding: 0.3rem 0; + } + + &:last-child { + font-weight: 700; + font-size: 1.3rem; + } + } + } + } + + .kt-mycart__button { + margin: 1.5rem 0 0.8rem 0; + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/general/_nav.scss b/src/assets/sass/global/components/general/_nav.scss new file mode 100644 index 0000000..da38be0 --- /dev/null +++ b/src/assets/sass/global/components/general/_nav.scss @@ -0,0 +1,558 @@ +// +// Navigation +// + + + +// Base +.kt-nav { + $kt-nav-padding-x: 1.75rem; + $kt-nav-padding-y: 0.55rem; + + display: block; + padding: 1rem 0; + margin: 0; + list-style: none; + border: 0; + + // Item + .kt-nav__item { + display: block; + + > .kt-nav__link { + display: flex; + flex-grow: 1; + align-items: center; + padding: $kt-nav-padding-y $kt-nav-padding-x; + cursor: pointer; + @include kt-transition(); // menu item link's text part + + .kt-nav__link-text { + flex-grow: 1; + font-size: 1rem; + color: kt-base-color(label, 3); + font-weight: 400; + } + + // menu item link's icon + .kt-nav__link-icon { + flex: 0 0 30px; + font-size: 1.25rem; + line-height: 0; + color: kt-base-color(label, 1); + + &:before { + line-height: 0; + } + + &.kt-nav__link-icon--center { + text-align: center; + margin-right: 0.25rem; + } + + // Svg icon + @include kt-svg-icon-color(kt-base-color(label, 1)); + } + + // menu item link's bullet + .kt-nav__link-bullet { + text-align: center; + flex: 0 0 10px; + margin-right: 10px; + + > span { + vertical-align: middle; + display: inline-block; + } + + &.kt-nav__link-bullet--dot { + > span { + width: 4px; + height: 4px; + border-radius: 100%; + } + } + + &.kt-nav__link-bullet--line { + > span { + width: 8px; + height: 2px; + border-radius: 2px; + } + } + + &.kt-nav__link-bullet--line, + &.kt-nav__link-bullet--dot { + > span { + background-color: kt-base-color(label, 1); + } + } + } + + // menu item link's icon part + .kt-nav__link-badge { + padding: 0px 0px 0px 5px; + } + + // menu item link's arrow part + .kt-nav__link-arrow { + text-align: right; + flex: 0 0 20px; + font-size: 0.8rem; + color: kt-base-color(label, 1); + @include kt-la-icon( kt-get($kt-action-icons, down)); + &:before { + display: inline-block; + transition: all 0.3s ease; + } + } + + &.collapsed { + .kt-nav__link-arrow { + @include kt-la-icon( kt-get($kt-action-icons, right)); + &:before { + transition: all 0.3s ease; + } + } + } + } + + >.kt-nav__sub { + padding: 0; + margin: 0; + + .kt-nav__item { + >.kt-nav__link { + padding: 0.5rem 1.5rem 0.5rem 2.5rem; + } + } + } + + &.kt-nav__item--last { + padding-bottom: 0; + } + + // Hover & active state + &.kt-nav__item--active, + &.active, + &:hover:not(.kt-nav__item--disabled):not(.kt-nav__item--sub) { + >.kt-nav__link { + background-color: kt-base-color(grey, 1); + + @include kt-transition(); + + .kt-nav__link-icon, + .kt-nav__link-text, + .kt-nav__link-arrow { + color: kt-state-color(brand, base); + } + + .kt-nav__link-icon { + @include kt-svg-icon-color(kt-state-color(brand, base)); + } + + .kt-nav__link-bullet { + &.kt-nav__link-bullet--line, + &.kt-nav__link-bullet--dot { + >span { + background-color: kt-state-color(brand, base); + } + } + } + } + } + + // Hover state + &:hover:not(.kt-nav__item--disabled).kt-nav__item--sub { + >.kt-nav__link.collapsed { + background-color: kt-base-color(grey, 1); + + @include kt-transition(); + + .kt-nav__link-icon, + .kt-nav__link-text, + .kt-nav__link-arrow { + color: kt-state-color(brand, base); + } + + + + .kt-nav__link-bullet { + &.kt-nav__link-bullet--line, + &.kt-nav__link-bullet--dot { + >span { + background-color: kt-state-color(brand, base); + } + } + } + } + } + + // Disabled state + &.kt-nav__item--disabled { + opacity: 0.6; + } + } + + // Custom + .kt-nav__custom { + padding: $kt-nav-padding-y $kt-nav-padding-x; + } + + // Section + .kt-nav__section { + margin-top: 1rem; + padding: 0 $kt-nav-padding-x; + + .kt-nav__section-icon { + color: kt-base-color(label, 1); + } + + &.kt-nav__section--first { + margin-top: 0.5rem; + } + + .kt-nav__section-text { + color: kt-state-color(brand, base); + font-weight: 600; + font-size: 0.9rem; + text-transform: uppercase; + } + } + + // Separator + .kt-nav__separator { + margin: ($kt-nav-padding-y + 0.15rem) 0; + height: 0; + display: block; + border-bottom: 1px solid kt-base-color(grey, 2); + + &.kt-nav__separator--dashed { + border-bottom: 1px dashed kt-base-color(grey, 2); + } + } + + // Space + .kt-nav__space { + height: 0; + margin: 0.5rem 0; + + &.kt-nav__space--sm { + margin: 0.25rem 0; + } + + &.kt-nav__space--lg { + margin: 0.75rem 0; + } + + &.kt-nav__space--xl { + margin: 1rem 0; + } + } + + // Head & Foot + .kt-nav__head, + .kt-nav__foot { + display: flex; + justify-content: space-between; + align-items: center; + font-size: 1rem; + color: kt-base-color(label, 3); + font-weight: 500; + padding: $kt-nav-padding-y $kt-nav-padding-x; + + > i { + font-size: 1.2rem; + color: kt-base-color(label, 2); + } + } + + .kt-nav__head { + font-size: 1.1rem; + } + + // Fit + &.kt-nav--fit { + padding: 0; + .kt-nav__item { + >.kt-nav__link { + padding-left: 0; + padding-right: 0; + } + } + } + + // Margins sizing + &.kt-nav--lg-space { + .kt-nav__item { + margin: 0.35rem 0; + + .kt-nav__link { + padding-top: 1.5rem; + padding-bottom: 1.5rem; + } + + &:first-child { + margin-top: 0; + } + + &:last-child { + margin-bottom: 0; + } + } + } + + &.kt-nav--md-space { + .kt-nav__item { + margin: 0.25rem 0; + + .kt-nav__link { + padding-top: 0.75rem; + padding-bottom: 0.75rem; + } + + &:first-child { + margin-top: 0; + } + + &:last-child { + margin-bottom: 0; + } + } + } + + // font weight + &.kt-nav--bold { + .kt-nav__item { + .kt-nav__link { + .kt-nav__link-text { + font-weight: 500; + } + } + } + } + + &.kt-nav--thin { + .kt-nav__item { + .kt-nav__link { + .kt-nav__link-text { + font-weight: 300; + } + } + } + } + + // font sizing + &.kt-nav--lg-font { + .kt-nav__item { + .kt-nav__link { + .kt-nav__link-text { + font-size: 1.15rem; + } + } + } + } + + &.kt-nav--xl-font { + .kt-nav__item { + .kt-nav__link { + .kt-nav__link-text { + font-size: 1.25rem; + } + } + } + } +} + +// Version 2 +.kt-nav { + &.kt-nav--v2 { + .kt-nav__item { + border-radius: 2rem; + overflow: hidden; + + >.kt-nav__link { + transition: none; + } + + // Hover state + &:hover:not(.kt-nav__item--disabled):not(.kt-nav__item--sub):not(.kt-nav__item--active) { + >.kt-nav__link { + background-color: #f4f4f9; + transition: none; + + .kt-nav__link-icon, + .kt-nav__link-text, + .kt-nav__link-arrow { + color: kt-state-color(brand, base); + } + + .kt-nav__link-bullet { + &.kt-nav__link-bullet--line, + &.kt-nav__link-bullet--dot { + >span { + background-color: #f4f4f9; + } + } + } + } + } + + // Active state + &.kt-nav__item--active { + >.kt-nav__link { + background-color: kt-state-color(brand, base); + transition: none; + + .kt-nav__link-icon, + .kt-nav__link-text, + .kt-nav__link-arrow { + color: kt-state-color(brand, inverse); + } + + .kt-nav__link-bullet { + &.kt-nav__link-bullet--line, + &.kt-nav__link-bullet--dot { + >span { + background-color: kt-state-color(brand, inverse); + } + } + } + } + &:hover { + >.kt-nav__link { + background-color: kt-state-color(brand, base); + + .kt-nav__link-icon, + .kt-nav__link-text, + .kt-nav__link-arrow { + color: kt-state-color(brand, inverse); + } + + .kt-nav__link-bullet { + &.kt-nav__link-bullet--line, + &.kt-nav__link-bullet--dot { + >span { + background-color: kt-state-color(brand, inverse); + } + } + } + } + } + } + } + } +} + +// Version 3 +.kt-nav { + &.kt-nav--v3 { + .kt-nav__item { + margin: 0; + + .kt-nav__link { + @include kt-transition(); + padding-top: 1rem; + padding-bottom: 1rem; + border-left: 2px solid transparent; + } + + &.active, + &.kt-nav__link--active { + .kt-nav__link { + @include kt-transition(); + background-color: kt-base-color(grey, 1); + border-left: 2px solid kt-state-color(brand); + + .kt-nav__link-text { + color: kt-state-color(brand); + } + } + } + + &:hover { + @include kt-transition(); + background-color: kt-base-color(grey, 1); + + .kt-nav__link { + .kt-nav__link-text { + color: kt-state-color(brand); + } + } + } + } + } +} + +// Version 4 +.kt-nav { + &.kt-nav--v4 { + + .kt-nav__item{ + padding: 0.65rem 0; + + .kt-nav__link{ + background-color: transparent; + margin-left:3px; + color: #9492a1; + font-size: 1.2rem; + padding: 0 1.1rem; + + .kt-nav__link-text{ + color: #9492a1; + font-size: 1.2rem; + } + } + + &.active{ + + .kt-nav__link{ + border-left: 3px solid kt-state-color(brand); + color: kt-base-color(label, 4); + margin-left:0; + + .kt-nav__link-text{ + color: kt-base-color(label, 4); + } + } + } + + &:first-child{ + margin-top: -0.65rem; + } + + &:hover { + @include kt-transition(); + background-color: kt-base-color(grey, 1); + + .kt-nav__link { + .kt-nav__link-text { + color: kt-state-color(brand); + } + } + } + } + + @each $name, $color in $kt-state-colors{ + + &--#{$name}{ + + .kt-nav__item{ + &.active{ + .kt-nav__link{ + border-left: 3px solid kt-state-color(#{$name}, base); + } + } + + &:hover:not(.kt-nav__item--disabled):not(.kt-nav__item--sub):not(.kt-nav__item--active) { + >.kt-nav__link{ + .kt-nav__link-text { + color: kt-state-color(#{$name}, base); + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/general/_notes.scss b/src/assets/sass/global/components/general/_notes.scss new file mode 100644 index 0000000..b5f1292 --- /dev/null +++ b/src/assets/sass/global/components/general/_notes.scss @@ -0,0 +1,204 @@ +// +// Notes +// + + + +.kt-notes { + .kt-notes__items { + margin: 0; + padding: 0; + + .kt-notes__item { + left: 8px; + border-left: 2px solid kt-base-color(grey, 2); + padding:0 0 50px 45px; + position:relative; + margin: 0 5px 0 17px; + + .kt-notes__media { + position: absolute; + top: 0; + left: -25.5px; + + img { + max-width: 50px; + max-height: 50px; + + @include kt-rounded { + border-radius: 50%; + } + } + + .kt-notes__icon { + display: flex; + justify-content: center; + align-items: center; + width: 50px; + height: 50px; + background-color: #fff; + border: 2px solid kt-base-color(grey, 2); + + @include kt-rounded { + border-radius: 50%; + } + + i { + color: kt-base-color(label, 2); + font-size: 1.8rem; + } + + } + + .kt-notes__user { + display: flex; + justify-content: center; + align-items: center; + width: 50px; + height: 50px; + font-size: 1.2rem; + background-color: #fff; + border: 2px solid kt-base-color(grey, 2); + color: kt-base-color(label, 2); + + @include kt-rounded { + border-radius: 50%; + } + } + + .kt-notes__circle { + width: 25px; + height: 25px; + display: block; + border: 2px solid kt-base-color(grey, 2); + margin-left: 12px; + background-color: #fff; + + @include kt-rounded { + border-radius: 50%; + } + } + } + + .kt-notes__content { + background-color: #F7F8FC; + padding: 0.5rem 1rem 1rem 1.5rem; + + .kt-notes__section { + display: flex; + justify-content: space-between; + align-items: center; + + .kt-notes__info { + display: flex; + flex-flow: wrap; + align-items: baseline; + + .kt-notes__title { + font-size: 1.1rem; + color: kt-base-color(label, 3); + font-weight: 500; + padding-right: 0.5rem; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + + .kt-notes__desc { + color: kt-base-color(label, 2); + font-weight: 400; + padding-right: 1rem; + } + } + + .kt-notes__dropdown { + .btn-icon { + width: 26px; + height: 26px; + } + } + } + + .kt-notes__body { + color: kt-base-color(label, 2); + font-weight: 400; + padding-right: 3rem; + padding-top: 0.5rem; + display: block; + } + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + &:after { + position: absolute; + content: ''; + width: 0; + height: 0; + top: 10px; + right: 100%; + margin-right: -3.5rem; + border-right: solid 10px #F7F8FC; + border-bottom: solid 17px transparent; + border-left: solid 17px transparent; + border-top: solid 17px transparent; + } + } + + &:last-child{ + border-left:0; + } + + &.kt-notes__item--clean { + .kt-notes__content { + background-color: #fff; + padding: 0; + + .kt-notes__info { + //margin-top: -0.5rem; + } + + &:after { + display: none; + } + } + } + } + + .kt-notes__item:last-child { + .kt-notes__media { + .kt-notes__circle { + margin-left: 14px; + } + } + } + } +} + + +@include kt-tablet-and-mobile { + .kt-notes { + .kt-notes__items { + .kt-notes__item { + margin: 0 7px 0 17px; + + .kt-notes__content { + padding: 0.5rem 1rem 0.7rem 1rem; + + .kt-notes__desc { + padding-top: 0.5rem; + display: block; + } + + + &:after { + margin-right: -3.8rem; + } + } + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/general/_notification-v2.scss b/src/assets/sass/global/components/general/_notification-v2.scss new file mode 100644 index 0000000..cf8971e --- /dev/null +++ b/src/assets/sass/global/components/general/_notification-v2.scss @@ -0,0 +1,62 @@ +// +// Notification-v2 +// + + + + +.kt-notification-v2 { + margin: 0; + + .kt-notification-v2__item { + display: flex; + align-items: center; + padding: 1rem; + text-decoration: none; + + .kt-notification-v2__item-icon { + display:flex; + justify-content: center; + align-items: center; + background-color: kt-base-color(grey, 1); + height: 50px; + width: 50px; + min-width: 50px; + border-radius: 50%; + + i { + font-size: 1.5rem; + } + } + + .kt-notification-v2__itek-wrapper { + padding-left: 1.5rem; + flex: 1 1 auto; + + .kt-notification-v2__item-title { + font-size: 1.1rem; + font-weight: 500; + color: #5d5b6f; + } + + .kt-notification-v2__item-desc { + font-size: 1rem; + font-weight: 300; + color: #b3b1c2; + } + } + + @include kt-transition(); + + &:hover { + background-color: kt-base-color(grey, 1); + border-radius: 5px; + @include kt-transition(); + + .kt-notification-v2__item-icon { + background-color: kt-base-color(grey, 2); + @include kt-transition(); + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/general/_notification.scss b/src/assets/sass/global/components/general/_notification.scss new file mode 100644 index 0000000..71d093e --- /dev/null +++ b/src/assets/sass/global/components/general/_notification.scss @@ -0,0 +1,120 @@ +// +// Notification +// + + + +$kt-notification-item-padding-x: 1.5rem; +$kt-notification-item-padding-y: 1.1rem; + +.kt-notification { + // Item + .kt-notification__item { + display: flex; + align-items: center; + padding: $kt-notification-item-padding-y $kt-notification-item-padding-x; + border-bottom: 1px solid kt-base-color(grey, 1); + transition: background-color 0.3s ease; + + &:last-child { + border-bottom: 1px solid transparent; + } + + .kt-notification__item-icon { + display:flex; + flex: 0 0 2.5rem; + align-items: center; + + i { + font-size: 1.4rem; + color: kt-brand-color(); + } + + svg { + height: 24px; + width: 24px; + margin-left: -4px; + } + } + + .kt-notification__item-details { + display:flex; + flex-direction: column; + flex-grow: 1; + + .kt-notification__item-title { + transition: color 0.3s ease; + font-size: 1rem; + font-weight: 400; + color: kt-base-color(label, 3); + } + + .kt-notification__item-time { + font-size: 1rem; + font-weight: 300; + color: kt-base-color(label, 2); + } + } + + &:hover { + transition: background-color 0.3s ease; + text-decoration: none; + background-color: kt-base-color(grey, 1); + + .kt-notification__item-details { + .kt-notification__item-title { + transition: color 0.3s ease; + color: kt-brand-color(); + } + } + } + + &.kt-notification__item--read { + & { + opacity: 0.5; + } + } + + &:after { + border: 0; + @include kt-arrow-icon(right, true); + font-size: 0.8rem; + line-height: 0; + position: relative; + color: kt-base-color(label, 2); + } + } + + // Custom + .kt-notification__custom { + display: flex; + align-items: center; + border-top: 1px solid kt-base-color(grey, 1); + padding: ($kt-notification-item-padding-y + 0.5) $kt-notification-item-padding-x; + } + + &.kt-notification--fit { + .kt-notification__item { + padding: $kt-notification-item-padding-y / 2 0; + + &:hover { + background-color: transparent; + + .kt-notification__item-title { + color: kt-brand-color(); + } + } + } + } +} + +// Util classes +.kt-notification-item-padding-x { + padding-left: $kt-notification-item-padding-x !important; + padding-right: $kt-notification-item-padding-x !important; +} + +.kt-notification-item-margin-x { + margin-left: $kt-notification-item-padding-x !important; + margin-right: $kt-notification-item-padding-x !important; +} \ No newline at end of file diff --git a/src/assets/sass/global/components/general/_pagination.scss b/src/assets/sass/global/components/general/_pagination.scss new file mode 100644 index 0000000..2fbb8ae --- /dev/null +++ b/src/assets/sass/global/components/general/_pagination.scss @@ -0,0 +1,210 @@ +// +// Pagination +// + + + +// Base +.kt-pagination { + display: flex; + align-items: center; + flex-wrap: wrap; + justify-content: space-between; + margin: 0; + padding: 0; + + .kt-pagination__links, .kt-pagination__links li a { + display: flex; + justify-content: center; + align-items: center; + } + + .kt-pagination__links { + list-style-type: none; + margin: 0; + padding: 0; + + li { + display: flex; + justify-content: center; + align-items: center; + margin-right: 0.5rem; + + + @include kt-rounded { + border-radius: 4px; + } + + a { + font-weight: 500; + color: kt-base-color(label, 2); + font-size: 1rem; + padding: 0 0.2rem; + display: flex; + flex-wrap: wrap; + justify-content: center; + align-items: center; + min-width: 30px; + min-height: 30px; + margin: 0; + } + } + + + + + .kt-pagination__link--active { + a { + color: kt-brand-color(inverse); + } + } + } + + // Toolbar + .kt-pagination__toolbar { + margin: 0; + display: flex; + align-items: center; + padding: 0; + + .form-control { + padding: 0; + margin-right: 10px; + height: 30px; + font-weight: 600; + font-size: 1.1rem; + font-weight: 500; + line-height: 1; + outline: none; + border: none; + } + + .pagination__desc { + flex-grow: 1; + font-weight: 500; + color: kt-base-color(label, 2); + } + } + + @each $name, $color in $kt-state-colors { + &.kt-pagination--#{$name} { + + .kt-pagination__links { + .kt-pagination__link--first, .kt-pagination__link--next, .kt-pagination__link--prev, .kt-pagination__link--last { + background: rgba(kt-get($color, base), 0.1); + } + + .kt-pagination__link--active { + background: kt-get($color, base); + } + + li { + &:hover { + background: kt-get($color, base); + transition: color 0.3s ease; + + a { + color: kt-brand-color(inverse); + + i { + color: #fff !important; + } + } + } + } + } + .kt-pagination__toolbar { + .form-control { + background: rgba(kt-get($color, base), 0.1); + } + } + } + } + + + // Circle style links + &.kt-pagination--circle { + .kt-pagination__links { + li { + min-width: 30px; + min-height: 30px; + + @include kt-rounded { + border-radius: 50%; + } + } + } + } + + // Sizing options + &.kt-pagination--lg { + .kt-pagination__links { + li { + a { + font-size: 1.3rem; + min-width: 35px; + min-height: 35px; + } + + } + } + + .kt-pagination__toolbar { + .form-control { + height: 35px; + font-size: 1.2rem; + padding: 0.2rem 0 0.2rem 0.2rem; + } + } + } + + &.kt-pagination--sm { + .kt-pagination__links { + li { + a { + font-size: 1rem; + min-width: 25px; + min-height: 25px; + } + + } + } + + .kt-pagination__toolbar { + .form-control { + height: 25px; + font-size: 0.9rem; + } + } + } +} + + +@include kt-mobile { + .kt-pagination { + .kt-pagination__links { + display: flex; + flex-wrap: wrap; + + li { + margin: 0.3rem 0.5rem 0.3rem 0;; + + a { + font-size: 0.9rem; + min-width: 25px; + min-height: 25px; + } + } + } + + .kt-pagination__toolbar { + .form-control { + height: 25px; + font-size: 0.9rem; + padding: 0.2rem 0 0.2rem 0.2rem; + } + } + } +} + + \ No newline at end of file diff --git a/src/assets/sass/global/components/general/_profile.scss b/src/assets/sass/global/components/general/_profile.scss new file mode 100644 index 0000000..f5a1ec0 --- /dev/null +++ b/src/assets/sass/global/components/general/_profile.scss @@ -0,0 +1,77 @@ +// +// User Profile Card +// + + + + + +.kt-card-profile { + padding: 5px 0; + margin: 0; + + .kt-card-profile__pic { + text-align: center; + padding: 0 5px 0 0; + text-align: center; + + .kt-card-profile__pic-wrapper { + padding: 8px; + display: inline-block; + margin: 2rem auto; + border-radius: 100%; + border: 2px solid kt-base-color(grey, 2); + } + + img { + text-align: center; + max-width: 130px !important; + margin: 0 auto !important; + border-radius: 100%; + } + + .kt-card-profile__no-photo { + height: 130px; + width: 130px; + display: flex; + justify-content: center; + align-items: center; + text-align: center; + position: relative; + border-radius: 100%; + + > span { + line-height: 0; + font-weight: 700; + font-size: 1.3rem; + text-transform: uppercase; + } + } + } + + .kt-card-profile__title { + text-align: center; + font-size: 1.3rem; + font-weight: 500; + } + + .kt-card-profile__details { + text-align: center; + padding: 0 0 0 0; + + .kt-card-profile__name { + display: block; + padding: 0 0 0 0; + font-size: 1.3rem; + font-weight: 500; + color: kt-base-color(label, 3); + } + + .kt-card-profile__email { + display: inline-block; + padding: 6px 0 0 0; + font-size: 500; + color: kt-base-color(label, 3); + } + } +} diff --git a/src/assets/sass/global/components/general/_ribbon.scss b/src/assets/sass/global/components/general/_ribbon.scss new file mode 100644 index 0000000..0f9ea5d --- /dev/null +++ b/src/assets/sass/global/components/general/_ribbon.scss @@ -0,0 +1,244 @@ +// +// Ribbon +// + + + +.kt-ribbon { + position: relative; + + .kt-ribbon__target { + display: flex; + justify-content: center; + align-items: center; + padding: 5px 10px; + position: absolute; + z-index: 1; + background-color: kt-state-color(brand, base); + color: kt-state-color(brand, inverse); + + >.kt-ribbon__inner { + z-index: -1; + position: absolute; + padding:0; + width: 100%; + height: 100%; + top: 0; + left: 0; + } + + &:after{ + border-color: darken(kt-state-color(brand, base), 30%); + } + } + + &--ver { + .kt-ribbon__target{ + padding: 5px 10px; + width: 36px; + height: 46px; + text-align: center; + } + } + + // Styles + &--shadow { + .kt-ribbon__target{ + box-shadow: 2px 2px 7px rgba(0, 0, 0, 0.4); + } + } + + &.kt-ribbon--round { + &.kt-ribbon--top { + .kt-ribbon__target { + border-top-right-radius: $kt-border-radius; + border-top-left-radius: $kt-border-radius; + } + } + + &.kt-ribbon--bottom { + .kt-ribbon__target { + border-bottom-right-radius: $kt-border-radius; + border-bottom-left-radius: $kt-border-radius; + } + } + + &.kt-ribbon--left { + .kt-ribbon__target { + border-top-left-radius: $kt-border-radius; + border-bottom-left-radius: $kt-border-radius; + } + } + + &.kt-ribbon--right { + .kt-ribbon__target { + border-top-right-radius: $kt-border-radius; + border-bottom-right-radius: $kt-border-radius; + } + } + } + + &--border-ver { + .kt-ribbon__target{ + &:after { + border-top:none; + border-bottom:none; + border-left:1px solid; + border-right:1px solid; + content:''; + position: absolute; + top:0; + bottom:0; + left:5px; + right:5px; + } + } + } + + &--border-hor { + .kt-ribbon__target{ + &:after { + border-top:1px solid; + border-bottom:1px solid; + border-left:none; + border-right:none; + content:''; + position: absolute; + top:5px; + bottom:5px; + left:0; + right:0; + } + } + } + + &--border-dash-ver { + .kt-ribbon__target{ + &:after{ + border-top:none; + border-bottom:none; + border-left:1px solid; + border-right:1px solid; + border-left-style: dashed; + border-right-style: dashed; + content:''; + position: absolute; + top:0; + bottom:0; + left:5px; + right:5px; + } + } + } + + &--border-dash-hor { + .kt-ribbon__target{ + &:after{ + border-top:1px solid; + border-bottom:1px solid; + border-left:none; + border-right:none; + border-top-style: dashed; + border-bottom-style: dashed; + content:''; + position: absolute; + top:5px; + bottom:5px; + left:0; + right:0; + } + } + } + + &--clip { + &.kt-ribbon--left { + .kt-ribbon__target { + left: -10px; + + .kt-ribbon__inner { + &:before, + &:after { + content: ''; + position: absolute; + border-style: solid; + border-color: transparent !important; + bottom: -10px; + } + + &:before { + border-width: 0 10px 10px 0; + border-right-color: #222 !important; + left: 0; + } + } + } + } + + &.kt-ribbon--right { + .kt-ribbon__target { + right: -10px; + + .kt-ribbon__inner { + &:before, + &:after { + content: ''; + position: absolute; + border-style: solid; + border-color: transparent !important; + bottom: -10px; + } + + &:before { + border-width: 0 0 10px 10px; + border-left-color: #222 !important; + right: 0; + } + } + } + } + } + + &--flag { + .kt-ribbon__target { + >.kt-ribbon__inner { + &:after { + border-left: 18px solid; + border-right: 18px solid; + border-bottom: 1em solid transparent !important; + bottom:-1em; + content:''; + height: 0; + left:0; + position:absolute; + width: 0; + } + } + } + } + + // State colors + @each $name, $color in $kt-state-colors{ + &--#{$name} { + .kt-ribbon__target { + background-color: kt-state-color(#{$name}, base); + color: kt-state-color(#{$name}, inverse); + + &:after{ + border-color: rgba(kt-state-color(#{$name}, inverse), 0.5); + } + + >.kt-ribbon__inner{ + background-color: kt-state-color(#{$name}, base); + color: kt-state-color(#{$name}, inverse); + + &:after { + border-color: transparent; + border-left-color: kt-state-color(#{$name}, base); + border-right-color: kt-state-color(#{$name}, base); + } + } + } + } + } +} + diff --git a/src/assets/sass/global/components/general/_searchbar.scss b/src/assets/sass/global/components/general/_searchbar.scss new file mode 100644 index 0000000..621ae4d --- /dev/null +++ b/src/assets/sass/global/components/general/_searchbar.scss @@ -0,0 +1,44 @@ +// +// Searchbar +// + + + +.kt-searchbar { + .input-group { + .input-group-text { + border: none; + background-color: #f2f3f7; + padding: 0 0.65rem 0 1rem; + + .kt-svg-icon { + height: 20px; + width: 20px; + } + + i { + font-size: 1rem; + } + } + + .form-control { + border: none; + background-color: #f2f3f7; + padding: 0; + } + } + + .kt-input-icon { + .form-control { + border: none; + background-color: #f2f3f7; + } + + .kt-input-icon__icon { + .kt-svg-icon { + height: 20px; + width: 20px; + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/general/_timeline-v1.scss b/src/assets/sass/global/components/general/_timeline-v1.scss new file mode 100644 index 0000000..2d47a1a --- /dev/null +++ b/src/assets/sass/global/components/general/_timeline-v1.scss @@ -0,0 +1,303 @@ +// +// Timeline v1 +// + + + + +.kt-timeline-v1 { + position: relative; + width: 100%; + + &:after { + content: ''; + position: absolute; + width: 5px; + top: 0; + margin-top: 0.1rem; + bottom: 3rem; + left: 50%; + margin-left: -2.5px; + background-color: #E6EAF5; + } + + &.kt-timeline-v1--center { + margin: 0 auto; + } + + .kt-timeline-v1__items { + padding-bottom: 6rem; + position: relative; + + .kt-timeline-v1__marker { + width: 20px; + height: 5px; + @include kt-rounded { + border-radius: $kt-border-radius; + } + position: absolute; + left: 50%; + margin-left: -10px; + background-color: #E6EAF5; + } + + .kt-timeline-v1__item { + position: relative; + margin-left: 0; + width: 50%; + min-height: 3rem; + + .kt-timeline-v1__item-arrow { + color: #F7F8FC; + } + + .kt-timeline-v1__item-circle { + background: white; + width: 20px; + height: 20px; + border-radius: 50%; + display: flex; + justify-content: center; + align-items: center; + z-index: 1; + position: absolute; + + > div { + border-radius: 50%; + width: 6px; + height: 6px; + } + } + + .kt-timeline-v1__item-time { + position: absolute; + display: inline-block; + margin-top: -2.14rem; + font-weight: 700; + >span { + padding-left: 5px; + } + } + + .kt-timeline-v1__item-content { + position: relative; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + padding: 2.14rem; + background-color: #F7F8FC; + + .kt-timeline-v1__item-title { + font-size: 1.2rem; + font-weight: 500; + + &+.kt-timeline-v1__item-body { + margin-top: 1.25rem; + } + } + + .kt-timeline-v1__item-actions { + margin-top: 1.25rem; + } + + .kt-timeline-v1__item-desc { + color: kt-base-color(label, 2); + } + } + + &.kt-timeline-v1__item--left { + left: 0; + padding-right: 2.85rem; + position: relative; + + .kt-timeline-v1__item-circle { + right: -10px; + top: 20px; + } + + .kt-timeline-v1__item-time { + right: 3.8rem; + } + + &:after { + position: absolute; + content: ''; + width: 0; + height: 0; + top: 15px; + left: 100%; + margin-left: -3rem; + border-left: solid 10px #F7F8FC; + border-bottom: solid 17px transparent; + border-right: solid 17px transparent; + border-top: solid 17px transparent; + } + } + + &.kt-timeline-v1__item--right { + left: 50%; + padding-left: 2.86rem; + top: -3.5rem; + + .kt-timeline-v1__item-circle { + top: 20px; + left: -10px; + } + + .kt-timeline-v1__item-time { + left: 3.57rem; + } + + &:after { + position: absolute; + content: ''; + width: 0; + height: 0; + top: 15px; + right: 100%; + margin-right: -3rem; + border-right: solid 10px #F7F8FC; + border-bottom: solid 17px transparent; + border-left: solid 17px transparent; + border-top: solid 17px transparent; + } + } + + &.kt-timeline-v1__item--first { + top: 3.5rem; + &+.kt-timeline-v1__item--right { + top: -1rem; + } + } + } + } + + // Justified mode + &.kt-timeline-v1--justified { + &:after { + left: 0; + bottom: 0; + } + + .kt-timeline-v1__items { + position: static; + margin-bottom: 40px; + padding: 20px 0; + + .kt-timeline-v1__marker { + left: 0; + top: 0; + } + + .kt-timeline-v1__item { + width: 100%; + top: 0 !important; + left: 0 !important; + margin-top: 50px !important; + padding-left: 2.25rem; + padding-right: 0; + position: relative; + + &:after { + position: absolute; + content: ''; + width: 0; + height: 0; + top: 15px; + left: 0; + margin-left: 3px; + border-right: solid 10px #F7F8FC; + border-bottom: solid 17px transparent; + border-left: solid 17px transparent; + border-top: solid 17px transparent; + } + + .kt-timeline-v1__item-time { + position: absolute; + display: inline-block; + margin-top: -2.14rem; + } + + .kt-timeline-v1__item-circle { + left: -10px; + top: 20px; + } + + .kt-timeline-v1__item-time { + right: 100%; + left: 3.57rem; + } + + &.kt-timeline-v1__item--first { + margin-top: 20px !important; + } + } + } + } +} + +@include kt-media-below(xl) { + .kt-timeline-v1 { + &:after { + left: 0; + bottom: 0; + } + + .kt-timeline-v1__items { + position: static; + margin-bottom: 40px; + padding: 20px 0; + + .kt-timeline-v1__marker { + left: 0; + top: 0; + } + + .kt-timeline-v1__item { + width: 100%; + left: 0 !important; + top: 0 !important; + margin-top: 50px !important; + padding-left: 2.25rem !important; + padding-right: 0 !important; + position: relative; + + &:after { + position: absolute; + content: ''; + width: 0; + height: 0; + top: 15px !important; + left: 0 !important; + right: auto !important; + margin-left: 3px !important; + border-right: solid 10px #F7F8FC !important; + border-bottom: solid 17px transparent !important; + border-left: solid 17px transparent !important; + border-top: solid 17px transparent !important; + } + + .kt-timeline-v1__item-time { + position: absolute; + display: inline-block; + margin-top: -2.14rem; + } + + .kt-timeline-v1__item-circle { + left: -10px; + top: 20px; + } + + .kt-timeline-v1__item-time { + right: 100%; + left: 3.57rem; + } + + &.kt-timeline-v1__item--first { + margin-top: 20px !important; + } + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/general/_timeline-v2.scss b/src/assets/sass/global/components/general/_timeline-v2.scss new file mode 100644 index 0000000..ab0eafc --- /dev/null +++ b/src/assets/sass/global/components/general/_timeline-v2.scss @@ -0,0 +1,83 @@ +// +// Timeline v2 +// + + + + +.kt-timeline-v2 { + position: relative; + + &:before { + content: ''; + position: absolute; + left: 4.85rem; + width: 0.214rem; + top: 5px; + bottom: 5px; + height: calc(100% - 5px); + background-color: #E7E9F5; + } + + .kt-timeline-v2__items { + .kt-timeline-v2__item { + display: table; + position: relative; + margin-bottom: 1.75rem; + + .kt-timeline-v2__item-time { + display: table-cell; + font-size: 1.3rem; + font-weight: 500; + vertical-align: top; + position: absolute; + padding-top: 0.18rem; + color: kt-base-color(label, 2); + } + + .kt-timeline-v2__item-cricle { + border-radius: 50%; + border: 0.89rem solid white; + z-index: 1; + top: 0.2rem; + left: 4.12rem; + position: relative; + + >i { + font-size: 1.78rem; + top: -0.93rem; + left: -0.57rem; + position: absolute; + } + } + + .kt-timeline-v2__item-text { + display: table-cell; + vertical-align: top; + font-size: 1rem; + padding: 0.35rem 0 0 5rem; + color: kt-base-color(label, 2); + + &.kt-timeline-v2__item-text--bold { + font-size: 1.2rem; + font-weight: 500; + padding-top: 0.21rem; + color: kt-base-color(label, 2); + } + + >span { + font-weight: 700; + } + } + + .kt-list-pics { + display: table-cell; + vertical-align: top; + } + + &:last-child { + margin-bottom: 0; + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/general/_timeline-v3.scss b/src/assets/sass/global/components/general/_timeline-v3.scss new file mode 100644 index 0000000..432a776 --- /dev/null +++ b/src/assets/sass/global/components/general/_timeline-v3.scss @@ -0,0 +1,74 @@ +// +// Timeline v3 +// + + + + +.kt-timeline-v3 { + .kt-timeline-v3__item { + display: table; + margin-bottom: 1rem; + position: relative; // state bar + + &:before { + position: absolute; + display: block; + width: 0.28rem; + border-radius: 0.3rem; + height: 70%; + left: 5.1rem; + top: 0.46rem; + content: ""; + } + + .kt-timeline-v3__item-time { + display: table-cell; + vertical-align: top; + padding-top: 0.6rem; + font-weight: 500; + font-size: 1.3rem; + position: absolute; + text-align: right; + width: 3.57rem; + color: kt-base-color(label, 2); + } + + // Description + .kt-timeline-v3__item-desc { + display: table-cell; + width: 100%; + vertical-align: top; + padding-left: 7rem; + + .kt-timeline-v3__item-text { + font-size: 1rem; + font-weight: 400; + color: kt-base-color(label, 2); + } + .kt-timeline-v3__item-user-name { + .kt-timeline-v3__itek-link { + font-size: 0.9rem; + text-decoration: none; + } + } + } + + // States + @each $name, $color in $kt-state-colors { + &.kt-timeline-v3__item--#{$name} { + &:before { + background: kt-get($color, base); + } + } + } + } +} + +@include kt-mobile() { + .kt-timeline-v3 { + .kt-timeline-v3__item { + margin-left: 0; + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/general/_user-card-v2.scss b/src/assets/sass/global/components/general/_user-card-v2.scss new file mode 100644 index 0000000..22cd135 --- /dev/null +++ b/src/assets/sass/global/components/general/_user-card-v2.scss @@ -0,0 +1,78 @@ +// +// User Card v2 +// + + + +.kt-user-card-v2 { + display: flex; + align-items: center; + padding: 0; + margin: 0; + + .kt-user-card-v2__pic { + .kt-badge { + width: 40px; + height: 40px; + } + + img { + border-radius: 50%; + max-width: 40px; + max-height: 40px; + } + + padding-right: 0.5rem; + } + + .kt-user-card-v2__details { + line-height: 0; + + .kt-user-card-v2__name { + display: block; + font-size: 1rem; + font-weight: 500; + line-height: 1.5rem; + transition: color 0.3s ease; + color: kt-base-color(label, 3); + } + + a.kt-user-card-v2__name:hover { + transition: color 0.3s ease; + color: kt-brand-color(); + } + + .kt-user-card-v2__desc, + .kt-user-card-v2__email { + margin-top: 3px; + display: inline-block; + font-size: 0.9rem; + line-height: 1rem; + font-weight: 400; + color: kt-base-color(label, 2); + } + + a.kt-user-card-v2__email:hover { + transition: color 0.3s ease; + color: kt-brand-color(); + } + } + + &.kt-user-card-v2--uncircle { + .kt-user-card-v2__pic { + img { + border-radius: $kt-border-radius; + } + } + } +} + +@include kt-tablet-and-mobile { + .kt-user-card-v2 { + .kt-user-card-v2__pic { + img { + max-width: 30px; + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/general/_user-card-v3.scss b/src/assets/sass/global/components/general/_user-card-v3.scss new file mode 100644 index 0000000..42b1e08 --- /dev/null +++ b/src/assets/sass/global/components/general/_user-card-v3.scss @@ -0,0 +1,72 @@ +// +// User Card v3 +// + + + +.kt-user-card-v3 { + display: flex; + align-items: center; + + .kt-user-card-v3__avatar { + > img { + height: 120px; + width: 120px; + border-radius: 7px; + } + } + + .kt-user-card-v3__detalis { + padding-left: 1.5rem; + + a.kt-user-card-v3__name { + font-size: 1.2rem; + font-weight: 500; + color: #33323f; + text-decoration: none; + padding-bottom: 0.8rem; + + @include kt-transition(); + &:hover { + @include kt-transition(); + color: kt-brand-color(); + } + } + + .kt-user-card-v3__desc { + font-size: 1rem; + font-weight: 400; + color: #b2afc6; + padding: 0.8rem 0; + } + + .kt-user-card-v3__info { + a.kt-user-card-v3__item { + display: flex; + align-items: center; + padding-bottom: 0.8rem; + + > i { + line-height: 0; + font-size: 1.4rem; + } + + .kt-user-card-v3__tag { + font-size: 0.9rem; + font-weight: 400; + color: #9e9bb1; + padding-left: 0.8rem; + @include kt-transition(); + } + + + &:hover { + .kt-user-card-v3__tag { + @include kt-transition(); + color: kt-brand-color(); + } + } + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/general/_user-card.scss b/src/assets/sass/global/components/general/_user-card.scss new file mode 100644 index 0000000..2f8d477 --- /dev/null +++ b/src/assets/sass/global/components/general/_user-card.scss @@ -0,0 +1,93 @@ +// +// User Card +// + + + +.kt-user-card { + display: flex; + align-items: center; + background-size: cover; + background-repeat: no-repeat; + padding: 2rem 1rem; + background-color: #f9fafe; + + // Elements + .kt-user-card__avatar { + .kt-badge, + img { + width: 60px; + height: 60px; + + @include kt-rounded { + border-radius: 4px; + } + } + + .kt-badge { + font-size: 2.2rem; + } + } + + .kt-user-card__name { + flex-grow: 1; + color: kt-base-color(label, 3); + font-size: 1.3rem; + font-weight: 500; + padding-left: 1rem; + } + + .kt-user-card__badge { + padding-left: 0.5rem; + } + + // Skins + &.kt-user-card--skin-light { + .kt-user-card__name { + color: kt-base-color(label, 3); + } + + .kt-user-card__avatar { + .kt-badge { + //background-color: rgba(#fff, 0.1); + } + } + } + + &.kt-user-card--skin-dark { + .kt-user-card__name { + color: #fff; + } + + .kt-user-card__avatar { + .kt-badge { + background-color: rgba(#fff, 0.1); + } + } + } +} + + +@include kt-tablet-and-mobile { + .kt-user-card { + padding: 1rem 1rem; + + // Elements + .kt-user-card__avatar { + .kt-badge, + img { + width: 40px; + height: 40px; + } + } + + .kt-user-card__name { + font-size: 1.1rem; + padding-left: 0.5rem; + } + + .kt-user-card__badge { + padding-left: 0.5rem; + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/general/mixins/_media.scss b/src/assets/sass/global/components/general/mixins/_media.scss new file mode 100644 index 0000000..b822906 --- /dev/null +++ b/src/assets/sass/global/components/general/mixins/_media.scss @@ -0,0 +1,33 @@ +// +// User Pics +// + + + +@mixin kt-media-size($image-size, $font-size) { + img { + width: 100%; + max-width: $image-size; + height: $image-size; + } + + span { + width: $image-size; + height: $image-size; + + @if $font-size { + font-size: $font-size; + } + } + + &.kt-media--fixed { + width: $image-size; + height: $image-size; + + img { + width: $image-size; + height: $image-size; + max-width: auto; + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/layout/_app.scss b/src/assets/sass/global/components/layout/_app.scss new file mode 100644 index 0000000..ada619a --- /dev/null +++ b/src/assets/sass/global/components/layout/_app.scss @@ -0,0 +1,126 @@ +// +// App(general layout for apps) +// + + + +// Config +$kt-app-config: ( + aside: ( + offcanvas: ( + layout: ( + self: ( + zindex: 1001, + width: 300px + ), + close: ( + size: 25px, + font-size: 1.4rem + ) + ), + skin: ( + overlay: ( + bg-color: rgba(#000000, 0.05) + ), + close: ( + bg-color: ( + default: kt-base-color(grey, 1), + hover: transparent + ), + icon-color: ( + default: kt-base-color(label, 2), + hover: kt-brand-color() + ) + ) + ) + ) + ) +); + +// General Mode +.kt-app { + // Aside + .kt-app__aside { + // Default size + @include kt-app-aside-width(350px); + + // Small size + &.kt-app__aside--sm { + @include kt-app-aside-width(250px); + } + + // Large size + &.kt-app__aside--lg { + @include kt-app-aside-width(450px); + } + + // Extra large size + &.kt-app__aside--xl { + @include kt-app-aside-width(600px); + } + } + + // Content + .kt-app__content { + margin-left: $grid-gutter-width; + } + + // Detail + .kt-app__detail { + margin-left: $grid-gutter-width; + + // Default size + @include kt-app-detail-width(550px); + + // Small size + &.kt-app__detail--sm { + @include kt-app-detail-width(400px); + } + + // Large size + &.kt-app__detail--lg { + @include kt-app-detail-width(700px); + } + + // Extra large size + &.kt-app__detail--xl { + @include kt-app-detail-width(850px); + } + } +} + +// Tablet & Mobile Mode. +.kt-app { + // Media range 1024px and below(see: $kt-media-breakpoints in sass/theme/_config.scss and sass/themes/core/_mixins.scss) + @include kt-tablet-and-mobile { + .kt-app__aside { + padding: 35px 15px 15px 15px; + background-color: #ffffff; + + .kt-portlet { + box-shadow: 0px 0px 30px 0px rgba(82,63,105, 0.1); + } + + &.kt-app__aside--fit { + padding: 20px 0 0 0; + + .kt-portlet { + box-shadow:none; + } + } + } + + // Content + .kt-app__content { + margin-left: 0; + } + + // Detail + .kt-app__detail { + margin-left:0; + } + } +} + +// App aside offcanvas +@include kt-offcanvas-build(kt-app__aside, tablet-and-mobile, kt-get($kt-app-config, aside, offcanvas) ); diff --git a/src/assets/sass/global/components/layout/_demo-panel.scss b/src/assets/sass/global/components/layout/_demo-panel.scss new file mode 100644 index 0000000..e4c4a09 --- /dev/null +++ b/src/assets/sass/global/components/layout/_demo-panel.scss @@ -0,0 +1,258 @@ +// +// +// + + + +$kt-demo-panel: ( + self: ( + bg-color: #fff, + shadow: 0px 0px 28px 0px rgba(82,63,105,0.13), + + offcanvas: ( + layout: ( + self: ( + zindex: 1001, + direction: right, + transition: all .3s ease, + width: 350px + ), + + close: ( + size: 25px, + font-size: 1.4rem + ) + ), + + skin: ( + overlay: ( + bg-color: rgba(#000000, 0.05), + ) + ) + ) + ) +); + +// Base +.kt-demo-panel-toggle { + background-color: #fff; + cursor: pointer; + position: fixed; + z-index: kt-get($kt-demo-panel, self, offcanvas, layout, self, zindex) - 1; + right: 0; + top: 200px; + width: 40px; + display: flex; + justify-content: center; + align-items: center; + padding: 1.5rem 0; + box-shadow: kt-get($kt-demo-panel, self, shadow); + + span { + writing-mode: vertical-rl; + text-orientation: mixed; + font-size: 1.3rem; + font-weight: 700; + text-transform: uppercase; + color: kt-brand-color(); + letter-spacing: 3px; + } + + @include kt-rounded { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + } +} + +.kt-demo-panel { + background-color: kt-get($kt-demo-panel, self, bg-color); + box-shadow: kt-get($kt-demo-panel, self, shadow); + padding: 2.5rem; + + // Head + .kt-demo-panel__head { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 3rem; + + .kt-demo-panel__title { + font-size: 1.4rem; + font-weight: 500; + color: kt-base-color(label, 4); + margin: 0; + padding: 0; + + small { + color: kt-base-color(label, 2); + font-size: 1.1rem; + } + } + + .kt-demo-panel__close { + display: flex; + justify-content: center; + align-items: center; + width: 28px; + height: 28px; + background-color: kt-base-color(grey, 1); + @include kt-transition(); + + i { + @include kt-transition(); + font-size: 0.8rem; + color: kt-base-color(label, 2); + } + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + &:hover { + @include kt-transition(); + background-color: kt-brand-color(); + + i { + @include kt-transition(); + color: kt-brand-color(inverse); + } + } + } + } + + // Content + .kt-demo-panel__body { + position: relative; + + .ps__rail-y { + opacity: 1; + } + + .kt-demo-panel__item { + display: block; + margin-bottom: 2rem; + outline: 0; + + &:last-child { + margin-bottom: 0; + } + + &:hover { + text-decoration: none; + } + + .kt-demo-panel__item-title { + font-size: 1.1rem; + font-weight: 500; + color: kt-base-color(label, 3); + text-align: center; + margin-bottom: 0.5rem; + } + + .kt-demo-panel__item-preview { + overflow: hidden; + position: relative; + @include kt-transition(); + border: 4px solid kt-base-color(grey, 2); + + img { + width: 100%; + } + + .kt-demo-panel__item-preview-overlay { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + display: flex; + justify-content: center; + align-items: center; + background-color: rgba(#000, 0.15); + @include kt-transition(); + opacity: 0; + + .btn { + margin-right: 5px; + + &:last-child { + margin-right: 0; + } + + &.btn-light { + background-color: #fff; + color: kt-base-color(label, 2); + + &:hover { + background-color: #fff; + color: kt-base-color(label, 3); + } + } + } + } + + @include kt-rounded { + border-radius: 4px; + } + } + + &.kt-demo-panel__item--active { + .kt-demo-panel__item-preview { + @include kt-transition(); + border: 4px solid kt-brand-color(); + } + } + + &:hover { + .kt-demo-panel__item-preview { + @include kt-transition(); + + .kt-demo-panel__item-preview-overlay { + @include kt-transition(); + opacity: 1; + } + } + } + } + + .kt-demo-panel__purchase { + margin-bottom: 2rem; + display: block; + } + } +} + +// Desktop view +@include kt-desktop { + .kt-demo-panel { + .kt-demo-panel__body { + padding-right: 1.5rem; + margin-right: -1.5rem; + } + } +} + +// Build offcanvas mode +@include kt-offcanvas-build(kt-demo-panel, default, kt-get($kt-demo-panel, self, offcanvas) ); + +// Mobile view +@include kt-tablet-and-mobile { + .kt-demo-panel-toggle { + width: 30px; + padding: 1rem 0; + + span { + font-size: 1.2rem; + font-weight: 600; + letter-spacing: 2px; + } + } + + .kt-demo-panel { + padding: 1rem; + } + + .kt-demo-panel-toggle { + top: 20%; + } +} diff --git a/src/assets/sass/global/components/layout/_offcanvas-panel.scss b/src/assets/sass/global/components/layout/_offcanvas-panel.scss new file mode 100644 index 0000000..6bd78cb --- /dev/null +++ b/src/assets/sass/global/components/layout/_offcanvas-panel.scss @@ -0,0 +1,131 @@ +// +// +// + + + + + +$kt-offcanvas-panel: ( + self: ( + bg-color: #fff, + shadow: 0px 0px 28px 0px rgba(82,63,105,0.13), + + offcanvas: ( + layout: ( + self: ( + zindex: 1001, + direction: right, + transition: all .3s ease, + width: 425px + ), + + close: ( + size: 25px, + font-size: 1.4rem + ) + ), + + skin: ( + overlay: ( + bg-color: rgba(#000000, 0.1), + ) + ) + ) + ) +); + +// Base +.kt-offcanvas-panel { + background-color: kt-get($kt-offcanvas-panel, self, bg-color); + box-shadow: kt-get($kt-offcanvas-panel, self, shadow); + padding: 2.5rem; + + // Head + .kt-offcanvas-panel__head { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 2rem; + + .kt-offcanvas-panel__title { + font-size: 1.4rem; + font-weight: 500; + color: kt-base-color(label, 4); + margin: 0; + padding: 0; + + small { + color: kt-base-color(label, 2); + font-size: 1rem; + } + } + + .kt-offcanvas-panel__close { + display: flex; + justify-content: center; + align-items: center; + width: 28px; + height: 28px; + background-color: kt-base-color(grey, 1); + @include kt-transition(); + + i { + @include kt-transition(); + font-size: 0.8rem; + color: kt-base-color(label, 2); + } + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + &:hover { + @include kt-transition(); + background-color: kt-brand-color(); + + i { + @include kt-transition(); + color: kt-brand-color(inverse); + } + } + } + } + + // Content + .kt-offcanvas-panel__body { + position: relative; + + .kt-offcanvas-panel__section { + padding: 0; + font-size: 1.3rem; + font-weight: 500; + color: kt-base-color(label, 3); + margin: 2rem 0 1.5rem 0; + + &.kt-offcanvas-panel__section--first { + margin-top: 0; + } + } + } +} + +// Build offcanvas mode +@include kt-offcanvas-build(kt-offcanvas-panel, default, kt-get($kt-offcanvas-panel, self, offcanvas) ); + +// Desktop view +@include kt-desktop { + .kt-offcanvas-panel { + .kt-offcanvas-panel__body { + padding-right: 1.5rem; + margin-right: -1.5rem; + } + } +} + +// Mobile view +@include kt-tablet-and-mobile { + .kt-offcanvas-panel { + padding: 1rem; + } +} diff --git a/src/assets/sass/global/components/layout/_quick-panel.scss b/src/assets/sass/global/components/layout/_quick-panel.scss new file mode 100644 index 0000000..83586d9 --- /dev/null +++ b/src/assets/sass/global/components/layout/_quick-panel.scss @@ -0,0 +1,197 @@ +// +// +// + + + +$kt-quick-panel: ( + self: ( + padding: 0, + bg-color: #fff, + shadow: 0px 0px 28px 0px rgba(82,63,105,0.13), + + offcanvas: ( + layout: ( + self: ( + zindex: 1001, + direction: right, + transition: all .3s ease, + width: 425px + ), + + close: ( + size: 25px, + font-size: 1.4rem + ) + ), + + skin: ( + self: ( + bg-color: #ffffff, + shadow: 0px 1px 9px -3px rgba(0,0,0,0.75) + ), + + overlay: ( + bg-color: rgba(#000000, 0.1), + ), + + close: ( + icon-color: ( + default: #968ad4, + hover: #ffffff + ), + bg-color: ( + default: darken(#f8f8fb, 5%), + hover: kt-brand-color() + ) + ) + ) + ) + ) +); + +// Base +.kt-quick-panel { + background-color: kt-get($kt-quick-panel, self, bg-color); + box-shadow: kt-get($kt-quick-panel, self, shadow); + padding: kt-get($kt-quick-panel, self, padding); + + // Close + .kt-quick-panel__close { + position: absolute; + z-index: 1; + right: 1.5rem; + top: 1rem; + display: flex; + justify-content: center; + align-items: center; + width: 28px; + height: 28px; + background-color: kt-base-color(grey, 1); + @include kt-transition(); + + i { + @include kt-transition(); + font-size: 0.8rem; + color: kt-base-color(label, 2); + } + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + &:hover { + @include kt-transition(); + background-color: kt-brand-color(); + + i { + @include kt-transition(); + color: kt-brand-color(inverse); + } + } + } + + // Nav + .kt-quick-panel__nav { + display: flex; + position: relative; + padding: 1.5rem 0 0 0; + align-items: center; + + .nav { + width: 100%; + padding: 0 1.5rem; + margin: 0; + + .nav-item { + margin-right: 1.5rem; + + .nav-link { + font-size: 1rem; + color: kt-base-color(label, 2); + } + + &:last-child { + margin-right: 0; + } + } + } + } + + // Content + .kt-quick-panel__content { + padding: 1.5rem 0; + + .ps { + > .ps__rail-y { + right: 5px !important; + } + } + } + + .kt-quick-panel__content-padding-x { + padding-left: 1.5rem; + padding-right: 1.5rem; + } +} + +// Build offcanvas mode +@include kt-offcanvas-build(kt-quick-panel, default, kt-get($kt-quick-panel, self, offcanvas) ); + +// Mobile view +@include kt-tablet-and-mobile { + // Base + .kt-quick-panel { + + // Close + .kt-quick-panel__close { + right: 0.5rem; + top: 0.5rem; + width: 24px; + height: 24px; + + i { + font-size: 0.8rem; + } + } + + // Nav + .kt-quick-panel__nav { + padding: 1rem 0; + + .nav { + .nav-item { + margin-right: 1rem; + + &:last-child { + margin-right: 0; + } + } + + .nav-link { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + font-size: 0.9rem; + font-weight: 400; + text-transform: uppercase; + } + } + + // Close + .kt-quick-panel__close { + i { + font-size: 1.1rem; + } + } + } + + // Content + .kt-quick-panel__content { + padding: 1rem 0.5rem 1rem 1rem; + + .tab-pane { + padding-right: 0.5rem; + } + } + } +} diff --git a/src/assets/sass/global/components/layout/_quick-search.scss b/src/assets/sass/global/components/layout/_quick-search.scss new file mode 100644 index 0000000..3c6fb04 --- /dev/null +++ b/src/assets/sass/global/components/layout/_quick-search.scss @@ -0,0 +1,335 @@ +// +// Quick Search +// + + + + +.kt-quick-search { + // Form + .kt-quick-search__form { + padding: 0; + + .input-group { + background-color: transparent; + } + + .input-group-prepend, + .input-group-append { + background-color: transparent; + .input-group-text { + background-color: transparent; + border: 0; + } + } + + .form-control { + @include kt-input-reset(); + background-color: transparent; + padding-left: 0; + padding-right: 0; + border-top: 0; + border-left: 0; + border-right: 0; + padding: 0; + border-radius: 0; + } + + i { + font-size: 1.3rem; + } + + .kt-quick-search__close { + cursor: pointer; + display: none; + @include kt-transition(); + + &:hover { + @include kt-transition(); + color: kt-brand-color(); + } + } + } + + // Wrapper + .kt-quick-search__wrapper { + display: none; + + // Scroll + &.ps { + padding-right: 10px !important; + margin-right: -10px !important; + } + } + + // Result + .kt-quick-search__result { + padding: 0; + margin: 0; + + // Message + .kt-quick-search__message { + display: flex; + padding: 1rem 0; + font-weight: 500; + font-size: 1rem; + } + + // Category + .kt-quick-search__category { + font-size: 1.2rem; + font-weight: 600; + text-transform: uppercase; + color: kt-brand-color(); + margin: 0.5rem 0 1rem 0; + } + + // Section + .kt-quick-search__section { + margin-bottom: 2rem; + } + + // Item + .kt-quick-search__item { + display: flex; + align-items: center; + margin-bottom: 1rem; + + &:last-child { + margin-bottom: 0; + } + + // Icon + .kt-quick-search__item-icon { + display:flex; + justify-content: center; + align-items: center; + background-color: #f0f0f4; + width: 50px; + height: 50px; + border-radius: 50%; + + > i { + font-size: 1.4rem; + } + } + + // Image + .kt-quick-search__item-img { + display:flex; + justify-content: flex-start; + align-items: center; + width: 50px; + height: 50px; + + > img { + max-width: 50px; + max-height: 50px; + border-radius: 50%; + } + + &.kt-quick-search__item-img--file { + width: 40px; + + > img { + max-width: 40px; + border-radius: 0; + } + } + } + + // Wrapper + .kt-quick-search__item-wrapper { + padding-left: 1.25rem; + flex: 1 1 auto; + + .kt-quick-search__item-title { + font-size: 1rem; + font-weight: 500; + color: kt-base-color(label, 4); + text-decoration: none; + @include kt-transition(); + + &:hover { + color: kt-brand-color(); + @include kt-transition(); + } + } + + .kt-quick-search__item-desc { + font-size: 1rem; + font-weight: 400; + color: kt-base-color(label, 2); + } + } + } + } + + // Compact result style + &.kt-quick-search--result-compact { + // Result + .kt-quick-search__result { + // Category + .kt-quick-search__category { + font-size: 1rem; + margin: 0.25rem 0 0.75rem 0; + } + + // Section + .kt-quick-search__section { + margin-bottom: 2.25rem; + } + + // Item + .kt-quick-search__item { + margin-bottom: 1.5rem; + + &:last-child { + margin-bottom: 0; + } + + // Icon + .kt-quick-search__item-icon { + width: 32px; + height: 32px; + + > i { + font-size: 1.4rem; + } + } + + // Image + .kt-quick-search__item-img { + width: 32px; + height: 32px; + + > img { + max-width: 32px; + max-height: 32px; + } + + &.kt-quick-search__item-img--file { + width: 27px; + + > img { + max-width: 27px; + } + } + } + + // Wrapper + .kt-quick-search__item-wrapper { + padding-left: 0.75rem; + + .kt-quick-search__item-title { + font-size: 1rem; + font-weight: 500; + } + + .kt-quick-search__item-desc { + font-size: 0.9rem; + line-height: 1.1; + } + } + } + } + } + + // Show results + &.kt-quick-search--has-result { + .kt-quick-search__wrapper { + display: block; + } + } + + // Layout Styles: + // Dropdown mode + &.kt-quick-search--dropdown { + padding: 1rem 1.5rem; + + // Form + .kt-quick-search__form { + .input-group { + &:before { + right: 0; + } + + .input-group-prepend { + .input-group-text { + padding-left: 0; + } + } + + .input-group-append { + .input-group-text { + padding-right: 0; + } + } + } + } + + // Wrapper + .kt-quick-search__wrapper { + margin: 1.5rem 0 0.5rem 0; + } + + // Show results + &.kt-quick-search--has-result { + .kt-quick-search__form { + border-bottom: 1px solid kt-base-color(grey, 2); + padding-bottom: 0.75rem; + } + } + } + + // Inline mode + &.kt-quick-search--inline { + // Dropdown menu + .dropdown-menu { + padding: 1.5rem; + } + } + + // Inline mode + &.kt-quick-search--offcanvas { + // Form + .kt-quick-search__form { + margin-bottom: 1.5rem; + + .form-control { + font-size: 1rem; + font-weight: 500; + } + + .input-group { + border-bottom: 1px solid kt-base-color(grey, 2); + + &:before { + right: 0; + } + + .input-group-prepend { + .input-group-text { + padding-left: 0; + } + } + + .input-group-append { + .input-group-text { + padding-right: 0; + } + } + } + } + + // Wrapper + .kt-quick-search__wrapper { + display: block; + } + + // Result + .kt-quick-search__result { + + } + } +} diff --git a/src/assets/sass/global/components/layout/_scroll.scss b/src/assets/sass/global/components/layout/_scroll.scss new file mode 100644 index 0000000..b3f9b26 --- /dev/null +++ b/src/assets/sass/global/components/layout/_scroll.scss @@ -0,0 +1,10 @@ +// +// Scroll +// + + + +.kt-scroll { + position: relative; + overflow: hidden; +} \ No newline at end of file diff --git a/src/assets/sass/global/components/layout/_sticky-toolbar.scss b/src/assets/sass/global/components/layout/_sticky-toolbar.scss new file mode 100644 index 0000000..45f31be --- /dev/null +++ b/src/assets/sass/global/components/layout/_sticky-toolbar.scss @@ -0,0 +1,81 @@ +// +// Sticky Toolbar +// + + + +.kt-sticky-toolbar { + width: 46px; + position: fixed; + top: 30%; + right: 0; + list-style: none; + padding: 5px 0; + margin: 0; + z-index: 50; + background: #fff; + box-shadow: $kt-dropdown-shadow; + + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + + @include kt-rounded { + border-radius: 3px 0 0 3px; + } + + .kt-sticky-toolbar__item { + margin:0; + padding: 5px; + text-align: center; + + > a { + background: #f4f4f8; + display: flex; + justify-content: center; + align-items: center; + width: 30px; + height: 30px; + + @include kt-rounded { + border-radius: 3px; + } + + transition: background 0.3s ease; + + > i { + transition: color 0.3s ease; + font-size: 1.3rem; + } + + &:hover { + transition: background 0.3s ease; + + > i { + transition: color 0.3s ease; + } + } + } + + @each $name, $color in $kt-state-colors { + &.kt-sticky-toolbar__item--#{$name} { + > a { + > i { + color: kt-get($color, base); + } + } + + &:hover { + > a { + background: kt-get($color, base); + + > i { + color: kt-get($color, inverse); + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/layout/_subheader.scss b/src/assets/sass/global/components/layout/_subheader.scss new file mode 100644 index 0000000..7509ddc --- /dev/null +++ b/src/assets/sass/global/components/layout/_subheader.scss @@ -0,0 +1,457 @@ +// +// Subheader +// + + + +// Config +$kt-subheader-config: ( + fixed: ( + height: 54px + ), + toggle: ( + width: 20px, + height: 22px, + transition-duration: 0.4s, + thickness: 2px, + space: 4px, + radius: 2px, + color: ( + default: kt-base-color(label, 2), + hover: kt-brand-color(), + active: kt-brand-color() + ) + ) +); + +// Base +.kt-subheader { + background-color: #fff; + display: flex; + align-items: stretch; + margin: 10px 0; + + .kt-container { + display: flex; + justify-content: space-between; + align-items: stretch; + flex-wrap: wrap; + } + + // Head actions buttons + .btn { + display: inline-flex; + height: 32px !important; + padding-top: 0; + padding-bottom: 0; + margin-top: 0.25rem; + margin-bottom: 0.25rem; + + i { + font-size: 1rem !important; + } + + &.btn-icon { + width: 32px !important; + } + + &:not(.dropdown-toggle-split) { + margin-left: 0.5rem; + } + } + + // Main + .kt-subheader__main { + display: flex; + justify-content: flex-start; + align-items: center; + flex-wrap: wrap; + padding: 0.25rem 0; + + // Buttons + .btn { + &:not(.dropdown-toggle-split) { + margin-left: 0; + margin-right: 0.5rem; + } + } + + // Mobile Toggler + .kt-subheader__mobile-toggle { + display: none; + } + + // Title + .kt-subheader__title { + margin: 0; + padding: 0 1rem 0 0; + font-size: 1.2rem; + font-weight: 500; + color: #434349; + display: flex; + align-items: center; + + small { + padding-left: 0.25rem; + font-size: 0.9rem; + color: kt-base-color(label, 2); + } + } + + // Desc + .kt-subheader__desc { + padding: 0 0.5rem 0 0; + font-size: 1rem; + font-weight: 500; + color: #959cb6; + } + + // Separator + .kt-subheader__separator { + display: block; + width: 12px; + height: 4px; + border-radius: 2px; + background: #e7e8ef; + margin: 0 1rem 0 0; + + &.kt-subheader__separator--v { + width: 1px; + height: 22px; + } + } + + // Breadcrumbs + .kt-subheader__breadcrumbs { + display: flex; + align-items: center; + list-style-type: none; + flex-wrap: wrap; + margin: 0; + padding: 0; + + .kt-subheader__breadcrumbs-home { + padding: 0px 0.65rem 0px 0px; + @include kt-transition(); + + > i { + font-size: 1rem; + color: #c5cbe7; + } + + &:hover { + > i { + @include kt-transition(); + color: kt-brand-color(); + } + } + + &.kt-subheader__breadcrumbs-home--active { + > i { + color: kt-brand-color(); + } + } + } + + .kt-subheader__breadcrumbs-link { + padding: 0 0.35rem 0 0; + font-size: 1rem; + font-weight: 500; + color: #959cb6; + + &:hover { + color: kt-brand-color(); + } + + &.kt-subheader__breadcrumbs-link--active { + color: kt-brand-color(); + } + + @include kt-hover-transition(); + } + + .kt-subheader__breadcrumbs-separator { + display: flex; + justify-content: content; + align-items: center; + padding: 0 0.35rem 0 0; + + &:after { + display: block; + width: 4px; + height: 4px; + border-radius: 50%; + content: " "; + background: #e7e8ef; + } + } + } + + // Group + .kt-subheader__group { + display: flex; + align-items: center; + } + } + + // Toolbar + .kt-subheader__toolbar { + display: flex; + justify-content: flex-end; + align-items: center; + padding: 0; + + // Toolbar buttons + .btn:not(.dropdown-toggle-split) { + margin-left: 0.25rem; + } + } + + // Primary button + .kt-subheader__btn-primary { + background: #f2f3f7; + color: #959cb6; + font-weight: 500; + + i { + color: #959cb6; + } + + &:hover, + &.active, + &:active, + &:focus { + color: kt-brand-color(inverse); + background: kt-brand-color(); + + i { + color: kt-brand-color(inverse); + } + + @include kt-svg-icon-color(kt-brand-color(inverse)); + } + } + + // Secondary button + .kt-subheader__btn-secondary { + color: #959cb6; + font-weight: 500; + + i { + color: #aab1df; + } + + @include kt-svg-icon-color(#aab1df); + + &:hover, + &.active, + &:active, + &:focus { + background: #f2f3f7; + color: kt-brand-color(); + @include kt-svg-icon-color(kt-brand-color()); + } + } + + // Daterange + .kt-subheader__btn-daterange { + background: #f2f3f7; + + .kt-subheader__btn-daterange-title { + display: inline-block; + color: #959cb6; + font-weight: 500; + } + + .kt-subheader__btn-daterange-date { + display: inline-block; + color: kt-brand-color(); + margin-right: 0.75rem; + font-weight: 500; + } + + i { + color: kt-brand-color(); + } + + + &:hover, + &.active, + &:active, + &:focus { + background: #f2f3f7; + + i { + color: kt-brand-color(); + } + } + } + + // Search + .kt-subheader__search { + width: 175px; + display: inline-block; + + .form-control { + font-size: 0.9rem; + height: 33px; + background: #f2f3f7; + border-color: #f2f3f7 !important; + } + + .kt-input-icon__icon { + i { + font-size: 1.2rem; + color: kt-base-color(label, 2); + } + } + } + + // Solid style + .kt-subheader--solid & { + margin: 0 0 kt-get($kt-page-padding, desktop) 0; + min-height: kt-get($kt-subheader-config, fixed, height); + } + + // Transparent style + .kt-subheader--transparent & { + background-color: transparent; + + // Main + .kt-subheader__main { + .kt-subheader__separator { + background: darken(#e7e8ef, 4%); + } + + .kt-subheader__breadcrumbs { + .kt-subheader__breadcrumbs-home { + > i { + color: darken(#c5cbe7, 4%); + } + } + + .kt-subheader__breadcrumbs-link { + color: #959cb6; + } + + .kt-subheader__breadcrumbs-separator { + &:after { + background: darken(#e7e8ef, 4%); + } + } + } + } + + // Primary button + .kt-subheader__btn-primary { + background: darken(#eaecf2, 3%); + color: #959cb6; + + i { + color: #959cb6; + } + + @include kt-svg-icon-color(#959cb6); + + &:hover, + &.active, + &:active, + &:focus { + background: kt-brand-color(); + color: kt-brand-color(inverse); + + i { + color: kt-brand-color(inverse); + } + + @include kt-svg-icon-color(kt-brand-color(inverse)); + } + } + + // Secondary button + .kt-subheader__btn-secondary { + color: darken(#959cb6, 3%); + + i { + color: darken(#aab1df, 3%); + } + + &:hover, + &.active, + &:active, + &:focus { + background: #eaecf2; + } + } + + // Daterange + .kt-subheader__btn-daterange { + background: darken(#eaecf2, 3%); + + &:hover, + &.active, + &:active, + &:focus { + background: darken(#eaecf2, 6%); + } + } + + // Search + .kt-subheader__search { + .form-control { + background: #eaecf2; + border-color: #eaecf2 !important; + } + } + } +} + +@include kt-tablet-and-mobile { + // Subheader + .kt-subheader { + margin: 2px 0; + + // Main + .kt-subheader__main { + // Mobile Toggler + @include kt-burger-icon-build(kt-subheader__mobile-toggle, kt-get($kt-subheader-config, toggle)); + @include kt-burger-icon-skin(kt-subheader__mobile-toggle, kt-get($kt-subheader-config, toggle, color)); + + .kt-subheader__mobile-toggle { + display: inline-block; + margin-right: 1rem; + } + + // Title + .kt-subheader__title { + padding: 0.5rem 1.25rem 0.5rem 0; + } + + // Breadcrumbs + .kt-subheader__breadcrumbs { + padding: 0.5rem 0; + } + } + + // Toolbar + .kt-subheader__toolbar { + padding: 0.5rem 0; + } + + // Light style + .kt-subheader--transparent & { + background-color: transparent; + } + } +} + +@include kt-mobile { + // Subheader + .kt-subheader { + + // Toolbar + .kt-subheader__toolbar { + padding-top: 0.5rem; + } + } +} diff --git a/src/assets/sass/global/components/layout/mixins/_app.scss b/src/assets/sass/global/components/layout/mixins/_app.scss new file mode 100644 index 0000000..0ee8118 --- /dev/null +++ b/src/assets/sass/global/components/layout/mixins/_app.scss @@ -0,0 +1,32 @@ +// +// App Mixins +// + + + + +// App aside mixins +@mixin kt-app-aside-width($width) { + // Media range 1024px and above(see: $kt-media-breakpoints in sass/theme/_config.scss and sass/themes/core/_mixins.scss) + @include kt-desktop { + width: $width; + } + + // If beliw given width + @include kt-media-below($width + 50px) { + width: $width - 50px; + } +} + +// App aside mixins +@mixin kt-app-detail-width($width) { + // Media range 1024px and above(see: $kt-media-breakpoints in sass/theme/_config.scss and sass/themes/core/_mixins.scss) + @include kt-desktop { + width: $width; + } + + // If beliw given width + @include kt-media-below($width + 50px) { + width: $width - 50px; + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/typography/_badge.scss b/src/assets/sass/global/components/typography/_badge.scss new file mode 100644 index 0000000..61a3f76 --- /dev/null +++ b/src/assets/sass/global/components/typography/_badge.scss @@ -0,0 +1,196 @@ +// +// Badge +// + + + +.kt-badge { + padding: 0; + margin: 0; + display: inline-flex; + justify-content: center; + align-items: center; + height: 18px; + width: 18px; + border-radius: 50%; + font-size: 0.8rem; + + // Font options + &.kt-badge--bold { + font-weight: 500; + } + + &.kt-badge--bolder { + font-weight: 600; + } + + &.kt-badge--boldest { + font-weight: 700; + } + + // Sizing + &.kt-badge--md { + height: 24px; + width: 24px; + font-size: 0.9rem; + } + + &.kt-badge--lg { + height: 35px; + width: 35px; + font-size: 1rem; + } + + &.kt-badge--xl { + height: 50px; + width: 50px; + font-size: 1.1rem; + font-weight: 500; + } + + // Pics + &.kt-badge__pics { + display: flex; + justify-content: flex-start; + align-items: center; + width: 100%; + + .kt-badge__pic { + border-radius: 50%; + width: 2.5rem; + height: 2.5rem; + overflow: hidden; + margin-left: -0.7rem; + border: 1px solid #ffffff; + background-color: #f0f3ff; + color: #a1a8c3; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + font-weight: 500; + position: relative; + + img { + width: 100%; + } + + &.kt-badge__pic--last { + font-size: 1rem; + font-weight: 500; + } + } + } + + // State colors + @each $name, $color in $kt-state-colors { + &.kt-badge--#{$name} { + color: kt-get($color, inverse); + background: kt-get($color, base); + } + + &.kt-badge--outline.kt-badge--#{$name} { + background: transparent; + color: kt-get($color, base); + border: 1px solid kt-get($color, base); + + &.kt-badge--outline-2x { + border: 2px solid kt-get($color, base); + } + } + } + + // State colors + @each $name, $color in $kt-state-colors { + &.kt-badge--unified-#{$name} { + color: kt-get($color, base); + background: rgba(kt-get($color, base), 0.1); + } + } + + // Inline mode + &.kt-badge--inline { + height: auto; + width: auto; + padding: 0.15rem 0.75rem; + + // Sizing + &.kt-badge--md { + padding: 0.8rem 0.6rem; + } + + &.kt-badge--lg { + padding: 0.9rem 0.7rem; + } + + &.kt-badge--xl { + padding: 1rem 0.8rem; + } + + @include kt-rounded { + border-radius: 2px; + } + } + + // Pill mode + &.kt-badge--pill { + border-radius: 2rem; + } + + // Rounded + &.kt-badge--rounded { + border-radius: $kt-border-radius; + } + + // Dot style + &.kt-badge--dot { + display: inline-block; + line-height: 6px; + min-height: 6px; + min-width: 6px; + height: 6px; + width: 6px; + font-size: 0; + vertical-align: middle; + text-align: center; + + &.kt-badge--sm { + line-height: 4px; + min-height: 4px; + min-width: 4px; + height: 4px; + width: 4px; + } + + &.kt-badge--lg { + line-height: 8px; + min-height: 8px; + min-width: 8px; + height: 8px; + width: 8px; + } + + &.kt-badge--xl { + line-height: 10px; + min-height: 10px; + min-width: 10px; + height: 10px; + width: 10px; + } + } + + // Square mode + &.kt-badge--square { + border-radius: 0; + } + + // Elevated mode + &.kt-badge--elevate { + box-shadow: 0px 0px 10px 0px rgba(0,0,0,0.1); + } +} diff --git a/src/assets/sass/global/components/typography/_demo.scss b/src/assets/sass/global/components/typography/_demo.scss new file mode 100644 index 0000000..993ea91 --- /dev/null +++ b/src/assets/sass/global/components/typography/_demo.scss @@ -0,0 +1,82 @@ +// +// Demo +// + + + + +.kt-demo-icon { + margin-bottom: 20px; + display: flex; + align-items: center; + padding: 20px; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + .kt-demo-icon__preview { + display: flex; + padding-right: 20px; + flex: 0 0 40px; + + i { + line-height: 0; + vertical-align: middle; + font-size: 2.5rem !important; + } + } + + .kt-demo-icon__class { + color: kt-base-color(label, 2); + display: flex; + flex-grow: 1; + padding: 0; + font-size: 1rem; + font-weight: 400; + } + + &:hover { + background-color: kt-base-color(grey, 1); + } + + &.kt-demo-icon--overlay { + position: relative; + + svg { + height: 40px; + width: 40px; + } + + .kt-demo-icon__overlay { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + display: flex; + justify-content: center; + align-items: center; + background-color: rgba(#000, 0.05); + transition: all 0.3 ease; + opacity: 0; + + .btn { + margin-right: 10px; + + &:last-child { + margin-right: 0; + } + } + } + + &:hover { + background-color: transparent; + + .kt-demo-icon__overlay { + transition: all 0.3 ease; + opacity: 1; + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/typography/_divider.scss b/src/assets/sass/global/components/typography/_divider.scss new file mode 100644 index 0000000..f911d24 --- /dev/null +++ b/src/assets/sass/global/components/typography/_divider.scss @@ -0,0 +1,37 @@ +// +// Divider +// + +// Base +@mixin kt-divider-base() { + .kt-divider { + display: flex; + justify-content: center; + align-items: center; + + > span { + &:first-child { + width: 100%; + height: 1px; + flex: 1; + background: #EBECF1; + display: inline-block; + } + + &:last-child { + width: 100%; + height: 1px; + flex: 1; + background: #EBECF1; + display: inline-block; + } + + &:not(:first-child):not(:last-child) { + padding: 0 2rem; + } + } + } +} + +// Build +@include kt-divider-base(); \ No newline at end of file diff --git a/src/assets/sass/global/components/typography/_heading.scss b/src/assets/sass/global/components/typography/_heading.scss new file mode 100644 index 0000000..188f4a9 --- /dev/null +++ b/src/assets/sass/global/components/typography/_heading.scss @@ -0,0 +1,81 @@ +// +// Heading +// + + + +.kt-heading { + font-size: 1.3rem; + font-weight: 500; + padding: 0; + margin: 1.75rem 0; + color: kt-base-color(label, 4); + + &.kt-heading--center { + text-align: center; + } + + &.kt-heading--right { + text-align: right; + } + + &.kt-heading--space-sm { + margin-top: 1rem; + margin-bottom: 1rem; + } + + &.kt-heading--space-md { + margin-top: 2rem; + margin-bottom: 2rem; + } + + &.kt-heading--space-lg { + margin-top: 2.5rem; + margin-bottom: 2.5rem; + } + + &.kt-heading--space-xl { + margin-top: 3rem; + margin-bottom: 3rem; + } + + &.kt-heading--sm { + font-size: 1.2rem; + } + + &.kt-heading--md { + font-size: 1.4rem; + } + + &.kt-heading--lg { + font-size: 1.6rem; + } + + &.kt-heading--xl { + font-size: 2rem; + } + + &.kt-heading--xxl { + font-size: 3rem; + } + + &.kt-heading--medium{ + font-weight: 600; + } + &.kt-heading--bold{ + font-weight: 700; + } + &.kt-heading--bolder{ + font-weight: 900; + } + &.kt-heading--thin{ + font-weight: 300; + } + + &.kt-heading--no-top-margin{ + margin-top: 0; + } + &.kt-heading--no-bottok-margin{ + margin-bottom: 0; + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/typography/_link.scss b/src/assets/sass/global/components/typography/_link.scss new file mode 100644 index 0000000..12f7e88 --- /dev/null +++ b/src/assets/sass/global/components/typography/_link.scss @@ -0,0 +1,39 @@ +// +// Link +// + + + + +.kt-link { + text-decoration: none; + position: relative; + display: inline-block; + + &:after { + display: block; + content: ''; + position: absolute; + bottom: 0; + top: 1rem; + left: 0; + width: 0%; + transition: width 0.3s ease; + } + + &:hover { + text-decoration: none !important; + + &:after { + width: 100%; + } + } + + @include kt-link-color(kt-get($kt-font-color, link, default), kt-get($kt-font-color, link, hover)); + + @each $name, $color in $kt-state-colors { + &.kt-link--#{$name} { + @include kt-link-color(kt-get($color, base), darken(kt-get($color, base), 10%)); + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/typography/_section.scss b/src/assets/sass/global/components/typography/_section.scss new file mode 100644 index 0000000..8e440bd --- /dev/null +++ b/src/assets/sass/global/components/typography/_section.scss @@ -0,0 +1,108 @@ +// +// Section +// + + + +.kt-section { + padding: 0; + margin: 0 0 2rem 0; + + &.kt-section--space-sm { + margin-bottom: 1rem; + } + + &.kt-section--space-md { + margin-bottom: 2rem; + } + + &.kt-section--space-lg { + margin-bottom: 2.5rem; + } + + &.kt-section--space-xl { + margin-bottom: 3rem; + } + + .kt-section__heading, + .kt-section__title { + display: block; + font-size: 1.3rem; + font-weight: 500; + padding: 0; + margin: 0 0 1.75rem 0; + color: kt-base-color(label, 4); + + &.kt-section__title-sm { + font-size: 1.1rem; + } + + &.kt-section__title-md { + font-size: 1.4rem; + } + + &.kt-section__title-lg { + font-size: 1.5rem; + } + } + + .kt-section__desc { + display: block; + font-size: 1rem; + font-weight: 400; + padding: 0; + margin: 0 0 1rem 0; + color: kt-base-color(label, 3); + } + + .kt-section__info { + display: block; + font-size: 1rem; + padding: 0; + margin: 0 0 1rem 0; + color: kt-base-color(label, 3); + } + + .kt-section__content { + display: block; + padding: 0; + margin: 0; + + &.kt-section__content--border { + padding: 1.5rem; + border: 3px solid kt-base-color(grey, 2); + + @include kt-rounded { + border-radius: $kt-border-radius; + } + } + + &.kt-section__content--solid { + padding: 1.5rem; + border-left: 4px solid kt-base-color(grey, 3); + background-color: kt-base-color(grey, 1); + + @include kt-rounded { + border-radius-top-left: $kt-border-radius; + border-radius-top-right: $kt-border-radius; + } + } + + &.kt-section__content--x-fit { + padding-left: 0; + padding-right: 0; + } + + &.kt-section__content--fit { + padding: 0; + } + } + + &.kt-section--last { + margin-bottom: 0; + } + + &.kt-section--first { + margin-top: 0; + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/typography/_separator.scss b/src/assets/sass/global/components/typography/_separator.scss new file mode 100644 index 0000000..07fb090 --- /dev/null +++ b/src/assets/sass/global/components/typography/_separator.scss @@ -0,0 +1,64 @@ +// +// Separator +// + + + + +.kt-separator { + height: 0; + margin: 20px 0; + border-bottom: 1px solid kt-base-color(grey, 2); + + // Dashed style + &.kt-separator--border-dashed, + &.kt-separator--dashed { + border-bottom: 1px dashed kt-base-color(grey, 2); + } + + &.kt-separator--border-2x { + border-bottom-width: 2px; + } + + // No border + &.kt-separator--space { + border-bottom: 0; + } + + // Sizing + &.kt-separator--space-sm, + &.kt-separator--sm { + margin: 0.5rem 0; + } + + &.kt-separator--space-md, + &.kt-separator--md { + margin: 2rem 0; + } + + &.kt-separator--space-lg, + &.kt-separator--lg { + margin: 2.5rem 0; + } + + &.kt-separator--space-xl, + &.kt-separator--xl { + margin: 3rem 0; + } + + &.kt-separator--fit { + margin-left: -(kt-get($kt-portlet, space, desktop)); + margin-right: -(kt-get($kt-portlet, space, desktop)); + } + + // States + @each $name, $color in $kt-state-colors { + &.kt-separator--#{$name} { + border-bottom: 1px solid kt-get($color, base); + + &.kt-separator--dashed { + border-bottom: 1px dashed kt-get($color, base); + } + } + } +} diff --git a/src/assets/sass/global/components/typography/_svg-icon.scss b/src/assets/sass/global/components/typography/_svg-icon.scss new file mode 100644 index 0000000..dfb36cf --- /dev/null +++ b/src/assets/sass/global/components/typography/_svg-icon.scss @@ -0,0 +1,48 @@ +// +// SVG Icon +// + + + +// Base +.kt-svg-icon { + height: 23px; + width: 23px; + + g { + [fill] { + fill: kt-brand-color(); + } + } + + @each $name, $color in $kt-state-colors { + &.kt-svg-icon--#{$name} { + g { + [fill] { + fill: kt-get($color, base) !important; + } + } + } + } + + // Sizing + &.kt-svg-icon--sm { + height: 20px; + width: 20px; + } + + &.kt-svg-icon--md { + height: 30px; + width: 30px; + } + + &.kt-svg-icon--lg { + height: 40px; + width: 40px; + } + + &.kt-svg-icon--xl { + height: 50px; + width: 50px; + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/typography/mixins/_link.scss b/src/assets/sass/global/components/typography/mixins/_link.scss new file mode 100644 index 0000000..fbfca08 --- /dev/null +++ b/src/assets/sass/global/components/typography/mixins/_link.scss @@ -0,0 +1,18 @@ +// +// Link Mixins +// + + + +@mixin kt-link-color($default, $hover) { + color: $default; + + &:hover { + color: $hover; + + &:after { + border-bottom: 1px solid $hover; + opacity: 0.3; + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget1.scss b/src/assets/sass/global/components/widgets/dashboard/_widget1.scss new file mode 100644 index 0000000..44e1ef3 --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget1.scss @@ -0,0 +1,65 @@ +// +// Widget 1 +// + + + + +.kt-widget1 { + padding: kt-get($kt-portlet, space, desktop); + + &.kt-widget1--fit { + padding: 0; + } + + &.kt-widget1--paddingless { + padding: 0; + } + + .kt-widget1__item { + padding: 1.1rem 0; + display: flex; + justify-content: space-between; + align-items: center; + + &:last-child { + padding-bottom: 0; + } + + &:first-child { + padding-top: 0; + } + + .kt-widget1__info { + .kt-widget1__title { + font-size: 1.1rem; + font-weight: 500; + color: kt-base-color(label, 3); + } + + .kt-widget1__desc { + font-size: 1rem; + font-weight: normal; + color: kt-base-color(label, 2); + } + } + + .kt-widget1__number { + font-size: 1.4rem; + font-weight: 600; + color: kt-base-color(label, 2); + } + + &:last-child { + border-bottom: 0; + } + + border-bottom: 0.07rem dashed kt-base-color(grey, 2); + } +} + +@include kt-tablet-and-mobile { + .kt-widget1 { + padding: kt-get($kt-portlet, space, mobile); + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget10.scss b/src/assets/sass/global/components/widgets/dashboard/_widget10.scss new file mode 100644 index 0000000..78d595d --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget10.scss @@ -0,0 +1,56 @@ +// +// Widget10 +// + + + + +.kt-widget10 { + // Chart + .kt-widget10__chart { + margin-top: 1rem; + margin-bottom: 3.5rem; + position: relative; + + canvas { + @include kt-rounded { + border-radius: 8px; + } + } + } + + // Items + .kt-widget10__items { + // Item + .kt-widget10__item { + // Stats + .kt-widget10__stats { + font-size: 1.1rem; + font-weight: 700; + color: kt-base-color(label, 2); + } + + // Text + .kt-widget10__text { + font-size: 0.9rem; + float: right; + margin-top: 0.3rem; + color: kt-base-color(label, 2); + } + + // Progress + .progress { + margin-bottom: 1.6rem; + } + } + } + // Description + .kt-widget10__desc { + margin-top: 1.6rem; + font-size: 1rem; + } +} + + + + \ No newline at end of file diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget11.scss b/src/assets/sass/global/components/widgets/dashboard/_widget11.scss new file mode 100644 index 0000000..beb9c83 --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget11.scss @@ -0,0 +1,86 @@ +// +// Widget11 +// + + + + +.kt-widget11 { + .table-responsive { + overflow-y: hidden; + } + + // Table + .table { + // Thead + thead { + > tr { + > td { + padding: 0; + vertical-align: top; + border-top: 0; + font-weight: 500; + color: kt-base-color(label, 2); + } + } + } + + // Tbody + tbody { + > tr { + > td { + border: 0; + padding-left: 0; + padding-right: 0.5rem; + padding-top: 20px; + vertical-align: top; + color: kt-base-color(label, 3); + + > label { + right: 0; + top: 0.5rem; + vertical-align: top; + } + + .kt-widget11__chart { + position: relative; + margin-top: -0.6rem; + } + + &:last-child { + padding-right: 0; + } + } + + .kt-widget11__title { + font-size: 1.1rem; + font-weight: 500; + display: block; + color: kt-base-color(label, 3); + transition: color .3s ease; + + &:hover { + color: kt-brand-color(); + transition: color .3s ease; + } + + > span { + color: kt-base-color(label, 2); + } + } + + .kt-widget11__sub { + display: block; + font-size: 1rem; + } + + border-bottom: 1px dashed kt-base-color(grey, 2); + + &:last-child { + border: 0; + } + } + } + } +} + \ No newline at end of file diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget12.scss b/src/assets/sass/global/components/widgets/dashboard/_widget12.scss new file mode 100644 index 0000000..383fd11 --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget12.scss @@ -0,0 +1,74 @@ +// +// Widget 12 +// + + + +.kt-widget12 { + display: flex; + flex-direction: column; + height: 100%; + width: 100%; + + .kt-widget12__content { + display: flex; + padding-bottom: 1rem; + flex-grow: 1; + display: flex; + flex-direction: column; + + .kt-widget12__item { + display: flex; + margin-bottom: 2.5rem; + align-items: center; + + .kt-widget12__info { + flex: 1; + + .kt-widget12__desc { + font-size: 1rem; + color: kt-base-color(label, 2); + padding-bottom: 0.5rem; + font-weight: 500; + display: block; + } + + .kt-widget12__value { + font-size: 1.4rem; + font-weight: 600; + color: kt-base-color(label, 3); + display: block; + } + + .kt-widget12__progress { + display: flex; + justify-content: space-between; + align-items: center; + line-height: 0; + padding-top: 1rem; + + .progress { + width: 100%; + height: 0.6rem + } + + .kt-widget12__stat { + font-size: 1.3rem; + font-weight: 700; + color: kt-base-color(label, 2); + padding-left: 1rem; + } + } + } + } + } + + .kt-widget12__chart { + position: relative; + + canvas { + border-bottom-left-radius: $kt-border-radius; + border-bottom-right-radius: $kt-border-radius; + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget13.scss b/src/assets/sass/global/components/widgets/dashboard/_widget13.scss new file mode 100644 index 0000000..4b2e2a4 --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget13.scss @@ -0,0 +1,57 @@ +// +// Widget13 +// + + + + +.kt-widget13 { + padding: 2rem 0; + + .kt-widget13__item { + display: flex; + align-items: center; + margin-bottom: 2rem; + + .kt-widget13__desc { + color: kt-base-color(label, 2); + text-align: right; + padding-right: 1rem; + font-weight: 400; + } + + .kt-widget13__text { + color: kt-base-color(label, 2); + padding-left: 1rem; + font-weight: 400; + + &.kt-widget13__text--bold { + color: kt-base-color(label, 3); + font-size: 1.2rem; + font-weight: 500; + } + } + + > span { + flex: 1; + } + + &:lasst-child { + margin-bottom: 0; + } + } + + .kt-widget13__action { + margin-top: 30px; + padding-top: 30px; + + .kt-widget__detalis { + margin-right: 10px; + border-top: 0.07rem dashed kt-base-color(grey, 2); + } + + .kt-widget13__action { + border-top: 0.07rem dashed kt-base-color(grey, 2); + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget14.scss b/src/assets/sass/global/components/widgets/dashboard/_widget14.scss new file mode 100644 index 0000000..797938d --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget14.scss @@ -0,0 +1,98 @@ +// +// Widget14 +// + + + + +.kt-widget14 { + padding: kt-get($kt-portlet, space, desktop); + + &.kt-widget14--no-padding { + padding: 0; + } + + .kt-widget14__header { + padding: 0.5rem 0 1.1rem 0; + margin-bottom: 0.5rem; + + .kt-widget14__title { + font-size: 1.3rem; + font-weight: 500; + margin-bottom: 0; + color: kt-base-color(label, 3); + } + + .kt-widget14__desc { + display: inline-block; + margin-top: 0.2rem; + color: kt-base-color(label, 2); + } + } + + .kt-widget14__content { + display: flex; + align-items: center; + } + + .kt-widget14__legends { + padding-left: 2rem; + flex-grow: 1; + + .kt-widget14__legend { + display: flex; + align-items: center; + + .kt-widget14__bullet { + width: 1.5rem; + height: 0.45rem; + border-radius: 1.1rem; + } + + .kt-widget14__stats { + color: kt-base-color(label, 2); + font-weight: 500; + flex: 1; + padding-left: 1rem; + } + + &:not(:first-child):not(:last-child) { + padding: 0.5rem 0; + } + } + } + + .kt-widget14__chart { + position: relative; + + .kt-widget14__stat { + display: flex; + justify-content: center; + align-items: center; + position: absolute; + left: 0; + right: 0; + bottom: 0; + top: 0; + font-size: 2.2rem; + font-weight: 500; + color: kt-base-color(label, 1); + opacity: 0.7; + } + + canvas { + position: relative; + z-index: 1; + } + } +} + +@include kt-tablet-and-mobile { + .kt-widget14 { + padding: kt-get($kt-portlet, space, mobile); + + .kt-widget14__legends { + padding-left: 0.5rem; + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget15.scss b/src/assets/sass/global/components/widgets/dashboard/_widget15.scss new file mode 100644 index 0000000..c2b1e1a --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget15.scss @@ -0,0 +1,64 @@ +// +// Widget15 +// + + + + +.kt-widget15 { + display: flex; + flex-direction: column; + height: 100%; + width: 100%; + + // Items + .kt-widget15__items { + flex-grow: 1; + + &.kt-widget15__items--bottom { + display: flex; + flex-direction: column; + justify-content: flex-end; + } + + // Item + .kt-widget15__item { + // Stats + .kt-widget15__stats { + font-size: 1.1rem; + font-weight: 500; + color: kt-base-color(label, 2); + } + + // Text + .kt-widget15__text { + font-size: 1rem; + float: right; + margin-top: 0.3rem; + font-weight: 400; + color: kt-base-color(label, 2); + } + + // Progress + .progress { + margin-bottom: 1.6rem; + height: 0.45rem + } + } + + // Description + .kt-widget15__desc { + margin-top: 0.5rem; + font-size: 0.9rem; + font-weight: 400; + color: kt-base-color(label, 2); + } + } + + .kt-widget4__chart { + } + + .kt-widget15__map { + + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget16.scss b/src/assets/sass/global/components/widgets/dashboard/_widget16.scss new file mode 100644 index 0000000..bfb1dd8 --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget16.scss @@ -0,0 +1,141 @@ +// +// Widget16 +// + + + + +.kt-widget16 { + display: flex; + + .kt-widget16__items { + flex: 1; + padding-right: 1rem; + width: 50%; + + .kt-widget16__item { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.7rem 0; + + .kt-widget16__sceduled { + font-weight: 500; + color: kt-base-color(label, 2); + font-size: 1rem; + } + + .kt-widget16__amount { + font-size: 1rem; + font-weight: 500; + color:kt-base-color(label, 2); + text-align: right; + } + + .kt-widget16__date { + font-size: 1rem; + font-weight: 300; + color: kt-base-color(label, 2); + } + + .kt-widget16__price { + font-size: 1rem; + font-weight: 500; + text-align: right; + } + + border-bottom: 1px dashed kt-base-color(grey, 2); + + &:last-child { + border-bottom: 0; + } + } + } + + .kt-widget16__stats { + display: flex; + align-items: center; + flex: 1; + padding-left: 1rem; + width: 50%; + + .kt-widget16__legends { + font-weight: 1; + padding-left: 2rem; + + .kt-widget16__legend { + .kt-widget16__bullet { + width: 1.5rem; + height: 0.45rem; + display: inline-block; + border-radius: 1.1rem; + margin: 0 1rem 0.1rem 0; + } + + .kt-widget16__stat { + display: inline-block; + color: kt-base-color(label, 2); + font-weight: 500; + } + + &:not(:first-child):not(:last-child) { + padding: 0.5rem 0; + } + } + + &:last-child { + margin-bottom: 0; + } + } + + .kt-widget16__visual { + .kt-widget16__chart { + margin-top: 0.5rem; + position: relative; + display: flex; + justify-content: center; + align-items: center; + flex: 1; + + .kt-widget16__stat { + display: flex; + justify-content: center; + align-items: center; + position: absolute; + left: 0; + right: 0; + bottom: 0; + top: 0; + font-size: 2.2rem; + font-weight: 500; + color: kt-base-color(label, 1); + } + + canvas { + position: relative; + z-index: 1; + } + } + } + } +} + + +@include kt-mobile { + .kt-widget16 { + display: flex; + flex-direction: column; + + .kt-widget16__items { + width: 100%; + } + + .kt-widget16__stats { + width: 100%; + + .kt-widget16__legends { + padding-left: 1rem; + } + } + } +} diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget17.scss b/src/assets/sass/global/components/widgets/dashboard/_widget17.scss new file mode 100644 index 0000000..2cf515c --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget17.scss @@ -0,0 +1,89 @@ +// +// Widget 17 +// + + + + +.kt-widget17 { + .kt-widget17__visual { + @include kt-rounded { + border-top-left-radius: $kt-border-radius; + border-top-right-radius: $kt-border-radius; + } + + .kt-widget17__chart { + position: relative; + padding-top: 8rem; + } + } + + .kt-widget17__stats { + display: column; + margin: -4.3rem auto 0 auto; + position: relative; + width: 90%; + + + // Items + .kt-widget17__items { + display: flex; + + .kt-widget17__item { + padding: 2rem; + flex: 1; + overflow: hidden; + background-color: white; + margin: 0.3rem; + box-shadow: 0px 1px 15px 1px rgba(69,65,78,0.06); + cursor: pointer; + transition: all 0.3s ease; + + .kt-widget17__icon { + display: block; + + > i { + font-size: 2.6rem; + } + + svg { + margin-left: -4px; + width: 38px; + height: 38px; + } + } + + .kt-widget17__subtitle { + display: block; + margin-top: 0.75rem; + font-size: 1.2rem; + font-weight: 500; + color: kt-base-color(label, 3); + } + + .kt-widget17__desc { + display: block; + font-size: 1rem; + color: kt-base-color(label, 2); + } + + &:hover { + transition: all 0.3s ease; + box-shadow: 0px 1px 21px 1px rgba(69,65,78,0.12); + } + } + } + } +} + +@include kt-mobile { + .kt-widget17 { + .kt-widget17__stats { + .kt-widget17__items { + .kt-widget17__item { + padding-left: 0.5rem; + } + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget19.scss b/src/assets/sass/global/components/widgets/dashboard/_widget19.scss new file mode 100644 index 0000000..b0dca6f --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget19.scss @@ -0,0 +1,135 @@ +// +// Widget19 +// + + + + +.kt-widget19 { + .kt-widget19__pic { + @include kt-rounded { + border-top-left-radius: $kt-border-radius; + border-top-right-radius: $kt-border-radius; + } + + position: relative; + background-repeat: no-repeat; + background-size: cover; + + > img { + width: 100%; + } + + .kt-widget19__shadow { + position: absolute; + top: 70%; + bottom: 0; + left: 0; + right: 0; + background: linear-gradient(to bottom, rgba(0, 0, 0, 0) 20%, rgba(0, 0, 0, .1) 40%, rgba(0, 0, 0, .5) 90%) no-repeat scroll 0 0; + } + + .kt-widget19__title { + position: absolute; + bottom: 0; + display: block; + z-index: 1; + padding-left: kt-get($kt-portlet, space, desktop); + padding-bottom: kt-get($kt-portlet, space, desktop) / 2; + color: kt-base-color(label, 3); + } + + .kt-widget19__labels { + position: absolute; + top: kt-get($kt-portlet, space, desktop); + left: kt-get($kt-portlet, space, desktop); + } + + @include kt-tablet-and-mobile { + .kt-widget19__labels { + top: kt-get($kt-portlet, space, mobile); + left: kt-get($kt-portlet, space, mobile); + } + } + } + + .kt-widget19__wrapper { + margin-bottom: 1rem; + + .kt-widget19__content { + display: flex; + justify-content: space-between; + align-items: center; + margin: 0 0 1.75rem 0; + + .kt-widget19__userpic { + > img { + width: 3.2rem; + border-radius: 100%; + } + } + + .kt-widget19__info { + padding-left: 1rem; + flex-grow: 1; + display: flex; + flex-direction: column; + + .kt-widget19__username { + font-size: 1.1rem; + font-weight: 500; + color: kt-base-color(label, 3); + transition: color 0.3s ease; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + + .kt-widget19__time { + font-size: 1rem; + font-weight: 400; + color: kt-base-color(label, 2); + } + } + + .kt-widget19__stats{ + font-size: 1rem; + font-weight: 500; + + .kt-widget19__number { + font-size: 1.4rem; + font-weight: 700; + } + + .kt-widget19__comment { + font-size: 0.9rem; + color: kt-base-color(label, 2); + transition: color 0.3s ease; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + + span { + text-align: center; + display: block; + } + } + } + + .kt-widget19__text { + text-align: justify; + color: kt-base-color(label, 2); + font-size: 1.1rem; + font-weight: 400; + } + } + + .kt-widget19__action { + margin-top: 1.5rem; + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget2.scss b/src/assets/sass/global/components/widgets/dashboard/_widget2.scss new file mode 100644 index 0000000..0e03976 --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget2.scss @@ -0,0 +1,98 @@ +// +// Widget2 +// + + + + +.kt-widget2 { + .kt-widget2__item { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1.4rem; + position: relative; + + // state bar + &:before { + position: absolute; + display: block; + width: 0.3rem; + border-radius: 4px; + width: 4px; + border-radius: 4px; + height: 100%; + left: 0.8rem; + content: ""; + } + + // checkbox + .kt-widget2__checkbox { + padding: 1rem 0 0 2.2rem; + } + + // description text + .kt-widget2__info { + display: flex; + flex-direction: column; + padding-left: 0.23rem 0 0 0.3rem; + + .kt-widget2__title { + font-weight: 500; + margin: 0; + color: kt-base-color(label, 3); + transition: color 0.3s ease; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + + .kt-widget2__username { + text-decoration: none; + font-size: 0.9rem; + color: kt-base-color(label, 2); + transition: color 0.3s ease; + + &:hover { + text-decoration: none; + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + } + + // actions + .kt-widget2__actions { + flex-grow: 1; + text-align: right; + padding: 0 0.5rem 0 0.8rem; + + a { + text-decoration: none; + } + + i { + font-size: 2.1rem; + } + } + + // kt-widget2__action hover + &:hover { + .kt-widget2__actions { + //opacity: 1; + } + } + + @each $name, $color in $kt-state-colors { + &.kt-widget2__item--#{$name} { + &:before { + background: kt-get($color, base); + } + } + } + } +} + + diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget20.scss b/src/assets/sass/global/components/widgets/dashboard/_widget20.scss new file mode 100644 index 0000000..b278e06 --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget20.scss @@ -0,0 +1,43 @@ +// +// Widget 20 +// + + + + +.kt-widget20 { + display: flex; + flex-direction: column; + height: 100%; + width: 100%; + + .kt-widget20__content { + display: flex; + padding-top: 1.15rem; + padding-bottom: 1.25rem; + flex-grow: 1; + display: flex; + flex-direction: column; + + .kt-widget20__desc { + color: kt-base-color(label, 2); + font-size: 1rem; + font-weight: 400; + margin-top: 0.25rem; + } + + .kt-widget20__number { + flex-grow: 1; + font-weight: 600; + font-size: 1.8rem; + } + } + + .kt-widget20__chart { + position: relative; + canvas { + border-bottom-left-radius: $kt-border-radius; + border-bottom-right-radius: $kt-border-radius; + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget21.scss b/src/assets/sass/global/components/widgets/dashboard/_widget21.scss new file mode 100644 index 0000000..a38b77c --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget21.scss @@ -0,0 +1,84 @@ +// +// Widget21 +// + + + + +.kt-widget21 { + display: flex; + flex-direction: column; + height: 100%; + width: 100%; + + .kt-widget21__content { + display: flex; + padding-top: 1.15rem; + padding-bottom: 1.25rem; + flex-grow: 1; + display: flex; + + .kt-widget21__item { + display: flex; + align-items: center; + flex: 1; + padding-left: 2rem; + margin-top: 1.5rem; + + .kt-widget21__icon { + display: flex; + justify-content: center; + align-items: center; + width: 40px; + height: 40px; + border-radius: 50%; + + i { + font-size: 1.4rem; + } + } + + .kt-widget21__info { + padding-left: 1rem; + flex: 1; + + .kt-widget21__title { + display: block; + font-size: 1.1rem; + font-weight: 500; + color: kt-base-color(label, 3); + } + + .kt-widget21__sub { + display: block; + font-size: 1rem; + color: kt-base-color(label, 2); + } + } + } + } + + .kt-widget21__chart { + position: relative; + + canvas { + border-bottom-left-radius: $kt-border-radius; + border-bottom-right-radius: $kt-border-radius; + } + } +} + +@include kt-mobile { + .kt-widget21 { + .kt-widget21__content { + .kt-widget21__item { + padding-left: 0; + margin-top: 0.5rem; + + .kt-widget21__info { + padding-left: 0.5rem; + } + } + } + } +} diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget24.scss b/src/assets/sass/global/components/widgets/dashboard/_widget24.scss new file mode 100644 index 0000000..4e40e2a --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget24.scss @@ -0,0 +1,79 @@ +// +// Widget24 +// + + + + +.kt-widget24 { + padding: kt-get($kt-portlet, space, desktop); + flex: 1; + + .kt-widget24__details { + display: flex; + justify-content: space-between; + align-items: center; + + .kt-widget24__info { + .kt-widget24__title { + display: flex; + font-size: 1.1rem; + font-weight: 500; + color: kt-base-color(label, 3); + transition: color 0.3s ease; + + &:hover { + transition: color 0.3s ease; + color: kt-brand-color(); + } + } + + .kt-widget24__desc { + color: kt-base-color(label, 2); + font-weight: 400; + } + } + + .kt-widget24__stats { + font-size: 1.75rem; + font-weight: 500; + padding-left: 0.5rem; + } + } + + .progress { + height: 0.5rem; + margin: 2rem 0 0.5rem 0; + } + + .kt-widget24__action { + display: flex; + justify-content: space-between; + font-weight: 400; + + .kt-widget24__change { + color: kt-base-color(label, 2); + } + + .kt-widget24__number { + color: kt-base-color(label, 2); + } + } + + // solid bg + &.kt-widget24--solid { + border: 1px solid kt-base-color(grey, 2); + padding: 1rem; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + } +} + + +@include kt-tablet-and-mobile { + .kt-widget24 { + padding: kt-get($kt-portlet, space, mobile); + } +} diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget25.scss b/src/assets/sass/global/components/widgets/dashboard/_widget25.scss new file mode 100644 index 0000000..fdb3d8f --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget25.scss @@ -0,0 +1,62 @@ +// +// Widget25 +// + + + + +.kt-widget25 { + margin: 2rem 0; + + .kt-widget25__stats { + font-size: 4.5rem; + font-weight: 500; + color: kt-base-color(label, 3); + } + + .kt-widget25__subtitle { + color: kt-base-color(label, 2); + font-size: 1.1rem; + padding-left: 1rem; + } + + .kt-widget25__items { + display: flex; + align-items: center; + margin-top: 2rem; + + .kt-widget25__item { + flex: 1; + + .kt-widget25__progress-sub { + display: inline-block; + margin-top: 6px; + font-size: 1.1rem; + font-weight: 500; + } + + .kt-widget25__number { + font-size: 2rem; + font-weight: 600; + } + + .progress { + height: 0.5rem; + } + + .kt-widget25__desc { + font-size: 1.1rem; + font-weight: 500; + color: kt-base-color(label, 2); + padding-top: 0.7rem; + display: block; + } + + &:not(:first-child):not(:last-child) { + margin: 0 2rem; + } + } + } +} + + \ No newline at end of file diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget26.scss b/src/assets/sass/global/components/widgets/dashboard/_widget26.scss new file mode 100644 index 0000000..0be4c72 --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget26.scss @@ -0,0 +1,42 @@ +// +// Widget 26 +// + + + + +.kt-widget26 { + display: flex; + flex-direction: column; + height: 100%; + width: 100%; + + .kt-widget26__content { + display: flex; + padding-bottom: 1rem; + flex-grow: 1; + display: flex; + flex-direction: column; + + .kt-widget26__number { + font-weight: 600; + font-size: 1.8rem; + } + + .kt-widget26__desc { + color: kt-base-color(label, 2); + font-size: 1.1rem; + font-weight: 400; + margin-top: 0.55rem; + } + } + + .kt-widget26__chart { + position: relative; + + canvas { + border-bottom-left-radius: $kt-border-radius; + border-bottom-right-radius: $kt-border-radius; + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget27.scss b/src/assets/sass/global/components/widgets/dashboard/_widget27.scss new file mode 100644 index 0000000..8906adb --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget27.scss @@ -0,0 +1,182 @@ +// +// Widget27 +// + + + + +.kt-widget27 { + @include kt-rounded { + border-top-left-radius: $kt-border-radius; + border-top-right-radius: $kt-border-radius; + } + + .kt-widget27__visual { + position: relative; + + @include kt-rounded { + border-top-left-radius: $kt-border-radius; + border-top-right-radius: $kt-border-radius; + } + + > img { + width: 100%; + height: 286px; + + @include kt-rounded { + border-top-left-radius: $kt-border-radius; + border-top-right-radius: $kt-border-radius; + } + } + + .kt-widget27__title { + position: absolute; + left: 50%; + top: 60%; + transform: translate(-50%, -50%); + display: block; + z-index: 1; + color:#ffffff; + + > span { + font-size: 4.5rem; + + > span { + font-size: 2.5rem; + padding-right: 0.4rem; + } + } + } + + .kt-widget27__btn { + .btn { + position: absolute; + left: 50%; + top: 100%; + transform: translate(-50%, -50%); + z-index: 1; + display: block; + padding: 1rem 2.5rem; + + &:hover, + &:focus, + &:active { + background-color: #fff; + } + } + } + } + + .kt-widget27__container { + margin: 3rem 0; + width: 100%; + padding: 1rem 0.5rem 0 0.5rem; + + @include kt-rounded { + border-top-left-radius: $kt-border-radius; + border-top-right-radius: $kt-border-radius; + } + + .nav { + display: table; + width: 100%; + table-layout: fixed; + border-spacing: 0.7rem; + + .nav-item { + display: table-cell; + + > a { + text-align: center; + font-weight: 600; + padding: 0.8rem 0 0.8rem 0; + color: kt-base-color(label, 2); + border: 1px solid kt-base-color(grey, 1); + + &.active { + background-color: kt-brand-color(); + border-color: kt-brand-color() !important; + color: kt-brand-color(inverse); + } + } + } + } + + .tab-content { + padding: 0 1rem; + + // widget header + .kt-widget27__header { + padding: 1.1rem 0; + margin-bottom: 0.5rem; + + .kt-widget27__title { + font-size: 1.3rem; + font-weight: 500; + margin-bottom: 0; + } + + .kt-widget27__desc { + display: inline-block; + margin-top: 0.2rem; + } + } + + .kt-widget27__legends { + // widget legend + .kt-widget27__legend { + margin-bottom: 0.9rem; + + &:last-child { + margin-bottom: 0; + } + + .kt-widget27__stats { + color: kt-base-color(label, 2); + display: inline-block; + font-weight: 500; + } + + .kt-widget27__bullet { + width: 1.5rem; + height: 0.45rem; + display: inline-block; + border-radius: 1.1rem; + margin: 0 1rem 0.1rem 0; + } + } + } + + .kt-widget27__chart { + position: relative; + display: flex; + justify-content: center; + align-items: center; + height: 110px; + flex: 1; + + .kt-widget27__stat { + display: flex; + justify-content: center; + align-items: center; + position: absolute; + left: 0; + right: 0; + bottom: 0; + top: 0; + font-size: 2.2rem; + font-weight: 500; + color: kt-base-color(label, 2); + } + + canvas { + position: relative; + z-index: 1; + } + } + } + } +} + + + \ No newline at end of file diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget28.scss b/src/assets/sass/global/components/widgets/dashboard/_widget28.scss new file mode 100644 index 0000000..0dc5013 --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget28.scss @@ -0,0 +1,134 @@ +// +// Widget28 +// + + + + +.kt-widget28 { + .kt-widget28__visual { + position: relative; + min-height: 286px; + background-repeat: no-repeat; + background-size: cover; + + @include kt-rounded { + border-top-left-radius: $kt-border-radius; + border-top-right-radius: $kt-border-radius; + } + } + + .kt-widget28__wrapper { + width: 100%; + + .nav { + display: table; + width: 100%; + table-layout: fixed; + border-spacing: 1.2rem; + margin-top: -8rem; + position: absolute; + left: 50%; + transform: translate(-50%, -50%); + padding: 0 1rem; + + .nav-item { + display: table-cell; + + > a { + text-align: center; + padding: 1rem 0 1rem 0; + border: 1px solid rgba(#fff, 0); + + > span { + display: block; + color: rgba(#fff, 0.7); + transition: color 0.3s ease; + + > i { + font-size: 2.2rem; + margin-right: 0; + padding-bottom: 1rem; + padding-top: 0.4rem; + } + + &:last-child { + font-weight: 400; + font-size: 1rem; + } + } + + &.active { + border: 1px solid rgba(#fff, 1); + background-color: transparent; + + > span { + color: #fff; + transition: color 0.3s ease; + + > i { + color: #fff; + transition: color 0.3s ease; + } + } + } + + &:focus, + &:active, + &:hover { + background-color: transparent; + + > span { + color: #fff; + transition: color 0.3s ease; + + > i { + color: #fff; + transition: color 0.3s ease; + } + } + } + } + } + } + + .tab-content { + margin-top: 2rem; + + .tab-pane { + .kt-widget28__tab-items { + .kt-widget28__tab-item { + margin-top: 1.2rem; + + > span { + display: block; + + &:first-child { + font-size: 1rem; + font-weight: 400; + color: kt-base-color(label, 2); + } + + &:last-child { + color: kt-base-color(label, 3); + font-size: 1.1rem; + font-weight: 500; + margin-bottom: 1rem; + } + } + + &:first-child { + margin-top: 0; + } + + border-bottom: 1px solid kt-base-color(grey, 2); + + &:last-child { + border-bottom: none; + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget29.scss b/src/assets/sass/global/components/widgets/dashboard/_widget29.scss new file mode 100644 index 0000000..0ae5357 --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget29.scss @@ -0,0 +1,75 @@ +// +// Widget29 +// + + + + +.kt-widget29 { + margin-top: 1rem; + + .kt-widget29__content { + margin-bottom: 1.25rem; + padding: 2rem; + background-color: #fff; + + .kt-widget29__title { + font-size: 1.1rem; + font-weight: 500; + color: kt-base-color(label, 3); + } + + .kt-widget29__item { + display: flex; + + .kt-widget29__info { + flex: 1; + text-align: left; + + .kt-widget29__subtitle { + display: block; + color: kt-base-color(label, 2); + font-weight: 400; + font-size: 1rem; + padding: 0.25rem 0; + } + + .kt-widget29__stats { + display: block; + font-size: 1.2rem; + font-weight: 500; + } + } + } + + &:last-child { + margin-bottom: 0; + } + } + + .kt-widget29__actions { + margin-top: 1.5rem; + padding: 0rem; + } +} + + +@include kt-mobile { + .kt-widget29 { + .kt-widget29__content { + padding: 2.2rem 1rem; + + .kt-widget29__item { + .kt-widget29__info { + > span { + padding-right: 1rem; + + &:last-child { + padding-right: 0; + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget3.scss b/src/assets/sass/global/components/widgets/dashboard/_widget3.scss new file mode 100644 index 0000000..2d10d5c --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget3.scss @@ -0,0 +1,77 @@ +// +// Widget3 +// + + + + +.kt-widget3 { + + // widjet header + .kt-widget3__item { + margin-bottom: 1rem; + + .kt-widget3__header { + margin-top: 1.5rem; + padding-bottom: 0.8rem; + display: flex; + justify-content: space-between; + align-items: center; + + .kt-widget3__user-img { + .kt-widget3__img { + width: 3.2rem; + border-radius: 50%; + } + } + + // widget info + .kt-widget3__info { + padding-left: 1rem; + + .kt-widget3__username { + font-weight: 500; + color: kt-base-color(label, 3); + transition: color 0.3s ease; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + + .kt-widget3__time { + font-size: 0.9rem; + font-weight: 400; + color: kt-base-color(label, 2); + } + + } + + // widget status + .kt-widget3__status{ + font-weight: 500; + flex-grow: 1; + text-align: right; + } + } + + // widget body + .kt-widget3__body { + .kt-widget3__text { + color: kt-base-color(label, 2); + } + } + + border-bottom: 0.07rem dashed kt-base-color(grey, 2); + + &:last-child { + border-bottom: 0; + } + + &:first-child .kt-widget3__header { + margin-top: 0; + } + } +} + diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget30.scss b/src/assets/sass/global/components/widgets/dashboard/_widget30.scss new file mode 100644 index 0000000..e9955dc --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget30.scss @@ -0,0 +1,134 @@ +// +// Widget30 +// + + + + +.kt-widget30 { + margin: 1.5rem 0; + + .kt-widget30__head { + padding: 0; + max-width: 100%; + margin: 0 auto 2rem auto; + + .owl-carousel { + .carousel { + cursor: pointer; + text-align: center; + padding: 1rem 0; + margin: 1rem 1rem; + box-shadow: 0px 2px 14px 2px rgba(#000, 0.04); + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + > span { + display: block; + + &:first-child { + font-size: 1.1rem; + font-weight: 500; + color: kt-base-color(label, 3); + } + + &:last-child { + font-size: 0.9rem; + font-weight: 400; + color: kt-base-color(label, 2); + } + } + } + + .center > div { + cursor: auto; + background-color: kt-brand-color(); + box-shadow: 0px 2px 14px 2px rgba(kt-brand-color(), 0.2); + + > span { + &:first-child { + color: kt-brand-color(inverse); + } + + &:last-child { + color: rgba(kt-brand-color(inverse), 0.7); + } + } + } + } + } + + .kt-widget30__body { + .owl-carousel { + .kt-widget30__items { + padding: 0 2.2rem; + border-bottom: 1px dashed kt-base-color(grey, 2); + + .kt-widget30__item { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1.5rem; + padding-bottom: 1.5rem; + + .kt-widget30__pic { + > img { + width: 3rem; + height: 3rem; + border-radius: 100%; + } + } + + .kt-widget30__info { + width: 100%; + text-align: left; + padding: 0 1rem; + font-weight: 500; + color: kt-base-color(label, 2); + + > a { + display: block; + font-size: 1rem; + font-weight: 500; + color: kt-base-color(label, 3); + transition: color 0.3s ease; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + + > span { + display: block; + font-size: 1rem; + font-weight: 400; + color: kt-base-color(label, 2); + } + } + + .kt-widget30__stats { + + } + + &:last-child { + border-bottom: none; + } + } + + &:last-child { + border-bottom: none; + } + } + } + } +} + +@include kt-tablet-and-mobile { + .kt-widget30 { + margin: 1rem 0; + } +} + \ No newline at end of file diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget31.scss b/src/assets/sass/global/components/widgets/dashboard/_widget31.scss new file mode 100644 index 0000000..5252923 --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget31.scss @@ -0,0 +1,114 @@ +// +// Widget31 +// + + + + +.kt-widget31 { + .kt-widget31__item { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1.5rem; + + .kt-widget31__content { + display: flex; + justify-content: space-between; + align-items: center; + + .kt-widget31__pic { + > img { + width: 4rem; + border-radius: 50%; + } + } + + .kt-widget31__info { + padding: 0 1.2rem; + flex-grow: 1; + + .kt-widget31__username { + font-weight: 500; + font-size: 1.1rem; + color: kt-base-color(label, 3); + transition: color 0.3s ease; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + + .kt-widget31__text { + font-size: 1rem; + margin: 0; + font-weight: 400; + color: kt-base-color(label, 2); + } + } + + .kt-widget31__progress { + flex: 1; + padding-right: 3rem; + + .kt-widget31__stats { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 0.7rem; + + > span { + line-height: 1.1; + + &:first-child { + font-size: 1.1rem; + font-weight: 500; + color: kt-base-color(label, 3); + } + + &:last-child { + font-size: 1rem; + color: kt-base-color(label, 2); + font-weight: 400; + } + } + } + + .progress { + width: 100%; + } + } + + &:last-child { + display: flex; + justify-content: space-between; + align-items: center; + width: 50%; + } + } + + &:last-child { + margin-bottom: 0; + } + } +} + + +@include kt-mobile { + .kt-widget31 { + .kt-widget31__item { + display: flex; + flex-wrap: wrap; + + .kt-widget31__content { + width: 100%; + + &:last-child { + width: 100%; + margin: 1rem 0; + } + } + } + } +} diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget32.scss b/src/assets/sass/global/components/widgets/dashboard/_widget32.scss new file mode 100644 index 0000000..167c9ca --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget32.scss @@ -0,0 +1,50 @@ +// +// Widget32 +// + + + + +.kt-widget__files { + .kt-widget__media { + text-align: center; + + img { + width: 5rem; + } + + g [fill] { + fill: rgba(40, 42, 60, 0.2); + } + + .kt-widget__icon { + height: 5rem; + display: block; + text-align: center; + + svg { + width: 4rem; + height: 4rem; + } + } + } + + .kt-widget__desc { + text-align: center; + display: block; + font-weight: 500; + color: kt-base-color(label, 3); + font-size: 1.2rem; + padding-top: 5rem; + + &:hover { + color: kt-brand-color(); + transition: all 0.3s ease; + } + + &.kt-widget__desc--m { + padding-top: 1rem; + margin-bottom: 4rem; + } + } +} diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget33.scss b/src/assets/sass/global/components/widgets/dashboard/_widget33.scss new file mode 100644 index 0000000..52e3680 --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget33.scss @@ -0,0 +1,153 @@ +// +// Widget33 +// + + + +// Base +.kt-widget33 { + // Head + .kt-widget33__head { + display: flex; + justify-content: space-between; + align-items: center; + padding-bottom: 3rem; + + .kt-widget33__title { + font-size: 1.4rem; + font-weight: 600; + color: kt-base-color(label, 3); + + &:hover { + color: kt-brand-color(); + transition: all 0.3s ease; + } + } + } + + // Bady + .kt-widget33__body { + .kt-widget33__title { + font-size: 1.4rem; + font-weight: 600; + color: kt-base-color(label, 3); + + &:hover { + color: kt-brand-color(); + transition: all 0.3s ease; + } + } + + .kt-widget33__desc { + display: block; + font-weight: 500; + color: kt-base-color(label, 2); + } + + .kt-widget33__items { + .kt-widget33__item { + display: flex; + align-items: center; + padding: 2rem 0; + + .kt-widget33__pic { + width: 8rem; + margin-right: 2rem; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + } + + .kt-widget33__content { + flex-grow: 1; + margin-top: -0.4rem; + + .kt-widget33__subtitle { + font-weight: 500; + color: kt-base-color(label, 2); + margin-bottom: 0.5rem; + display: block; + } + + .kt-widget33__action { + display: flex; + align-items: center; + + .kt-widget33__check { + + @include kt-rounded { + border-radius: $kt-border-radius; + } + } + + .btn { + width: 23px; + height: 23px; + padding: 0; + margin: 0; + + i { + padding: 0; + font-size: 0.8rem; + } + } + + span { + font-size: 1.2rem; + font-weight: 600; + color: kt-base-color(label, 3); + padding-left: 1rem; + } + } + } + + .kt-widget33__price { + display: flex; + flex-wrap: wrap; + font-size: 1.1rem; + font-weight: 600; + color: kt-base-color(label, 3); + margin-top: -2.7rem; + } + + border-bottom: 1px solid kt-base-color(grey, 2); + + &:last-child { + border-bottom: none; + } + } + } + } + + // Foot + .kt-widget33__foot { + .kt-widget33__section { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 2rem; + + .kt-widget33__desc { + font-weight: 600; + font-size: 1.2rem; + color: kt-base-color(label, 4); + } + + .kt-widget33__subtotal { + font-weight: 600; + color: kt-base-color(label, 4); + font-size: 1.2rem; + } + } + + .kt-widget33__button { + text-align: center; + + .btn { + width: 100%; + padding: 1rem 0; + } + } + } +} diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget4.scss b/src/assets/sass/global/components/widgets/dashboard/_widget4.scss new file mode 100644 index 0000000..6fd2718 --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget4.scss @@ -0,0 +1,210 @@ +// +// Widget4 +// + + + + +.kt-widget4 { + .kt-widget4__item { + display: flex; + justify-content: space-between; + align-items: center; + padding-top: 1rem; + padding-bottom: 1rem; + + .kt-widget4__pic { + padding-right: 1rem; + + img { + width: 2.5rem; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + } + + &.kt-widget4__pic--sm { + img { + width: 2.5rem; + } + } + + &.kt-widget4__pic--lg { + img { + width: 3.5rem; + } + } + + &.kt-widget4__pic--xl { + img { + width: 4rem; + } + } + + &.kt-widget4__pic--circle { + img { + border-radius: 50%; + } + } + } + + .kt-widget4__img { + margin-right: 0.5rem; + } + + .kt-widget4__info { + display: flex; + flex-direction: column; + padding-right: 1.25rem; + flex-grow: 1; + + .kt-widget4__username { + font-weight: 500; + font-size: 1rem; + color: kt-base-color(label, 3); + transition: color 0.3s ease; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + + .kt-widget4__title { + font-weight: 500; + font-size: 1.1rem; + color: kt-base-color(label, 3); + } + + .kt-widget4__text { + font-size: 1rem; + margin: 0; + color: kt-base-color(label, 2); + } + } + + .kt-widget4__title { + color: kt-base-color(label, 3); + font-size: 1rem; + font-weight: 500; + padding-right: 1.25rem; + flex-grow: 1; + transition: color 0.3s ease; + + &.kt-widget4__title--light { + font-weight: 400; + } + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + + .kt-widget4__number { + width: 7rem; + flex-grow: 1; + text-align: right; + font-weight: 500; + font-size: 1.1rem; + } + + .kt-widget4__icon { + padding-right: 1.25rem; + + > i { + font-size: 1.6rem; + text-align: right; + color: kt-base-color(label, 2); + } + + &.kt-widget4__icon--2x { + > i { + font-size: 2.2rem; + } + } + } + + border-bottom: 1px dashed kt-base-color(grey, 2); + + &:first-child { + padding-top: 0; + } + + &:last-child { + padding-bottom: 0; + border-bottom: 0; + } + } + + &.kt-widget4--progress { + .kt-widget4__content { + display: flex; + justify-content: space-between; + align-items: center; + width: 50%; + + .kt-widget4__progress { + flex: 1; + padding-right: 1.5rem; + + .kt-widget4__stats { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 0.7rem; + + > span { + line-height: 1.1; + + &:first-child { + font-size: 1.1rem; + font-weight: 600; + color: kt-base-color(label, 3); + } + + &:last-child { + font-size: 0.9rem; + color: kt-base-color(label, 2); + font-weight: 400; + } + } + } + + .progress { + width: 100%; + } + } + } + } + + .kt-widget4__chart { + position: relative; + } + + // Sticky chart + &.kt-widget4--sticky { + display: flex; + flex-direction: column; + height: 100%; + width: 100%; + + .kt-widget4__items { + flex-grow: 1; + + &.kt-widget4__items--bottom { + display: flex; + flex-direction: column; + justify-content: flex-end; + } + } + + .kt-widget4__chart { + canvas { + border-bottom-left-radius: $kt-border-radius; + border-bottom-right-radius: $kt-border-radius; + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget5.scss b/src/assets/sass/global/components/widgets/dashboard/_widget5.scss new file mode 100644 index 0000000..29aa0ab --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget5.scss @@ -0,0 +1,119 @@ + +// +// Widget5 +// + + + + +.kt-widget5 { + .kt-widget5__item { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom:1.5rem; + padding-bottom: 1.5rem; + + .kt-widget5__content { + display: flex; + align-items: center; + + .kt-widget5__pic { + padding-right: 1.25rem; + + img { + max-width: 8.5rem; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + } + } + + .kt-widget5__title { + font-size: 1.1rem; + font-weight: 500; + color: kt-base-color(label, 3); + transition: color 0.3s ease; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + + .kt-widget5__desc { + margin: 0; + padding: 0.4rem 0; + font-size: 1rem; + font-weight: 400; + color: kt-base-color(label, 2); + } + + .kt-widget5__info { + span:nth-child(even) { + font-weight: 500; + margin-right: 0.71rem; + } + } + + .kt-widget5__stats { + display: flex; + flex-direction: column; + + .kt-widget5__number { + font-size: 1.3rem; + font-weight: 500; + color: kt-base-color(label, 3); + } + + &:first-child { + padding-right: 3rem; + } + } + + &:last-child { + flex-grow: 1; + text-align: right; + justify-content: flex-end; + padding-left: 1rem; + } + } + + border-bottom: 0.07rem dashed kt-base-color(grey, 2); + + &:last-child { + border-bottom: 0; + } + } +} + + +@include kt-tablet-and-mobile { + .kt-widget5 { + padding: 1rem; + + .kt-widget5__item { + .kt-widget5__content { + .kt-widget5__pic { + padding-right: 0.5rem; + + img { + max-width: 4rem; + } + } + + .kt-widget5__stats { + .kt-widget5__number { + font-size: 1.2rem; + font-weight: 500; + } + + &:first-child { + padding-right: 1rem; + } + } + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget6.scss b/src/assets/sass/global/components/widgets/dashboard/_widget6.scss new file mode 100644 index 0000000..5d1ec57 --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget6.scss @@ -0,0 +1,65 @@ +// +// Widget16 +// + + + + +// widget6 +.kt-widget6 { + .kt-widget6__head { + .kt-widget6__item { + display: flex; + align-items: center; + margin-bottom: 1.07rem; + + > span { + font-size: 1rem; + color: kt-base-color(label, 2); + font-weight: 400; + flex: 1; + text-align: left; + + &:last-child { + text-align: right; + } + } + } + } + + .kt-widget6__body { + .kt-widget6__item { + display: flex; + align-items: center; + padding: 1.07rem 0; + + > span { + color: kt-base-color(label, 3); + font-weight: 400; + flex: 1; + text-align: left; + font-size: 1rem; + + &:last-child { + text-align: right; + } + } + + border-bottom: 1px dashed kt-base-color(grey, 2); + + &:last-child { + border-bottom: 0; + } + } + } + + .kt-widget6__foot { + .kt-widget6__action { + text-align: right; + margin-top: 1rem; + } + } +} + + + \ No newline at end of file diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget7.scss b/src/assets/sass/global/components/widgets/dashboard/_widget7.scss new file mode 100644 index 0000000..bddf2ac --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget7.scss @@ -0,0 +1,70 @@ +// +// Widget7 +// + + + + +.kt-widget7 { + .kt-widget7__desc { + text-align: center; + margin-top: 7rem; + font-size: 1.3rem; + color: kt-base-color(label, 3); + } + + .kt-widget7__content { + display: flex; + justify-content: center; + align-items: center; + margin-top: 2rem; + + .kt-widget7__userpic { + img { + width: 3.6rem; + border-radius: 50%; + } + } + + .kt-widget7__info { + padding-left: 1rem; + + .kt-widget7__username { + color: kt-base-color(label, 3); + font-weight: 500; + font-size: 1.4rem; + margin-bottom: 0; + } + + .kt-widget7__time { + color: kt-base-color(label, 2); + font-size: 0.9rem; + } + } + } + + .kt-widget7__button { + text-align: center; + margin-top: 2rem; + } + + // Light skin + &.kt-widget7--skin-light { + .kt-widget7__desc { + color: #fff; + } + + .kt-widget7__info { + .kt-widget7__username { + color: #fff; + } + + .kt-widget7__time { + color: #fff; + opacity: 0.8; + } + } + } +} + + diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget8.scss b/src/assets/sass/global/components/widgets/dashboard/_widget8.scss new file mode 100644 index 0000000..c12fef8 --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget8.scss @@ -0,0 +1,62 @@ +// +// Widget8 +// + + + + +.kt-widget8 { + + // Item + .kt-widget8__item { + display: flex; + + + .kt-widget8__pic { + + + > img { + width: 3rem; + border-radius: 50%; + } + } + + // Info + .kt-widget8__info { + padding-left: 1rem; + font-size: 1rem; + + // Username + .kt-widget8__username { + color: kt-base-color(label, 3); + font-size: 1.2rem; + font-weight: 500; + } + + // Description + .kt-widget8__desc { + font-size: 1rem; + color: kt-base-color(label, 2); + } + } + + // Action + .kt-widget8__action { + + } + + + border-bottom: 0.07rem dashed kt-base-color(grey, 2); + + &:last-child { + border-bottom: 0; + } + } + + &:last-child { + margin-bottom: -0.71rem; + } +} + + + \ No newline at end of file diff --git a/src/assets/sass/global/components/widgets/dashboard/_widget9.scss b/src/assets/sass/global/components/widgets/dashboard/_widget9.scss new file mode 100644 index 0000000..d44633e --- /dev/null +++ b/src/assets/sass/global/components/widgets/dashboard/_widget9.scss @@ -0,0 +1,45 @@ +// +// Widget9 +// + + + + +.kt-widget9 { + padding: 2.2rem; + + .kt-widget9__header { + padding: 1.1rem 0; + margin-bottom: 0.5rem; + + .kt-widget9__title { + font-size: 1.2rem; + font-weight: 600; + margin-bottom: 0; + color: kt-base-color(label, 3); + } + + .kt-widget9__desc { + display: inline-block; + margin-top: 0.2rem; + color: kt-base-color(label, 2); + } + + .kt-widget9__text { + color: kt-base-color(label, 2); + } + } + + .kt-widget9__chart { + position: relative; + margin-top: 0.5rem; + + .kt-widget9__stat { + font-size: 2.4rem; + font-weight: 700; + color: kt-base-color(label, 2); + } + } +} + + diff --git a/src/assets/sass/global/components/widgets/general/_profile-1.scss b/src/assets/sass/global/components/widgets/general/_profile-1.scss new file mode 100644 index 0000000..9cca93e --- /dev/null +++ b/src/assets/sass/global/components/widgets/general/_profile-1.scss @@ -0,0 +1,216 @@ +// +// User Profile 1 +// + + + +.kt-widget { + &.kt-widget--user-profile-1 { + padding-bottom: 1.7rem; + + .kt-widget__head { + display: flex; + align-items: flex-start; + + .kt-widget__media { + img { + width: 90px; + max-width: 100%; + + @include kt-rounded { + border-radius: 8px; + } + } + } + + .kt-widget__content { + padding-left: 1.6rem; + + .kt-widget__section { + .kt-widget__username { + font-size: 1.3rem; + color: kt-base-color(label, 4); + font-weight: 500; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + + i { + font-size: 1.1rem; + padding-left: 0.4rem; + } + } + + .kt-widget__subtitle { + font-size: 1; + display: block; + padding: 0.25rem 0 0 0; + font-weight: 500; + color: kt-base-color(label, 2); + } + } + + .kt-widget__action { + margin-top: 1rem; + + .btn { + margin-right: 0.4rem; + font-weight: 600; + padding: 0.3rem 1rem; + } + } + } + } + + .kt-widget__body { + .kt-widget__content { + padding: 1.9rem 0 2.1rem 0; + + .kt-widget__info { + display: flex; + align-items: center; + justify-content: space-between; + padding-bottom: 0.5rem; + + .kt-widget__label { + color: kt-base-color(label, 4); + font-weight: 500; + } + + .kt-widget__data { + color: kt-base-color(label, 2); + font-weight: 400; + } + + a.kt-widget__data:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + + &:last-child { + padding-bottom: 0; + } + } + } + + .kt-widget__items { + .kt-widget__item { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.9rem 1.05rem 0.9rem 0.6rem; + margin: 0.4rem 0; + + &.kt-widget__item--active { + transition: color 0.3s ease; + background: #f2f3f7; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + .kt-widget__section { + .kt-widget__desc { + color: kt-brand-color(); + } + + .kt-widget__icon { + .kt-svg-icon g [fill] { + fill: kt-brand-color(); + } + } + } + } + + .kt-widget__section { + .kt-widget__icon { + svg { + width: 2rem; + height: 1.5rem; + } + + .kt-svg-icon g [fill] { + fill: kt-base-color(label, 2); + } + } + + .kt-widget__desc { + color: kt-base-color(label, 2); + font-weight: 500; + padding-left: 0.3rem; + } + } + + &:hover { + transition: color 0.3s ease; + background: #f2f3f7; + cursor: pointer; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + .kt-widget__desc { + color: kt-brand-color(); + } + + .kt-widget__icon { + .kt-svg-icon g [fill] { + fill: kt-brand-color(); + } + } + } + } + } + } + } + + .kt-portlet__body.kt-portlet__body--fit-y & { + margin-top: -10px; + } +} + + +@include kt-tablet-and-mobile { + .kt-widget { + &.kt-widget--user-profile-1 { + padding-bottom: 1.2rem; + + .kt-widget__head { + .kt-widget__media { + img { + max-width: 60px; + } + } + + .kt-widget__content { + .kt-widget__section { + .kt-widget__username { + font-size: 1.1rem; + color: kt-base-color(label, 4); + font-weight: 500; + } + } + + .kt-widget__action { + margin-top: 0.5rem; + + .btn { + margin-right: 0.4rem; + font-weight: 500; + padding: 0.25rem 1.25rem; + } + } + } + } + + .kt-widget__body { + .kt-widget__content { + padding-bottom: 2rem; + } + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/widgets/general/_profile-2.scss b/src/assets/sass/global/components/widgets/general/_profile-2.scss new file mode 100644 index 0000000..9703fef --- /dev/null +++ b/src/assets/sass/global/components/widgets/general/_profile-2.scss @@ -0,0 +1,199 @@ +// +// User Profile 2 +// + + + +.kt-widget { + &.kt-widget--user-profile-2 { + display: flex; + justify-content: space-between; + flex-direction: column; + height: 100%; + + .kt-widget__head { + display: flex; + align-items: center; + margin-top: -45px; + + .kt-widget__media { + .kt-widget__img { + max-width: 90px; + + @include kt-rounded { + border-radius: 50%; + } + } + + .kt-widget__pic { + display: flex; + justify-content: center; + align-items: center; + width: 90px; + height: 90px; + font-size: 1.5rem; + + @include kt-rounded { + border-radius: 50%; + } + + @each $name, $color in $kt-state-colors { + &.kt-widget__pic--#{$name} { + background: rgba(kt-get($color, base), 0.1); + } + } + } + } + + .kt-widget__info { + padding-left: 1rem; + + .kt-widget__username { + font-size: 1.4rem; + color: kt-base-color(label, 4); + font-weight: 500; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + + .kt-widget__titel { + font-size: 1.4rem; + color: kt-base-color(label, 4); + font-weight: 500; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + + .kt-widget__desc { + display: block; + font-weight: 500; + font-size: 1.1rem; + padding-top: 0.4rem; + color: kt-base-color(label, 2); + } + } + } + + .kt-widget__body { + flex: 1; + + .kt-widget__section { + padding: 1rem 0 1rem 0; + color: kt-base-color(label, 3); + font-weight: 400; + + a { + padding-right: 0.3rem; + } + } + + .kt-widget__content { + display: flex; + + .kt-widget__stats { + display: flex; + align-items: center; + flex-grow: 1; + padding-bottom: 1.7rem; + + .kt-widget__icon { + + i { + font-size: 2.7rem; + color: kt-base-color(label, 1); + font-weight: 400; + } + } + + .kt-widget__details { + padding-left: 1rem; + + .kt-widget__title { + display: block; + color: kt-base-color(label, 3); + font-weight: 500; + font-size: 0.95rem; + } + + .kt-widget__value { + display: block; + color: kt-base-color(label, 4); + font-weight: 600; + font-size: 1.2rem; + } + } + } + } + + .kt-widget__item { + padding: 0.7rem 0; + + .kt-widget__contact { + display: flex; + align-items: center; + justify-content: space-between; + padding-bottom: 0.5rem; + + .kt-widget__label { + color: kt-base-color(label, 4); + font-weight: 600; + } + + .kt-widget__data { + color: kt-base-color(label, 2); + font-weight: 400; + } + + a.kt-widget__data:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + + &:last-child { + padding-bottom: 0; + } + } + } + } + + .kt-widget__footer { + margin-top: 2rem; + + .btn { + font-size: 1rem; + font-weight: 600; + padding: 1.1rem 0; + width: 100%; + } + } + } +} + + +@include kt-mobile { + .kt-widget { + &.kt-widget--user-profile-2 { + .kt-widget__head{ + margin-top: -30px; + + .kt-widget__media { + .kt-widget__img { + max-width: 60px; + } + + .kt-widget__pic { + max-width: 60px; + max-height: 60px; + font-size: 1.2rem; + } + } + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/components/widgets/general/_profile-3.scss b/src/assets/sass/global/components/widgets/general/_profile-3.scss new file mode 100644 index 0000000..bd033f7 --- /dev/null +++ b/src/assets/sass/global/components/widgets/general/_profile-3.scss @@ -0,0 +1,338 @@ +// +// User Profile 3 +// + + + +.kt-widget { + &.kt-widget--user-profile-3 { + .kt-widget__top { + display: flex; + align-items: flex-start; + + .kt-widget__media { + margin-top: 0.2rem; + + img { + width: 110px; + + @include kt-rounded { + border-radius: 8px; + } + } + } + + .kt-widget__pic { + margin-top: 0.2rem; + width: 100%; + max-width: 110px; + height: 110px; + display: flex; + justify-content: center; + align-items: center; + font-size: 1.5rem; + + @include kt-rounded { + border-radius: 8px; + } + + @each $name, $color in $kt-state-colors { + &.kt-widget__pic--#{$name} { + background: rgba(kt-get($color, base), 0.1); + } + } + } + + .kt-widget__content { + width: 100%; + padding-left: 1.7rem; + + .kt-widget__head { + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + + .kt-widget__user { + display: flex; + align-items: center; + } + + .kt-widget__username { + font-size: 1.3rem; + color: kt-base-color(label, 4); + font-weight: 500; + align-items: center; + margin-right: 0.5rem; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + + i { + font-size: 1.2rem; + color: #57c974; + padding-left: 0.5rem; + } + } + + .kt-widget__title { + font-size: 1.3rem; + color: kt-base-color(label, 4); + font-weight: 600; + margin: 0.8rem 0 0.7rem 0; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + + .kt-widget__action { + .btn { + font-weight: 600; + margin-left: 0.5rem; + } + } + } + + .kt-widget__subhead { + padding: 0.6rem 0 0.8rem 0; + + a { + padding-right: 2rem; + color: kt-base-color(label, 2); + font-weight: 500; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + + i { + padding-right: 0.5rem; + } + } + } + + .kt-widget__info { + display: flex; + flex-flow: row wrap; + + .kt-widget__desc { + color: kt-base-color(label, 3); + font-weight: 400; + padding-right: 2rem; + flex-grow: 1; + margin-bottom: 0.5rem; + } + + .kt-widget__progress { + display: flex; + align-items: center; + max-width: 500px; + width: 100%; + margin: 0.1rem 0; + + + .kt-widget__text { + padding-right: 1rem; + color: kt-base-color(label, 3); + font-weight: 500; + } + + .kt-widget__stats { + padding-left: 1rem; + color: kt-base-color(label, 4); + font-weight: 600; + font-size: 1.1rem; + } + } + + .kt-widget__stats { + margin-bottom: 0.7rem; + display: flex; + flex-wrap: wrap; + + .kt-widget__item { + padding-top: 1rem; + + .kt-widget__date { + color: kt-base-color(label, 3); + font-weight: 500; + padding-bottom: 1rem; + display: block; + } + + .kt-widget__subtitel { + color: kt-base-color(label, 3); + font-weight: 500; + display: block; + } + + .kt-widget__progress { + width: 100%; + margin: 1.4rem 0 0.5rem 0; + + .kt-widget__stat { + padding-left: 0.7rem; + color: kt-base-color(label, 4); + font-weight: 600; + } + } + + &:not(:first-child):not(:last-child) { + margin: 0 2.2rem + } + + &:last-child { + padding-left: 1rem; + } + } + } + } + } + } + + .kt-widget__bottom { + display: flex; + flex-wrap: wrap; + align-items: center; + width: 100%; + border-top: 1px solid kt-base-color(grey, 2); + margin-top: 2rem; + + .kt-widget__item { + display: flex; + align-items: center; + flex-grow: 1; + padding: 2rem 1.5rem 0 0; + + .kt-widget__icon { + i { + font-size: 2.7rem; + color: kt-base-color(label, 1); + font-weight: 400; + } + } + + .kt-widget__details { + padding-left: 1rem; + + .kt-widget__title { + display: block; + color: kt-base-color(label, 3); + font-weight: 600; + font-size: 0.95rem; + } + + .kt-widget__value { + display: block; + color: kt-base-color(label, 4); + font-weight: 600; + font-size: 1.2rem; + + span { + color: kt-base-color(label, 3); + font-weight: 400; + } + } + + a.kt-widget__value { + font-size: 0.95rem; + + &:hover { + color: kt-brand-color(); + } + } + + .kt-section__content { + padding-left: 0.7rem; + } + } + } + } + + .kt-widget__form { + margin-top: 1.5rem; + } + } +} + + +@include kt-mobile { + .kt-widget { + &.kt-widget--user-profile-3 { + padding-top: 0.5rem; + + .kt-widget__top { + display: flex; + align-items: flex-start; + .kt-widget__media { + margin-top: 0.5rem; + + img { + max-width: 60px; + } + } + + .kt-widget__pic { + width: 60px; + height: 60px; + margin-top: 0.5rem; + font-size: 1.3rem; + } + + .kt-widget__content { + padding-left: 1rem; + margin-top: 0; + + .kt-widget__head { + + .kt-widget__username { + padding-bottom: 0.6rem; + } + } + + .kt-widget__subhead { + padding: 1.2rem 0; + + a { + &:not(:first-child):not(:last-child) { + padding: 0.5rem 1rem 0.5rem 0; + } + } + } + + .kt-widget__info { + display: flex; + flex-direction: column; + + .kt-widget__desc { + padding-bottom: 1rem; + } + + .kt-widget__progress { + width: 100%; + } + } + } + } + + .kt-widget__bottom { + padding-top: 1rem; + + .kt-widget__item { + padding: 1rem 1rem 0 0; + + .kt-widget__icon { + i { + font-size: 2.5rem; + } + } + } + } + } + } +} diff --git a/src/assets/sass/global/components/widgets/general/_profile-4.scss b/src/assets/sass/global/components/widgets/general/_profile-4.scss new file mode 100644 index 0000000..f16abef --- /dev/null +++ b/src/assets/sass/global/components/widgets/general/_profile-4.scss @@ -0,0 +1,144 @@ +// +// User Profile 4 +// + + + +.kt-widget { + &.kt-widget--user-profile-4 { + .kt-widget__head { + margin-top: 1rem; + + .kt-widget__media { + display: flex; + justify-content: center; + + .kt-widget__img { + max-width: 90px; + max-height: 90px; + + @include kt-rounded { + border-radius: 50%; + } + } + + .kt-widget__pic { + display: flex; + justify-content: center; + align-items: center; + width: 90px; + height: 90px; + font-size: 1.5rem; + + @include kt-rounded { + border-radius: 50%; + } + + @each $name, $color in $kt-state-colors { + &.kt-widget__pic--#{$name} { + background: rgba(kt-get($color, base), 0.1); + } + } + } + } + + .kt-widget__content { + .kt-widget__section { + .kt-widget__username { + text-align: center; + display: block; + padding: 0.8rem 0 0.6rem 0; + font-size: 1.3rem; + color: kt-base-color(label, 4); + font-weight: 500; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + + .kt-widget__button { + text-align: center; + + .btn { + font-weight: 600; + padding: 0.3rem 0.8rem; + } + } + + .kt-widget__action { + text-align: center; + margin-top: 2.3rem; + + > .btn-label-warning { + &:hover { + color: #fff; + } + } + + .btn:not(:first-child):not(:last-child) { + margin: 0 1rem; + } + } + } + } + } + + .kt-widget__body { + margin-top: 2.5rem; + + .kt-widget__item { + display: block; + text-align: center; + color: kt-base-color(label, 3); + font-weight: 500; + font-size: 1.1rem; + padding: 0.9rem 0; + margin: 0.4rem 0; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + background: #edf0fc; + cursor: pointer; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + } + + &.kt-widget__item--active { + transition: color 0.3s ease; + background: #edf0fc; + color: kt-brand-color(); + + @include kt-rounded { + border-radius: $kt-border-radius; + } + } + } + } + } +} + +@include kt-mobile { + .kt-widget { + &.kt-widget--user-profile-4 { + .kt-widget__head { + .kt-widget__media { + .kt-widget__img { + max-width: 80px; + max-height: 80px; + } + + .kt-widget__pic { + max-width: 80px; + max-height: 80px; + font-size: 1.2rem; + } + } + } + } + } +} diff --git a/src/assets/sass/global/components/widgets/general/_project-1.scss b/src/assets/sass/global/components/widgets/general/_project-1.scss new file mode 100644 index 0000000..9b3c4a2 --- /dev/null +++ b/src/assets/sass/global/components/widgets/general/_project-1.scss @@ -0,0 +1,328 @@ +// +// Project 1 +// + + + +.kt-widget.kt-widget--project-1 { + display: flex; + flex-direction: column; + height: calc(100% + 20px); + + .kt-widget__head { + display: flex; + justify-content: space-between; + flex-wrap: wrap; + padding: kt-get($kt-portlet, space, desktop); + + .kt-widget__label { + display: flex; + + .kt-widget__media { + .kt-media { + .kt-widget__icon { + max-width: 62px; + height: 62px; + margin-top: -0.5rem; + margin-left: -0.5rem; + } + + img { + width: 65px; + } + } + + &.kt-widget__media--m { + margin-top: 1.5px; + } + } + + .kt-widget__info { + padding: 0.25rem 0 0 1rem; + + .kt-widget__title { + font-size: 1.3rem; + color: kt-base-color(label, 4); + font-weight: 600; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + + .kt-widget__desc { + padding-top: 0.4rem; + color: kt-base-color(label, 3); + font-weight: 500; + display: block; + } + } + } + + .kt-widget__toolbar { + display: flex; + align-items: flex-start; + } + } + + .kt-widget__body { + padding: kt-get($kt-portlet, space, desktop); + height: 100%; + padding-top: 0 !important; + + .kt-widget__stats { + display: flex; + flex-wrap: wrap; + + .kt-widget__item { + padding-top: 1rem; + + .kt-widget__date { + color: kt-base-color(label, 3); + font-weight: 500; + padding-bottom: 1rem; + display: block; + } + + .kt-widget__subtitel { + color: kt-base-color(label, 3); + font-weight: 500; + display: block; + } + + .kt-widget__progress { + width: 100%; + margin: 1.4rem 0 0.5rem 0; + + .kt-widget__stat { + padding-left: 0.7rem; + color: kt-base-color(label, 4); + font-weight: 600; + } + } + + &:not(:first-child):not(:last-child) { + margin: 0 2.2rem + } + + &:last-child { + padding-left: 1rem; + } + } + } + + .kt-widget__container { + display: flex; + align-items: center; + margin: 2.7rem 0 1.2rem 0; + + .kt-widget__subtitel { + color: kt-base-color(label, 3); + font-weight: 500; + } + + .kt-widget__progress { + width: 100%; + margin: 0 1rem; + + .kt-widget__stat { + padding-left: 0.7rem; + color: kt-base-color(label, 4); + font-weight: 600; + } + } + } + + .kt-widget__text { + color: kt-base-color(label, 3); + font-weight: 500; + margin-top: 2.7rem; + display: block; + } + + .kt-widget__content { + padding: 1rem 0 1.3rem 0; + display: flex; + flex-wrap: wrap; + //align-items: center; + + .kt-widget__details { + margin-right: 3.7rem; + padding-top: 1rem; + display: flex; + flex-direction: column; + + .kt-widget__subtitle { + color: kt-base-color(label, 3); + font-weight: 600; + padding-bottom: 1.1rem; + } + + .kt-widget__value { + color: kt-base-color(label, 4); + font-weight: 600; + font-size: 1.2rem; + + span { + color: kt-base-color(label, 2); + } + } + + .kt-badge { + margin: 0.3rem 0 0 7px; + } + + &:last-child { + margin-right: 0; + + .kt-widget__subtitle { + margin-top: 0rem; + } + } + + .kt-media-group { + margin-top: -0.5rem + } + } + } + } + + .kt-widget__footer { + border-top: 1px solid kt-base-color(grey, 2); + width: 100%; + + .kt-widget__wrapper { + padding: kt-get($kt-portlet, space, desktop); + display: flex; + justify-content: space-between; + flex-wrap: wrap; + align-items: center; + + .kt-widget__section { + display: flex; + align-items: center; + + .kt-widget__blog { + display: flex; + align-items: center; + + i { + font-size: 1.3rem; + color: #d2d8e8; + } + + .kt-widget__value { + font-weight: 700; + padding-left: 0.6rem; + + } + + &:last-child { + padding-left: 1.7rem; + } + } + } + } + } +} + + +@include kt-tablet-and-mobile { + .kt-widget.kt-widget--project-1 { + .kt-widget__head { + padding-bottom: 1rem; + padding: kt-get($kt-portlet, space, mobile); + + .kt-widget__media { + .kt-media { + @include kt-media-size(50px, 1.2rem); + + img { + width: 50px; + } + + &.kt-media--md { + @include kt-media-size(45px, 1rem); + + img { + width: 47px; + } + } + + .kt-widget__icon { + margin-top: -0.7rem; + width: 62px; + } + } + + &.kt-widget__media--m { + margin-top: 1px; + } + } + + .kt-widget__info { + padding: 0.2rem 0 0 1rem; + } + } + + .kt-widget__body { + padding: kt-get($kt-portlet, space, mobile); + + .kt-widget__stats { + .kt-widget__item { + &:not(:first-child):not(:last-child) { + margin: 0 1.5rem + } + + &:last-child { + padding-left: 0; + } + } + } + + .kt-widget__text { + margin-top: 1.5rem; + margin-bottom: 1rem; + } + + .kt-widget__content { + padding: 0.5rem 0 1rem 0; + + .kt-widget__details { + margin-right: 1.2rem; + + &:last-child { + margin-right: 0; + + .kt-widget__subtitle { + margin-top: 0rem; + } + } + } + } + } + + .kt-widget__footer { + .kt-widget__wrapper { + padding: kt-get($kt-portlet, space, mobile); + + .kt-widget__section { + padding-right: 1rem; + + .kt-widget__blog { + .kt-widget__value { + padding-left: 0.4rem; + } + + &:last-child { + padding-left: 1.2rem; + } + } + } + } + } + } +} + + \ No newline at end of file diff --git a/src/assets/sass/global/components/widgets/general/_users.scss b/src/assets/sass/global/components/widgets/general/_users.scss new file mode 100644 index 0000000..16b658f --- /dev/null +++ b/src/assets/sass/global/components/widgets/general/_users.scss @@ -0,0 +1,81 @@ +// +// Users +// + + + + +.kt-widget.kt-widget--users { + .kt-widget__item { + display: flex; + margin: 1.3rem 0 2.3rem 0; + + .kt-media img { + width: 100%; + max-width: 43px; + height: 43px; + } + + &:last-child { + margin-bottom: 0; + } + + .kt-widget__info { + padding-top: 0.1rem; + flex: 3; + margin-left: 1rem; + + .kt-widget__section { + display: flex; + align-items: center; + + .kt-widget__username { + font-size: 1.1rem; + color: kt-base-color(label, 4); + font-weight: 500; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + + .kt-badge { + margin-left: 0.5rem; + } + } + + .kt-widget__desc { + display: block; + color: kt-base-color(label, 2); + font-weight: 500; + } + } + + .kt-widget__action { + text-align: right; + padding-top: 0.2rem; + flex: 1.1; + + .kt-widget__date { + display: block; + color: kt-base-color(label, 2); + font-weight: 500; + } + } + } +} + +@include kt-tablet-and-mobile { + .kt-widget.kt-widget--users { + .kt-widget__item { + .kt-widget__info { + flex: 1.5; + } + + .kt-widget__action { + flex: 1; + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/frameworks/angular/material/_angular-material.scss b/src/assets/sass/global/integration/frameworks/angular/material/_angular-material.scss new file mode 100644 index 0000000..bb77475 --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/angular/material/_angular-material.scss @@ -0,0 +1,100 @@ +// +// Material Angular Config +// +// Include the common styles for Angular Material. We include this here so that you only +// have to load a single css file for Angular Material in your app. +// Be sure that you only ever include this mixin once! +//@import "node_modules/@angular/material/theming"; + +@include mat-core(); + +// Define the palettes for your theme using the Material Design palettes available in palette.scss +// (imported above). For each palette, you can optionally specify a default, lighter, and darker +// hue. Available color palettes: https://material.io/design/color/ + +$mat-primary: ( + 100: lighten(kt-get($kt-state-colors, brand, base), 8%), + 500: kt-get($kt-state-colors, brand, base), + 700: darken(kt-get($kt-state-colors, brand, base), 8%), + contrast: ( + 100: $dark-primary-text, + 500: $light-primary-text, + 700: $light-primary-text + ) +); + +$mat-accent: ( + 100: lighten(kt-get($kt-state-colors, primary, base), 8%), + 500: kt-get($kt-state-colors, primary, base), + 700: darken(kt-get($kt-state-colors, primary, base), 8%), + contrast: ( + 100: $dark-primary-text, + 500: $light-primary-text, + 700: $light-primary-text + ) +); + +$mat-warn: ( + 100: lighten(kt-get($kt-state-colors, danger, base), 8%), + 500: kt-get($kt-state-colors, danger, base), + 700: darken(kt-get($kt-state-colors, danger, base), 8%), + contrast: ( + 100: $dark-primary-text, + 500: $light-primary-text, + 700: $light-primary-text + ) +); + + +//mat-palette($base-palette, $default: 500, $lighter: 100, $darker: 700) + +$angular-app-primary: mat-palette($mat-primary, 500, 100, 700); +$angular-app-accent: mat-palette($mat-accent, 500, 100, 700); +$angular-app-warn: mat-palette($mat-warn, 500, 100, 700); // The warn palette is optional (defaults to red). + +// Create the theme object (a Sass map containing all of the palettes). +$angular-app-theme: ( + primary: $angular-app-primary, + accent: $angular-app-accent, + warn: $angular-app-warn, + is-dark: false, + foreground: ( + base: black, + divider: kt-base-color(grey, 4), + dividers: $dark-dividers, + disabled: $dark-disabled-text, + disabled-button: rgba(black, 0.26), + disabled-text: $dark-disabled-text, + hint-text: $dark-disabled-text, + secondary-text: $dark-secondary-text, + icon: rgba(black, 0.54), + icons: rgba(black, 0.54), + text: rgba(black, 0.87), + slider-min: rgba(black, 0.87), + slider-off: rgba(black, 0.26), + slider-off-active: rgba(black, 0.38), + ), + background: ( + status-bar: map_get($mat-grey, 300), + app-bar: map_get($mat-grey, 100), + background: map_get($mat-grey, 50), + hover: rgba(black, 0.04), // TODO(kara): check style with Material Design UX + card: white, + dialog: white, + disabled-button: rgba(black, 0.12), + raised-button: white, + focused-button: $dark-focused, + selected-button: map_get($mat-grey, 300), + selected-disabled-button: map_get($mat-grey, 400), + disabled-button-toggle: map_get($mat-grey, 200), + unselected-chip: map_get($mat-grey, 300), + disabled-list-option: map_get($mat-grey, 200), + ) +); + +//mat-light-theme($angular-app-primary, $angular-app-accent, $angular-app-warn); + +// Include theme styles for core and each component used in your app. +// Alternatively, you can import and @include the theme mixins for each component +// that you are using. +@include angular-material-theme($angular-app-theme); \ No newline at end of file diff --git a/src/assets/sass/global/integration/frameworks/angular/material/_include.scss b/src/assets/sass/global/integration/frameworks/angular/material/_include.scss new file mode 100644 index 0000000..551982f --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/angular/material/_include.scss @@ -0,0 +1,19 @@ +// +// Customized Material Angular Version For Metronic +// + + + + +// 1: Override Framework Components +@import "components/general"; +@import "components/alert"; +@import "components/button"; +@import "components/dialog"; +@import "components/portlet"; +@import "components/table"; +@import "components/snackbar"; +@import "components/checkbox"; +@import "components/error"; +@import "components/timeline"; +@import "components/form"; diff --git a/src/assets/sass/global/integration/frameworks/angular/material/components/_alert.scss b/src/assets/sass/global/integration/frameworks/angular/material/components/_alert.scss new file mode 100644 index 0000000..40efd88 --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/angular/material/components/_alert.scss @@ -0,0 +1,63 @@ +// Alert +.kt-mat-alert { + display: flex; + //flex-wrap: wrap; + align-items: center; + padding: 10px 10px 10px 20px; + border-radius: 3px; + margin: 0 0 20px 0; + + .kt-mat-alert__icon { + display: flex; + align-items: center; + padding: 0 15px 0 0; + + i { + font-size: 2.4rem; + color: #fff; + } + } + + .kt-mat-alert__text { + display: flex; + align-items: center; + flex-grow: 1; + color: #fff; + } + + .kt-mat-alert__close { + padding: 0 0 0 10px; + display: flex; + align-items: center; + ustify-content: flex-end; + + .material-icons { + opacity: 0.8; + transition: all 0.3s ease; + color: #fff; + + &:hover { + transition: all 0.3s ease; + opacity: 1; + } + } + } + + // States + &.kt-mat-alert--warn { + background: kt-get($mat-warn, 500); + } + + &.kt-mat-alert--primary { + background: kt-get($mat-primary, 500); + } + + &.kt-mat-alert--accent { + background: kt-get($mat-accent, 500); + } + + // Marginless + &.kt-mat-alert--marginless { + margin: 0; + } +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/frameworks/angular/material/components/_button.scss b/src/assets/sass/global/integration/frameworks/angular/material/components/_button.scss new file mode 100644 index 0000000..f9b9584 --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/angular/material/components/_button.scss @@ -0,0 +1,17 @@ +// Buttons +.mat-fab, +.mat-mini-fab, +.mat-button, +.mat-raised-button, +.mat-stroked-button, +.mat-icon-button { + outline: none !important; +} + +mat-radio-button { + padding-right: 16px; +} + +mat-radio-button { + .mat-radio-label { margin-bottom: 4px; } +} diff --git a/src/assets/sass/global/integration/frameworks/angular/material/components/_checkbox.scss b/src/assets/sass/global/integration/frameworks/angular/material/components/_checkbox.scss new file mode 100644 index 0000000..9bf92f8 --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/angular/material/components/_checkbox.scss @@ -0,0 +1,15 @@ +.mat-checkbox { + > label { + margin-bottom: 0 + } +} + +.mat-pseudo-checkbox { + width: 18px !important; + height: 18px !important; +} + +.mat-pseudo-checkbox-checked::after { + top: 4.4px !important; + left: 2px !important; +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/frameworks/angular/material/components/_dialog.scss b/src/assets/sass/global/integration/frameworks/angular/material/components/_dialog.scss new file mode 100644 index 0000000..0ae2a07 --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/angular/material/components/_dialog.scss @@ -0,0 +1,61 @@ +// Dialog +.kt-mat-dialog-container__wrapper { + .mat-dialog-container { + padding: 0; + overflow-x: hidden; + + .kt-portlet { + margin-bottom: 0; + + .kt-portlet__body { + overflow: auto; + max-height: 60vh; + } + } + } +} + +.kt-mat-dialog-container__wrapper .mat-dialog-container { + padding: 0; + overflow-x: hidden; + + .kt-portlet { + margin-bottom: 0; + } + + .alert { + border-radius: 0 !important; + width: 1032px; + } +} + +.mat-dialog-actions { + margin-bottom: 0 !important; +} + +@include kt-tablet-and-mobile { + // Dialog + .kt-mat-dialog-container__wrapper { + max-width: 90%; + + .mat-dialog-container { + .kt-portlet { + .kt-portlet__body { + overflow: auto; + max-height: 60vh; + } + } + } + } +} + + +.kt-modal2__container { + padding-top: 24px; + padding-bottom: 24px; +} + +.kt-modal3__container { + padding-top: 24px; + padding-bottom: 24px; +} diff --git a/src/assets/sass/global/integration/frameworks/angular/material/components/_error.scss b/src/assets/sass/global/integration/frameworks/angular/material/components/_error.scss new file mode 100644 index 0000000..af8264b --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/angular/material/components/_error.scss @@ -0,0 +1,87 @@ + +.kt-error-403 { + flex: 1 !important; +} + +.kt-error-403__wrap { + display: flex; + flex: 1; + flex-direction: column; + height: 100%; + width: 100%; +} + +.kt-error-403__top { + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-end; + height: 50%; + font: 500 350px "Poppins"; + color: #8a0dff; +} + +.kt-error-403__top p { + display: flex; + flex-direction: column; + align-items: center; + margin: 0; + font: 500 350px/236px "Poppins"; + color: #8a0dff; +} + +.kt-error-403__bottom { + display: flex; + align-items: center; + flex-direction: column; + height: 50%; + background-color: #8a0dff; + padding-top: 84px; +} + +.kt-error-403__bottom h1 { + margin: 0 0 70px; + font: 500 80px "Roboto"; + color: white; +} + +.kt-error-403__bottom p { + margin: 0; + font: 500 30px "Roboto"; + color: white; +} + + +@media screen and (max-width: 992px) { + .kt-error-403__top p { + font-size: 300px; + line-height: 204px; + } +} + +@media screen and (max-width: 676px) { + .kt-error-403__top p { + font-size: 200px; + line-height: 136px; + } + .kt-error-403__bottom { + padding-left: 20px; + padding-right: 20px; + } + .kt-error-403__bottom h1 { + margin-bottom: 50px; + font-size: 60px; + text-align: center; + } + .kt-error-403__bottom p { + font-size: 24px; + text-align: center; + } +} + +@media screen and (max-width: 380px) { + .kt-error-403__top p { + font-size: 140px; + line-height: 94px; + } +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/frameworks/angular/material/components/_form.scss b/src/assets/sass/global/integration/frameworks/angular/material/components/_form.scss new file mode 100644 index 0000000..474d61c --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/angular/material/components/_form.scss @@ -0,0 +1,54 @@ + +.ml-auto { + margin-left: auto; +} + +.example-full-width { + width: 100%; +} + +.form-group .kt-timeline-3 { + &::before { + background-color: transparent; + } +} + + +// kt-form +.kt-form { + .kt-form__filtration, + .kt-form__group-action { + margin: 0 0 30px; + } + .kt-form__actions.kt-form__actions--sm { + padding-top: 1rem; + padding-bottom: 1rem; + } + .kt-form__actions { + padding: 30px; + &.kt-form__actions--solid { + padding: 30px; + background-color: #f7f8fa; + border-color: #f7f8fa; + } + } +} + +.kt-margin { + &-top-20 { + margin-top: 20px; + } + &-bottom-20 { + margin-bottom: 20px; + } +} + +.kt-padding-0 { + padding: 0; +} + +.kt-form.kt-form--group-seperator .kt-form__group, +.kt-form.kt-form--group-seperator-dashed .kt-form__group { + padding-top: 25px; + padding-bottom: 25px; +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/frameworks/angular/material/components/_general.scss b/src/assets/sass/global/integration/frameworks/angular/material/components/_general.scss new file mode 100644 index 0000000..6e5d601 --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/angular/material/components/_general.scss @@ -0,0 +1,96 @@ +// Form controls +.mat-column-select { + overflow: initial; +} +.mat-column-checkbox { + flex: 0 0 70px; +} + +.mat-column-vinCode { + flex: 1 0 60px; +} + +.example-radio-group { + display: inline-flex; + flex-direction: column; +} + +.example-radio-button { + margin: 5px; +} + +// Tabs +.demo-tab-group { + border: 1px solid #e8e8e8; + } + +.demo-tab-content { + padding: 16px; +} + +// Panels +.example-panel-Suspended { + .mat-select-content { + background: rgba(255, 0, 0, 0.5); + } +} + +.example-panel-Active { + .mat-select-content { + background: rgba(0, 255, 0, 0.5); + } +} + +.material-icons { + font-size: 18px !important; +} + +// Form fields +.mat-form-field-fluid { + display: block !important; +} + +// Tabs +.mat-tab-body-content { + overflow: visible !important; + padding-top: 20px !important; +} + +.mat-tab-label-icon { + margin-right: 5px; +} + +.mat-form-field-infix { +     input:-webkit-autofill, +     input:-webkit-autofill:hover, +     input:-webkit-autofill:focus, +     input:-webkit-autofill:active { + -webkit-text-fill-color: #000 !important; + } +} + +.example-ripple-container { + cursor: pointer; + text-align: center; + + width: 300px; + height: 300px; + line-height: 300px; + + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + + -webkit-user-drag: none; + -webkit-tap-highlight-color: transparent; +} + +/** Styles to make the demo look better. */ +.example-ripple-checkbox { + margin: 6px 12px 6px 0; +} + +.example-ripple-form-field { + margin: 0 12px 0 0; +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/frameworks/angular/material/components/_portlet.scss b/src/assets/sass/global/integration/frameworks/angular/material/components/_portlet.scss new file mode 100644 index 0000000..e3abf2e --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/angular/material/components/_portlet.scss @@ -0,0 +1,200 @@ +// Portlets +.kt-portlet { + // Angular source code previewer + &.kt-portlet--ngviewer { + .kt-portlet__body { + padding: 0; + + .kt-portlet__code { + display: none; + + &.kt-portlet__code--show { + display: block; + } + } + + .kt-portlet__preview { + padding: kt-get($kt-portlet, space, desktop) kt-get($kt-portlet, space, desktop); + } + } + + .kt-portlet__code-copy { + position: absolute; + right: 0; + top: 10px; + + i { + font-size: 2rem; + } + + &:hover { + i { + text-decoration: none; + } + } + } + } + + // Portlet progress bar + .kt-portlet__progress-bar__wrapper { + height: 5px; + } + + .kt-portlet__progress-bar { + height: 5px; + } + + // Tools + .kt-portlet__head-tools { + button { + margin-left: 5px; + } + } +} + +.kt-form--alert { + margin-top: 30px; +} + +.kt-portlet-mx-0 { + margin: -1.1rem -2.2rem 0; + overflow-x: hidden; +} + +.kt-portlet { + .kt-portlet__body .kt-portlet__body-progress { + display: none; + } + + .kt-form.kt-form--fit > .kt-portlet__body { + padding-left: 0; + padding-right: 0; + } + &.kt-portlet--body-progress .kt-portlet__body { + position: relative; + -webkit-animation: m-animate-fade-out 0.3s; + animation: m-animate-fade-out 0.3s; + .kt-portlet__body-progress { + background-color: #fff; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 5; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + } + } + + // TODO + &__head__custom { + .kt-portlet__head-label { + display: flex; + align-items: center; + } + .kt-portlet__head-title { + margin-bottom: 0; + } + } + // TODO +} + + +// remove ng-boostrap dropdown arrow +[ngbdropdowntoggle]::after { + display: none !important; +} + +.kt-portlet__code-copy { + position: absolute; + right: 0; + top: 10px; + i { + font-size: 2rem; + } +} + +.kt-pl-13 { + padding-left: 13px !important; +} + +.mat-table__bottom--padding { + padding-right: 8px; +} + +.mat-table__empty { + position: relative; + .mat-table__message--loading { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + content: ""; + z-index: 3; + display: flex; + align-items: center; + justify-content: center; + background: rgba(255, 255, 255, 1); + } +} + +.kt-portlet { + .kt-portlet__head { + .kt-portlet__head-caption { + display: flex; + align-items: center; + align-content: flex-start; + .kt-portlet__head-title { + display: flex; + align-items: center; + .kt-portlet__head-text { + display: flex; + align-items: center; + font-size: 1.3rem; + font-weight: 500; + font-family: Roboto; + margin: 0; + padding: 0; + } + } + } + } +} + +.kt-form .kt-form__heading .kt-form__heading-title { + font-weight: 500; + font-size: 1.3rem; + color: #575962; +} + +.kt-portlet .kt-portlet__foot { + padding: 0!important; +} + +.kt-form .kt-form__group { + margin-bottom: 0; + padding-top: 15px; + padding-bottom: 15px; +} + +button.close { height: 100%; } + +.mat-button-mt-4 { + .mat-icon {margin-top: 4px;} +} + +.display-none { + display: none !important; +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/frameworks/angular/material/components/_snackbar.scss b/src/assets/sass/global/integration/frameworks/angular/material/components/_snackbar.scss new file mode 100644 index 0000000..a09baaf --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/angular/material/components/_snackbar.scss @@ -0,0 +1,36 @@ +.kt-mat-snackbar { + display: flex; + //flex-wrap: wrap; + align-items: center; + padding: 5px 10px; + border-radius: 3px; + + .kt-mat-snackbar__message { + display: flex; + align-items: center; + } + + .kt-mat-snackbar__btn { + padding: 0 0 0 15px; + display: flex; + align-items: center; + } + + .kt-mat-snackbar__close { + padding: 0 0 0 5px; + display: flex; + align-items: center; + justify-content: flex-end; + + .material-icons { + opacity: 0.8; + transition: all 0.3s ease; + color: #fff; + + &:hover { + transition: all 0.3s ease; + opacity: 1; + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/frameworks/angular/material/components/_table.scss b/src/assets/sass/global/integration/frameworks/angular/material/components/_table.scss new file mode 100644 index 0000000..ac97301 --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/angular/material/components/_table.scss @@ -0,0 +1,141 @@ +// Tables +.mat-table__wrapper { + width: 100%; + overflow-x: auto; + + mat-cell, + mat-header-cell { + min-height: 100%; + } + + .mat-table { + min-width: 1000px; + + .mat-cell, + .mat-footer-cell, + .mat-header-cell { + padding-right: 10px; + } + + .mat-cell:last-child, + .mat-footer-cell:last-child, + .mat-header-cell:last-child { + padding-right: 0; + } + + .mat-row { + transition: padding 0.3s ease; + } + + .mat-row-editing { + transition: padding 0.3s ease; + padding: 12px 0 !important; + + .mat-form-field-fluid { + width: 99% !important; + } + } + } + + .mat-column-actions { + .mat-column-actions-wrapper { + display: flex; + align-items: center; + } + .mat-spinner { + margin-left: 12px; + margin-right: 8px; + } + } + + .mat-table__message { + padding: 30px !important; + text-align: center; + font-weight: 500; + } + + .mat-column-checkbox { + padding-left: 20px; + + .mat-checkbox { + .mat-checkbox-layout { + margin-top: 0.25rem; + margin-bottom: 0.25rem; + } + } + } + + .ps__rail-y { + z-index: 100; + } +} + +.mat-table__wrapper .mat-table { + min-width: 1000px; + width: 100%; +} + +.mat-table__wrapper--dashboard .mat-table { + min-width: 600px !important; +} + +.mat-table__wrapper .mat-table .email-cell { + word-wrap: normal; + width: 180px; + flex: auto; +} + +.mat-table__wrapper--sub .mat-table { + min-width: 400px; + + .mat-cell:last-child { + flex: 0 0 100px; + } + + .mat-header-cell:last-child { + flex: 0 0 100px; + } +} + +.mat-table-sticky { + z-index: 97 !important; +} + +.mat-table__bottom { + display: flex; + align-items: center; + justify-content: flex-end; +} + +.mat-column-checkbox { + flex: 0 0 68px; +} + +.mat-column-id { + flex: 0 0 68px; +} + +.mat-column-main { + flex: 0 0 568px; +} + +.mat-column-actions { + flex: 0 0 160px; +} + +.mat-table__bottom { + display: flex; + align-items: center; + justify-content: flex-end; +} + +.mat-column-vinCode { + flex: 0 0 170px; +} + +.mat-table__wrapper .mat-table .mat-row-editing.mat-row-inactive { + height: 0; + min-height: 0; + padding: 0 !important; + border-bottom: 0 !important; +} diff --git a/src/assets/sass/global/integration/frameworks/angular/material/components/_timeline.scss b/src/assets/sass/global/integration/frameworks/angular/material/components/_timeline.scss new file mode 100644 index 0000000..ff71398 --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/angular/material/components/_timeline.scss @@ -0,0 +1,220 @@ + +.kt-timeline-3 .kt-timeline-3__inner { + .kt-timeline-3__item { + min-height: 30px; + border-left: 3px solid #586bd8; + padding-left: 15px; + + &::before { + display: none; + } + + .kt-timeline-3__item-time { + padding-top: 0; + position: static; + } + } + + .kt-timeline-3__item-child { + margin-left: 27px; + .mat-checkbox:not(.mat-checkbox-disabled).mat-accent + .mat-checkbox-ripple + .mat-ripple-element { + background-color: rgba(54, 163, 247, 0.26); + } + } +} + + + +// timeline +.kt-list-timeline { + .kt-list-timeline__items { + position: relative; + padding: 0; + margin: 0; + &:before { + position: absolute; + display: block; + content: ""; + width: 1px; + height: 100%; + top: 0; + bottom: 0; + left: 3px; + background-color: #ebedf2; + } + .kt-list-timeline__item { + position: relative; + display: table; + table-layout: fixed; + width: 100%; + padding: 6px 0; + margin: 5px 0; + &:first-child { + padding-top: 0; + margin-top: 0; + } + .kt-list-timeline__badge { + text-align: left; + vertical-align: middle; + display: table-cell; + position: relative; + width: 20px; + &:before { + position: absolute; + display: block; + content: ""; + width: 7px; + height: 7px; + left: 0; + top: 50%; + margin-top: -3.5px; + border-radius: 100%; + background-color: #ebedf2; + } + &--success:before { + background-color: #34bfa3; + } + &--metal:before { + background-color: #c4c5d6; + } + &--danger:before { + background-color: #f4516c; + } + } + &:first-child:before { + display: block; + content: ""; + width: 1px; + height: 50%; + position: absolute; + top: 0; + bottom: 0; + left: 3px; + background-color: #fff !important; + } + &:last-child:before { + display: block; + content: ""; + width: 1px; + height: 50%; + position: absolute; + top: 50%; + bottom: 0; + left: 3px; + background-color: #fff !important; + } + .kt-list-timeline__text { + display: table-cell; + text-align: left; + vertical-align: middle; + width: 100%; + padding: 0 5px 0 0; + font-size: 1rem; + .kt-badge { + font-size: 0.8rem; + line-height: 20px; + min-height: 20px; + min-width: 20px; + width: auto; + height: auto; + vertical-align: middle; + text-align: center; + display: inline-block; + padding: 0 7px; + border-radius: 0.75rem; + } + } + } + } + &--user-role { + .kt-list-timeline__items { + &:before { + background-color: transparent; + } + } + } +} + + + + +// badge +.kt-badge { + background: #eaeaea; + color: #444; + font-size: 0.8rem; + line-height: 20px; + min-height: 20px; + min-width: 20px; + vertical-align: middle; + text-align: center; + display: inline-block; + padding: 0 3px; + border-radius: 0.75rem; + &--wide { + letter-spacing: 0.6px; + padding: 1px 10px; + border-radius: 0.75rem; + } + &--success { + background-color: #34bfa3; + color: #fff; + } + &--metal { + background-color: #c4c5d6; + color: #fff; + } + &--danger { + background-color: #f4516c; + color: #fff; + } +} + +.kt-list-timeline__badge--primary:before { + background-color: #5867dd !important; + color: #fff; +} + + + + +.kt-form.kt-form--group-seperator-dashed .kt-form__group { + border-bottom: 1px dashed #ebedf2; +} + +.kt-timeline-3 .kt-timeline-3__items .kt-timeline-3__item { + display: table; + position: relative; + margin-bottom: 1.75rem; +} + + + +// Role permissions +.kt-timeline-3 { + .kt-timeline-3__items--rolePermissions { + .kt-timeline-3__item { + display: block !important; + border-left: 0; + margin-bottom: 0 !important; + &-child { + border-left: 0; + } + .kt-timeline-3__item-time { + position: static !important; + } + } + } +} +.kt-bg-grey { + background-color: #f7f8fa; +} +.kt-border-bottom-grey { + border-bottom: 1px solid #eceff5; +} +.kt-py-15 { + padding-top: 15px; + padding-bottom: 15px; +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/frameworks/bootstrap/_accordion.scss b/src/assets/sass/global/integration/frameworks/bootstrap/_accordion.scss new file mode 100644 index 0000000..47ae970 --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/bootstrap/_accordion.scss @@ -0,0 +1,398 @@ +// +// Accordion +// + + + +// Default Accordion +.accordion { + .card { + overflow: visible !important; + margin: 0; + + .card-header { + cursor: pointer; + margin: 0; + padding: 0; + border-bottom: 0; + + .card-title { + margin: 0; + font-size: 1.1rem; + font-weight: 500; + padding: 1rem 1rem; + color: kt-state-color(brand, base); + display: flex; + justify-content: flex-start; + align-items: center; + + > i { + margin-right: 1rem; + font-size: 1.4rem; + color: kt-state-color(brand, base); + } + + &.collapsed { + color: kt-base-color(label, 3); + + > i { + color: kt-base-color(label, 2); + } + } + + &:after { + right: 1rem; + } + } + } + + .card-body { + padding: 1.25rem; + font-size: 1rem; + } + } + + &--no-bg{ + .card{ + background-color: transparent; + } + } +} + +// Light Accordion +.accordion.accordion-light { + .card { + border: 0; + border-top: 1px solid #eeeef4; + margin: 0; + + .card-header { + cursor: pointer; + padding: 0; + margin: 0; + background-color: transparent; + border: 0; + + .card-title { + margin: 0; + font-size: 1.1rem; + padding: 1rem 1rem 1rem 0; + font-weight: 500; + color: kt-state-color(brand, base); + + &.collapsed { + color: kt-base-color(label, 2); + + &:after { + color: kt-base-color(label, 2); + } + } + + &:after { + right: 0; + } + } + } + + .card-body { + padding: 0; + margin-bottom: 1.25rem; + font-size: 1rem; + } + + // remove border for the last item + &:first-child { + border-top: 0; + + .card-header { + margin: 0; + } + } + + &:last-child { + margin-bottom: 1.25rem;; + + .card-body { + padding: 0; + margin: 0; + } + } + } +} + +// Outline Accordion +.accordion.accordion-outline { + + &--padded{ + padding:1.7rem; + } + + .card { + margin-bottom: 1.25rem; + border:0; + + .card-header{ + padding:0; + background-color: transparent; + + .card-title { + font-size: 1.1rem; + padding: 1.25rem; + border-color: lighten(kt-state-color(brand, base), 20%); + border-top-width: 2px; + border-right-width: 2px; + border-bottom-width: 0; + padding-bottom: calc(1.5rem + 2px); + border-left-width: 2px; + border-style: solid; + border-top-left-radius: $kt-border-radius !important; + border-top-right-radius: $kt-border-radius !important; + + &:after{ + position: absolute; + right: 1.25rem; + @include kt-la-icon-self( kt-get($kt-action-icons, minus) ); + font-size: 1.7rem; + font-weight: bold; + color: kt-state-color(brand, base); + } + + &.collapsed { + color: #464457; + border-color: #efeff0; + border-bottom-width: 2px; + padding-bottom: 1.5rem; + border-bottom-left-radius: $kt-border-radius !important; + border-bottom-right-radius: $kt-border-radius !important; + + &:after{ + content: '#{kt-get($kt-action-icons, plus)}'; + color: #efeff0; + } + } + } + } + + .card-body-wrapper { + >.card-body{ + padding: 0 2.7rem 1.7rem 1.7rem; + font-size:1.1rem; + font-weight: 400; + border-color: lighten(kt-state-color(brand, base), 20%); + border-top-width: 0; + border-right-width: 2px; + border-bottom-width: 2px; + border-left-width: 2px; + border-style: solid; + border-bottom-left-radius: $kt-border-radius !important; + border-bottom-right-radius: $kt-border-radius !important; + color: #8d8c9b; + + > p:last-child { + margin-bottom:0; + } + } + } + + // remove margin on last item + &:last-child{ + margin-bottom: 0; + } + } +} + +// Solid Accordion +.accordion.accordion-solid { + .card { + margin-bottom: 1.5rem; + border:0; + + &:last-child{ + margin-bottom: 0; + } + + .card-header { + padding:0; + background-color: transparent; + + .card-title { + font-size: 1.1rem; + padding: 1.25rem; + background-color: kt-base-color(grey, 2); + + @include kt-rounded { + border-radius: $kt-border-radius; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } + + &.collapsed { + @include kt-rounded { + border-radius: $kt-border-radius; + } + } + } + } + + .card-body { + border: 1px solid kt-base-color(grey, 2); + + @include kt-rounded { + border-bottom-left-radius: $kt-border-radius; + border-bottom-right-radius: $kt-border-radius; + } + } + } +} + +// Custom toggle icon +.accordion.accordion-toggle-arrow { + .card { + .card-header { + .card-title { + color: kt-state-color(brand, base); + position: relative; + + &:after { + position: absolute; + font-size: 1rem; + @include kt-la-icon-self( kt-get($kt-action-icons, down) ); + color: kt-state-color(brand, base); + } + + &.collapsed { + color: kt-base-color(label, 2); + + &:after { + color: kt-base-color(label, 2); + content: '#{kt-get($kt-action-icons, right)}'; + } + } + } + } + } +} + +// Custom toggle icon +.accordion.accordion-toggle-plus { + .card { + .card-header { + .card-title { + color: kt-brand-color(); + position: relative; + + &:after { + position: absolute; + @include kt-la-icon-self( kt-get($kt-action-icons, minus) ); + font-size: 1.2rem; + color: kt-brand-color(); + } + + &.collapsed { + color: kt-base-color(label, 2); + + &:after { + color: kt-base-color(label, 2); + content: '#{kt-get($kt-action-icons, plus)}'; + } + } + } + } + } +} + +// SVG icon +.accordion.accordion-svg-icon { + .card { + border-top:0; + + .card-header { + .card-title { + color: kt-base-color(label, 4); + position: relative; + font-size: 1.2rem; + + .kt-svg-icon{ + margin-right: 1.2rem; + transform: rotate(90deg); + flex: 0 0 2rem; + @include kt-transition; + } + + &.collapsed { + color: kt-base-color(label, 4); + + .kt-svg-icon{ + transform: rotate(0); + } + } + } + } + + .card-body{ + padding-left: 3.2rem; + } + + &:last-child{ + .card-body{ + padding-left: 3.2rem; + } + } + } +} + +// SVG toggle +.accordion.accordion-toggle-svg{ + .card{ + .card-header{ + .card-title{ + color: kt-base-color(label, 4); + font-size: 1.2rem; + background-color: kt-state-color(brand, inverse); + + .kt-svg-icon{ + margin: auto 0 auto auto; + transform: rotate(90deg); + @include kt-transition; + } + + &.collapsed { + color: kt-base-color(label, 4); + + .kt-svg-icon{ + transform: rotate(0); + } + } + } + } + } +} + +// Panel +.accordion.accordion-panel { + .card { + @include kt-rounded { + border-radius: $kt-border-radius !important; + } + + .card-header { + .card-title { + font-size: 1.1rem; + padding: 1.25rem; + background-color: #fff; + + @include kt-rounded { + border-radius: $kt-border-radius !important; + } + } + } + + .card-body { + padding-top: 0; + border: 0; + @include kt-rounded { + border-radius: $kt-border-radius !important; + } + } + } +} diff --git a/src/assets/sass/global/integration/frameworks/bootstrap/_alert.scss b/src/assets/sass/global/integration/frameworks/bootstrap/_alert.scss new file mode 100644 index 0000000..75675b2 --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/bootstrap/_alert.scss @@ -0,0 +1,161 @@ +// +// Alert +// + + + + +.alert { + display: flex; + align-items: stretch; + padding: 1rem 2rem;; + margin: 0 0 $grid-gutter-width 0; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + .alert-icon { + display: flex; + align-items: center; + padding: 0 1.25rem 0 0; + + i { + font-size: 2.4rem; + } + + &.alert-icon-top { + align-items: flex-start; + align-content: stretch; + } + } + + .alert-text { + align-self: center; + flex-grow: 1; + } + + .alert-close { + padding: 0 0 0 1rem; + display: flex; + align-items: center; + justify-content: flex-end; + + .close { + text-shadow: none !important; + } + + i { + opacity: 0.8; + transition: all 0.3s ease; + cursor: pointer; + + &:hover { + transition: all 0.3s ease; + opacity: 1; + } + } + } + + // Elevate + &.alert-elevate { + box-shadow: 0px 0px 13px 0px rgba(82, 63, 105, 0.1); + } + + // States + @each $name, $color in $kt-state-colors { + &.alert-#{$name} { + background: kt-get($kt-state-colors, $name, base); + border: 1px solid kt-get($kt-state-colors, $name, base); + color: kt-get($kt-state-colors, $name, inverse); + + .alert-icon { + i { + color: kt-get($kt-state-colors, $name, inverse); + } + } + + .alert-text { + color: kt-get($kt-state-colors, $name, inverse); + + hr { + border-top-color: kt-get($kt-state-colors, $name, inverse); + opacity: 0.4; + } + } + + .alert-close { + i { + color: kt-get($kt-state-colors, $name, inverse); + } + } + } + + &.alert-outline-#{$name} { + border: 1px solid kt-get($kt-state-colors, $name, base); + color: kt-get($kt-state-colors, $name, base); + + .alert-icon { + i { + color: kt-get($kt-state-colors, $name, base); + } + } + + .alert-text { + color: kt-get($kt-state-colors, $name, base); + } + + .alert-close { + i { + color: kt-get($kt-state-colors, $name, base); + } + } + } + + &.alert-solid-#{$name} { + background: rgba(kt-get($kt-state-colors, $name, base), 0.1); + border-color: transparent; + color: kt-get($kt-state-colors, $name, base); + + .alert-icon { + i { + color: kt-get($kt-state-colors, $name, base); + } + } + + .alert-text { + color: kt-get($kt-state-colors, $name, base); + } + + .alert-close { + i { + color: kt-get($kt-state-colors, $name, base); + } + } + } + } + + // Secondary alert + &.alert-secondary { + .alert-icon { + i { + color: kt-base-color(label, 2); + } + } + + .alert-text { + color: kt-base-color(label, 3); + } + } + + // Marginless + &.alert--marginless { + margin: 0; + } + + &.alert-bold { + .alert-text { + font-weight: 500; + } + } +} diff --git a/src/assets/sass/global/integration/frameworks/bootstrap/_badge.scss b/src/assets/sass/global/integration/frameworks/bootstrap/_badge.scss new file mode 100644 index 0000000..23db20d --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/bootstrap/_badge.scss @@ -0,0 +1,9 @@ +// +// Badge Customization +// + + + +.badge { + font-weight: 400; +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/frameworks/bootstrap/_button-group.scss b/src/assets/sass/global/integration/frameworks/bootstrap/_button-group.scss new file mode 100644 index 0000000..797c414 --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/bootstrap/_button-group.scss @@ -0,0 +1,54 @@ +// +// Button Group Customization +// + + +.btn-group{ + + &.btn-pill{ + border-radius: 2rem; + overflow: hidden; + + @each $name, $color in $kt-state-colors { + .btn-#{$name}{ + @if $name == 'metal'{ + color: kt-get($color, base); + background-color: kt-get($color, inverse); + border-color: kt-get($color, inverse); + } + border-width: 1px; + border-style: solid; + + .show > &, + &.active, + &:active, + &:hover { + @if $name == 'metal'{ + color: kt-get($color, inverse); + background-color: kt-get($color, base); + border-color: kt-get($color, base); + } + } + } + } + } + + &.btn-elevated{ + box-shadow: $btn-elevate-shadow-1; + } + + @include kt-mobile{ + &.btn-pill{ + border-radius: 0; + + .nav{ + justify-content: center; + } + + .btn{ + margin-bottom: 0.5rem; + border-radius: 2rem; + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/frameworks/bootstrap/_buttons.scss b/src/assets/sass/global/integration/frameworks/bootstrap/_buttons.scss new file mode 100644 index 0000000..68fa27c --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/bootstrap/_buttons.scss @@ -0,0 +1,602 @@ +// +// Button Customization +// + + + +// Base button +.btn { + background: transparent; + outline: none !important; + vertical-align: middle; + + &:focus:not(.btn-elevate) { + box-shadow: none !important; + } +} + +// Tags +label.btn, +input.btn, +button.btn { + cursor: pointer; +} + +// Clean button +.btn.btn-clean { + border-color: transparent; + background: transparent; + color: kt-base-color(shape, 3); + + i { + color: kt-base-color(shape, 3); + } + + .show > &, + &.active, + &:active, + &:hover { + color: kt-brand-color(); + background: kt-base-color(shape, 1); + + i { + color: kt-brand-color(); + } + } +} + +// Default button +.btn.btn-default { + border: 0; + background: transparent; + color: kt-base-color(label, 2); + border: 1px solid kt-base-color(shape, 2); + + i { + color: kt-base-color(shape, 3); + } + + .show > &, + &.active, + &:active, + &:hover { + i { + color: kt-brand-color(inverse); + } + + color: kt-brand-color(inverse); + background: kt-brand-color(); + border-color: kt-brand-color(); + } +} + +// Secondary button +.btn-secondary { + background-color: transparent; + border: 1px solid $input-border-color; + color: $btn-secondary-color; + + .show > &.dropdown-toggle, + &:focus, + &.active, + &:active, + &:hover { + color: $btn-secondary-color; + border-color: $input-border-color; + background-color: $btn-secondary-hover-bg-color; + } +} + +// Button states +@each $name, $color in join($kt-state-colors, $kt-social-colors) { + .btn-#{$name} { + @include button-variant(kt-get($color, base), kt-get($color, base)); + color: kt-get($color, inverse); + + @if $name == light { + .show > &.dropdown-toggle, + &:focus, + &.active, + &:active, + &:hover { + background-color: kt-base-color(grey, 1); + border-color: kt-base-color(grey, 1); + } + } + + & + .btn.dropdown-toggle { + position: relative; + + &:before { + display: block; + content: ' '; + border-left: 1px solid kt-get($color, inverse); + position: absolute; + top: 3px; + left: -1px; + bottom: 3px; + opacity: 0.3; + } + + &:hover, + &:focus, + &.active { + &:before { + display: none; + } + } + } + } +} + +// Outline states +@each $name, $color in $kt-state-colors { + .btn-outline-#{$name} { + @include button-outline-variant(kt-get($color, base), kt-get($color, inverse)); + } +} + +// Hover states +@each $name, $color in $kt-state-colors { + .btn-hover-#{$name} { + //background: transparent; + //color: kt-get($color, base); + + .show > &, + &.active, + &:active, + &:hover { + color: kt-get($color, inverse); + background-color: kt-get($color, base); + border-color: kt-get($color, base); + } + } + + .btn-outline-hover-#{$name} { + //background: transparent; + + &.btn-clean { + border: 1px solid transparent; + } + + .show > &, + &.active, + &:active, + &:hover { + color: kt-get($color, base); + border-color: kt-get($color, base); + background-color: transparent; + } + } +} + +// Font states +@each $name, $color in $kt-state-colors { + .btn-font-#{$name} { + color: kt-get($color, base); + } + + .btn-font-hover-#{$name} { + .show > &, + &.active, + &:active, + &:hover { + color: kt-get($color, base); + } + } +} + +// Secondary outline button +.btn.btn-outline-secondary { + color: darken(kt-get($theme-colors, secondary), 50%); + + .show > &, + &.active, + &:active, + &:hover { + background-color: kt-get($theme-colors, secondary); + //color: #fff; + } +} + +// Elevate buttons +.btn { + // Elevate 1 + &.btn-elevate { + transition: all 0.3s ease 0s; + + &.btn-elevate-air { + &:hover { + transform: translate(0, -4px); + } + } + } + + @each $name, $color in $kt-state-colors { + $base-color: kt-get($color, base); + + @if $name == light { + $base-color: #999999; + } + + &.btn-#{$name}.btn-elevate { + box-shadow: 0px 4px 16px 0px rgba($base-color,0.15); + + .show > &, + &:focus, + &.active, + &:active, + &:hover { + box-shadow: 0px 9px 16px 0px rgba($base-color, 0.25) !important; + + &.btn-sm { + box-shadow: 0px 6px 16px 0px rgba($base-color, 0.25) !important; + } + + @if $name == light { + background-color: transparent; + border-color: transparent; + } + } + } + + &.btn-#{$name}.btn-elevate-hover { + .show > &, + &.active, + &:focus, + &:active, + &:hover { + box-shadow: 0px 9px 16px 0px rgba($base-color, 0.25) !important; + + &.btn-sm { + box-shadow: 0px 6px 16px 0px rgba($base-color, 0.25) !important; + } + + @if $name == light { + background-color: transparent; + border-color: transparent; + } + } + } + } +} + +// Square buttons +.btn { + &.btn-square { + border-radius: 0; + } +} + +// Pill buttons +.btn { + &.btn-pill { + border-radius: 2rem; + } +} + +// Text transform +.btn { + &.btn-upper { + text-transform: uppercase; + } + + &.btn-bold { + font-weight: 600; + } + + &.btn-bolder { + font-weight: 600; + } + + &.btn-boldest { + font-weight: 700; + } + + &.btn-thin { + font-weight: 400; + } + + &.btn-lower { + text-transform: lowercase; + } +} + +// Custom sizing +.btn { + &.btn-wide { + padding-left: 2.25rem; + padding-right: 2.25rem; + } + + &.btn-wider { + padding-left: 2.75rem; + padding-right: 2.75rem; + } + + &.btn-widest { + padding-left: 3rem; + padding-right: 3rem; + } + + &.btn-tall { + padding-top: 0.85rem; + padding-bottom: 0.85rem; + } + + &.btn-taller { + padding-top: 1.15rem; + padding-bottom: 1.15rem; + } + + &.btn-tallest { + padding-top: 1.35rem; + padding-bottom: 1.35rem; + } +} + +// Custom font sizing +.btn { + &.btn-font-sm { + font-size: 0.85rem; + } + + &.btn-font-md { + font-size: 1rem; + } + + &.btn-font-lg { + font-size: 1.1rem; + } +} + +// Button with icon +.btn { + //display: inline-flex; + align-items: center; + + @include kt-icons-size((lineawesome: 1.5rem, fontawesome: 1.2rem, flaticon: 1.2rem)); + + i { + padding-right: 0.5rem; + vertical-align: middle; + //line-height: 0; + } + + &.btn-sm { + @include kt-icons-size((lineawesome: 1.3rem, fontawesome: 1rem, flaticon: 1rem)); + + i { + padding-right: 0.35rem; + } + } + + &.btn-lg { + @include kt-icons-size((lineawesome: 1.7rem, fontawesome: 1.4rem, flaticon: 1.3rem)); + + i { + padding-right: 0.75rem; + } + } +} + +// Label button +.btn.btn-label { + background-color: kt-base-color(shape, 1); + color: kt-brand-color(); + cursor: text !important; +} + +.btn.btn-link, +a.btn.btn-label, +button.btn.btn-label, +input.btn.btn-label { + cursor: pointer !important; + + &:focus, + &:hover, + &.active { + background-color: kt-brand-color(); + color: kt-brand-color(inverse); + } +} + +// Label button states +@each $name, $color in join($kt-state-colors, $kt-social-colors) { + .btn.btn-label-#{$name} { + background-color: rgba(kt-get($color, base), 0.1); + color: kt-get($color, base); + cursor: text !important; + } + + .btn.btn-label-#{$name}-o2 { + background-color: rgba(kt-get($color, base), 0.2); + color: kt-get($color, base); + cursor: text !important; + } + + label.btn.btn-label-#{$name}, + a.btn.btn-label-#{$name}, + button.btn.btn-label-#{$name}, + input.btn.btn-label-#{$name} { + cursor: pointer !important; + &:focus, + &:hover, + &.active { + background-color: kt-get($color, base); + color: kt-get($color, inverse); + } + } +} + +// Button with icon only +.btn.btn-icon { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0; + + &.btn-circle { + border-radius: 50%; + } + + i { + padding: 0; + margin: 0; + //line-height: 0; + } + + [class^="socicon-"], + [class*=" socicon-"] { + line-height: 1; + } + + & { + height: 3rem; + width: 3rem; + } + + &.btn-sm { + height: 2.5rem; + width: 2.5rem; + } + + &.btn-lg { + height: 4rem; + width: 4rem; + } + + // Icon sizing + &.btn-icon-sm { + @include kt-icons-size((lineawesome: 1.25rem, fontawesome: 1.15rem, flaticon: 1.15rem)); + } + + // Icon sizing + &.btn-icon-md { + @include kt-icons-size((lineawesome: 1.3rem, fontawesome: 1.2rem, flaticon: 1.2rem)); + } + + &.btn-icon-lg { + @include kt-icons-size((lineawesome: 1.4rem, fontawesome: 1.4rem, flaticon: 1.4rem)); + } + + // Icon button states + @each $name, $color in $kt-state-colors { + &.btn-#{$name} { + i { + color: kt-get($color, inverse); + } + + &:focus, + &:hover, + &.active { + i { + color: kt-get($color, inverse); + } + } + } + } +} + +// Same height with icon btn +.btn-icon-h { + & { + height: 3rem; + } + + &.btn-sm { + height: 2.25rem; + } + + &.btn-lg { + height: 4rem; + } +} + +// Input group workarounds +.input-group-append, +.input-group-prepend { + .btn.btn-icon { + height: auto; + } +} + +// Button with spinner +.btn.kt-spinner { + & { + &:not(.kt-spinner--center) { + padding-left: 3 * $input-btn-padding-x; + + &:before { + left: $input-btn-padding-x; + } + } + + // Right + &.kt-spinner--right { + padding-left: $input-btn-padding-x; + padding-right: 3 * $input-btn-padding-x; + + &:before { + left: auto; + right: $input-btn-padding-x; + } + } + } + + &.kt-spinner--sm { + &:not(.kt-spinner--center) { + padding-left: 2.5 * $input-btn-padding-x; + + &:before { + left: $input-btn-padding-x; + } + } + + // Right + &.kt-spinner--right { + padding-left: $input-btn-padding-x; + padding-right: 2.5 * $input-btn-padding-x; + + &:before { + left: auto; + right: $input-btn-padding-x; + } + } + } + + &.kt-spinner--lg { + &:not(.kt-spinner--center) { + padding-left: 3.5 * $input-btn-padding-x; + + &:before { + left: $input-btn-padding-x; + } + } + + // Right + &.kt-spinner--right { + padding-left: $input-btn-padding-x; + padding-right: 3.5 * $input-btn-padding-x; + + &:before { + left: auto; + right: $input-btn-padding-x; + } + } + } +} + +// Button glow style +.btn{ + &.btn-glow { + box-shadow: 0px 2px 14px 2px rgba(255,255,255,0.1); + + .show > &, + &.active, + &:active, + &:hover { + box-shadow: 0px 2px 14px 2px rgba(255,255,255,0.3); + } + } +} diff --git a/src/assets/sass/global/integration/frameworks/bootstrap/_code.scss b/src/assets/sass/global/integration/frameworks/bootstrap/_code.scss new file mode 100644 index 0000000..5df0389 --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/bootstrap/_code.scss @@ -0,0 +1,14 @@ +// +// Code Customization +// + + + +code { + background-color: kt-base-color(grey, 1); + padding: 0.15rem 0.25rem; + + @include kt-rounded { + border-radius: $kt-border-radius; + } +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/frameworks/bootstrap/_dropdown.scss b/src/assets/sass/global/integration/frameworks/bootstrap/_dropdown.scss new file mode 100644 index 0000000..a2d3c74 --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/bootstrap/_dropdown.scss @@ -0,0 +1,213 @@ +// +// Dropdown +// + + + +$kt-dropdown-menu-widths: ( + xs: 160px, + sm: 240px, + md: 260px, + lg: 320px, + xl: 380px, +); + +// Base +.dropdown-menu { + border: 0 !important; + margin: 0; + border-radius: 0; + min-width: 14rem; + padding: 0; + box-shadow: $dropdown-box-shadow; + padding: 1rem 0; + + // Fit options + &.dropdown-menu-fit { + padding: 0; + } + + &.dropdown-menu-fit-bottom { + padding-bottom: 0; + } + + &.dropdown-menu-fit-top { + padding-top: 0; + } + + &.dropdown-menu-fit:not(.dropdown-menu-top-unround) { + > div:first-of-type { + @include kt-rounded { + border-top-left-radius: $kt-border-radius; + border-top-right-radius: $kt-border-radius; + } + } + + @include kt-rounded { + form { + border-top-left-radius: $kt-border-radius; + border-top-right-radius: $kt-border-radius; + } + } + } + + @include kt-rounded { + border-radius: $kt-border-radius; + + &.dropdown-menu-top-unround { + border-top-left-radius: 0; + border-top-right-radius: 0; + } + } + + &:before, + &:after { + display: none !important; + } + + > li > a, + > .dropdown-item { + outline: none !important; + display: flex; + flex-grow: 1; + padding: 0.7rem 1.2rem; + + @include kt-icons-size((lineawesome: 1.4rem, fontawesome: 1.4rem, flaticon: 1.3rem)); + + > i { + margin-right: 0.75rem; + color: kt-base-color(label, 2); + + &:before { + line-height: 0; + vertical-align: middle; + } + } + } + + .dropdown-divider { + border-top: 1px solid kt-base-color(grey, 2); + } + + // RTL mode fix + .dropdown-menu:not(.daterangepicker) { + /*rtl:raw: + left: auto !important; + */ + } + + @each $name, $width in $kt-dropdown-menu-widths { + &.dropdown-menu-#{$name} { + width: $width; + } + } + + // Animations + &.dropdown-menu-anim { + animation: dropdown-menu-fade-in .3s ease 1, dropdown-menu-move-up .3s ease-out 1; + } + + .dropup &, + .dropdown-menu-anim-down { + &.dropdown-menu-anim { + animation: dropdown-menu-fade-in .3s ease 1, dropdown-menu-move-down .3s ease-out 1; + } + } + + // Alignment + left: 0#{'/*rtl:ignore*/'}; + /*rtl:raw: + right: auto; + */ + + // mobile mode + @include kt-mobile { + &.dropdown-menu-xl, + &.dropdown-menu-lg, + &.dropdown-menu-md { + width: 300px; + } + } +} + +// Dropdown toggle +.nav-link.dropdown-toggle, +.btn.dropdown-toggle { + &:after { + text-align: center; + display: inline; + border: 0; + font-size: 0.6rem; + line-height: 0; + vertical-align: middle; + position: relative; + margin-left: 0.5rem#{'/*rtl:ignore*/'}; + opacity: 0.7; + + //@include kt-arrow-icon(down, true); + @include kt-flaticon2-icon(kt-get($kt-action-bold-icons, down)); + } + + &.dropdown-toggle-split { + &:after { + right: 1px; + } + } +} + +// Inline dropdown button +.dropdown.dropdown-inline { + display: inline-block; +} + +// Directions +.dropup { + .nav-link.dropdown-toggle, + .btn.dropdown-toggle { + &:after { + @include kt-flaticon2-icon(kt-get($kt-action-bold-icons, up)); + } + } +} + +.btn-group.dropright { + .nav-link.dropdown-toggle, + .btn.dropdown-toggle { + &:before { + display: none; + } + + &:after { + @include kt-flaticon2-icon(kt-get($kt-action-bold-icons, right)); + } + } +} + +.btn-group.dropleft { + .nav-link.dropdown-toggle, + .btn.dropdown-toggle { + &:before { + display: none; + } + + &:after { + @include kt-flaticon2-icon(kt-get($kt-action-bold-icons, left)); + } + } +} + +// Animations +@keyframes dropdown-menu-fade-in { + from { opacity: 0; } + to { opacity: 1; } +} + +@keyframes dropdown-menu-move-down { + from { margin-top: -10px } + to { margin-top: 0; } +} + +@keyframes dropdown-menu-move-up { + from { margin-top: 10px } + to { margin-top: 0; } +} diff --git a/src/assets/sass/global/integration/frameworks/bootstrap/_forms.scss b/src/assets/sass/global/integration/frameworks/bootstrap/_forms.scss new file mode 100644 index 0000000..e916964 --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/bootstrap/_forms.scss @@ -0,0 +1,114 @@ +// +// Forms +// + + +// Form group +.form-group { + margin-bottom: 2rem; + + &.form-group-marginless, + &.form-group-last { + margin-bottom: 0px; + } + + label { + font-size: 1rem; + font-weight: 400; + } + + .invalid-feedback, + .valid-feedback { + font-weight: 400; + } + + .form-text { + font-size: 0.9rem; + } + + // Space sizing + &.form-group-md { + margin-bottom: 1rem; + } + + &.form-group-sm { + margin-bottom: 0.5rem; + } + + &.form-group-xs { + margin-bottom: 0.25rem; + } + + &.form-group-last { + margin-bottom: 0rem; + } +} + +// Form control +.form-control { + &:focus, + &:active { + box-shadow:none !important; + } + + &[readonly] { + background-color: $input-readonly-bg; + } + + // Pill style + &.form-control-pill { + border-radius: 50px; + } +} + +// Custom inputs +.custom-select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.custom-file { + width: 100%; +} + +.custom-file-input:focus ~ .custom-file-label { + box-shadow: none !important; +} + +.custom-file-label { + text-align: left; + + &:after { + float: left; + } +} + + +// Input Group +.input-group { + @include kt-icons-size((lineawesome: 1.4rem, fontawesome: 1.2rem, flaticon: 1.2rem)); + + i { + color: $input-group-icon-color; + line-height: 0; + } + + .form-control.is-valid + .input-group-append, + .form-control.is-invalid + .input-group-append { + margin-left: 0; + } + + .input-group-prepend + .form-control.is-valid, + .input-group-prepend + .form-control.is-invalid { + margin-left: 1px; + } +} + +// Validation +.validated { + .valid-feedback, + .invalid-feedback { + display: block; + } +} diff --git a/src/assets/sass/global/integration/frameworks/bootstrap/_grid.scss b/src/assets/sass/global/integration/frameworks/bootstrap/_grid.scss new file mode 100644 index 0000000..d461908 --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/bootstrap/_grid.scss @@ -0,0 +1,55 @@ +// +// Grid Customization +// + + + +.row { + // Paddingless row + &.row-no-padding { + margin-left: 0; + margin-right: 0; + + > div { + padding-left: 0; + padding-right: 0; + } + } + + // Full height row + &.row-full-height { + height: 100%; + } + + // Stretch column + .col-stretch { + display: flex; + align-items: stretch; + } + + // row separator + &[class*="row-col-separator-"] { + > div { + border-bottom: 1px solid kt-base-color(grey, 2); + + &:last-child { + border-bottom: 0; + } + } + } + + @each $name, $value in $kt-media-breakpoints { + @include kt-media-above($value) { + &.row-col-separator-#{$name} { + > div { + border-bottom:0; + border-right: 1px solid kt-base-color(grey, 2); + + &:last-child { + border-right: 0; + } + } + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/frameworks/bootstrap/_modal.scss b/src/assets/sass/global/integration/frameworks/bootstrap/_modal.scss new file mode 100644 index 0000000..5e520a9 --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/bootstrap/_modal.scss @@ -0,0 +1,133 @@ +// +// Modal +// + + + + +// Base +.modal { + .modal-content { + @include kt-rounded { + border-radius: $kt-border-radius; + } + + .modal-header { + .modal-title { + font-weight: 500; + font-size: 1.3rem; + color: kt-base-color(label, 4); + + small { + font-weight: 400; + font-size: 0.9rem; + color: kt-base-color(label, 2); + } + } + + .close { + outline:none !important; + color: kt-base-color(label, 2); + + @include kt-close-icon(); + @include kt-hover-transition(); + + &:before { + font-size: 1.3rem; + } + + span { + display: none; + } + + &:hover { + color: kt-brand-color(); + } + } + } + } + + // Stick to bottom right + &.modal-sticky-bottom-right { + $width-default: 500px; + $width-lg: 600px; + + padding: 0 !important; + max-width: $width-default; + + &.modal-sticky-lg { + max-width: $width-lg; + } + + height: auto; + position: fixed; + left: auto; + top: auto; + bottom: 25px; + right: 25px; + margin: 0; + box-shadow: 0px 0px 60px -15px rgba(0, 0, 0, 0.2); + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + @include kt-tablet-and-mobile { + bottom: 10px; + right: 10px; + } + + @include kt-mobile { + max-width: 90%; + } + + .modal-dialog { + position: static; + max-width: $width-default; + width: auto; + margin: 0; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + .modal-content { + border: 0; + @include kt-rounded { + border-radius: $kt-border-radius; + } + } + } + + &.modal-sticky-lg { + .modal-dialog { + max-width: $width-lg; + } + } + } +} + +.modal-open { + overflow: auto !important; + padding: 0 !important; +} + +.modal-body { + &.modal-body-fit { + padding: 0; + } + &.modal-body-x-fit { + padding-left: 0; + padding-right: 0; + } + &.modal-body-y-fit { + padding-top: 0; + padding-bottom: 0; + } +} + +@include kt-media-above(xl) { + .modal-dialog.modal-xl { + max-width: kt-media-breakpoint(xl) - 100px; + } +} diff --git a/src/assets/sass/global/integration/frameworks/bootstrap/_pagination.scss b/src/assets/sass/global/integration/frameworks/bootstrap/_pagination.scss new file mode 100644 index 0000000..97a1711 --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/bootstrap/_pagination.scss @@ -0,0 +1,44 @@ +// +// Pagination +// + + + +.pagination{ + + &.pagination--grid{ + flex:1; + display:flex; + justify-content: center; + margin:0; + + .page-item{ + + .page-link{ + background-color: transparent; + border: 0; + font-weight: 400; + color: #928eaa; + border-radius: 5px; + width: 2.25rem; + height: 2.25rem; + display: flex; + justify-content: center; + align-items: center; + font-size: 1.2rem; + margin: 0 0.1rem; + @include kt-transition; + } + + &.active, + &:hover, + &:focus{ + + .page-link{ + background-color: kt-state-color(brand, base); + color: kt-state-color(brand, inverse); + } + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/frameworks/bootstrap/_popover.scss b/src/assets/sass/global/integration/frameworks/bootstrap/_popover.scss new file mode 100644 index 0000000..c43eedf --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/bootstrap/_popover.scss @@ -0,0 +1,16 @@ +// +// Popover +// + + + +// Base +.popover { + box-shadow: $popover-box-shadow; + + .popover-header { + font-size: 1rem; + font-weight: 500; + border-bottom: 1px solid kt-base-color(grey, 2); + } +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/frameworks/bootstrap/_progress.scss b/src/assets/sass/global/integration/frameworks/bootstrap/_progress.scss new file mode 100644 index 0000000..1f5e3e8 --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/bootstrap/_progress.scss @@ -0,0 +1,27 @@ +// +// Progress +// + +.progress { + background-color: kt-base-color(grey, 2); + + .progress-bar { + transition: all 0.5s ease; + } + + &.progress-sm { + height: 6px; + + .progress-bar { + border-radius: 3px; + } + } + + &.progress-lg { + height: 20px; + + .progress-bar { + border-radius: 4px; + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/frameworks/bootstrap/_table.scss b/src/assets/sass/global/integration/frameworks/bootstrap/_table.scss new file mode 100644 index 0000000..38831da --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/bootstrap/_table.scss @@ -0,0 +1,87 @@ +// +// Table +// + + + +.table { + + th, td{ + &.table-center{ + text-align: center; + } + } + + thead { + th, td { + font-weight: 500; + border-bottom-width: 1px; + padding-top: 1rem; + padding-bottom: 1rem; + } + } + + tr.table-active { + td, th { + color: kt-state-color(primary, inverse); + } + } + + &.table-head-noborder { + thead { + th, td { + border-top: 0; + } + } + } + + &.table-head-solid { + thead { + th, td { + background-color: kt-base-color(grey, 1); + } + } + } + + &.table-light{ + tr{ + border-radius: 5px; + color: #9392a0; + + &:nth-child(even){ + background-color: kt-base-color(grey,1); + } + + td.table-row-title{ + color: kt-base-color(label, 4); + } + } + + thead{ + tr{ + background-color: rgba(kt-state-color(brand, base), 0.15); + color: kt-state-color(brand, base); + } + } + + @each $name, $color in $kt-state-colors{ + + &--#{$name}{ + thead{ + tr{ + color: kt-state-color(#{$name}, base); + background-color: rgba(kt-state-color(#{$name}, base), 0.15); + } + } + } + } + } +} + +.table:not(.table-bordered) { + thead { + th, td { + border-top: 0; + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/frameworks/bootstrap/_tabs-btn.scss b/src/assets/sass/global/integration/frameworks/bootstrap/_tabs-btn.scss new file mode 100644 index 0000000..155dd1f --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/bootstrap/_tabs-btn.scss @@ -0,0 +1,176 @@ +// +// Tabs +// + + +// Base +.nav-pills.nav-tabs-btn { + @include kt-clearfix(); + display: flex; + justify-content: center; + + .nav-item { + max-width: 100%; + min-width: 75px; + margin: 0.5rem; + box-shadow: rgba(69, 65, 78, 0.06) 0px 1px 15px 1px; + border-radius: 0.5rem; + text-align: center; + + .nav-link { + display: flex; + justify-content: center; + flex-direction: column; + align-items: center; + padding: 0.85rem 0.75rem; + + .nav-link-icon { + display: block; + padding-bottom: 0.5rem; + + i { + margin: 0; + font-size: 1.3rem; + } + } + + .nav-link-title { + display: block; + font-weight: 500; + } + } + } + + .nav-link { + border: 0; + padding: 12px 0; + font-size: 1rem; + font-weight: 400; + + @include kt-icons-style(font-size, (fontawesome: 1.2rem, lineawesome: 1.3rem, flaticon: 1.4rem) ); + + i { + vertical-align: middle; + line-height: 0; + display: inline-block; + margin-right: 0.5rem; + } + } + + &.nav-tabs-btn-2x { + a.nav-link { + border-bottom-width: 2px !important; + } + } + + &.nav-tabs-btn-left { + float: left; + } + + &.nav-tabs-btn-right { + float: right; + } + + // Portlet Tabs + .kt-portlet--tabs & { + margin: 0 0 -1px 0; + + &.nav-tabs-btn-2x { + margin: 0 0 -2px 0; + } + + .nav-item { + display: flex; + align-items: stretch; + + .nav-link { + display: flex; + align-items: center; + } + } + } + + // Bold tab links + &.nav-tabs-bold { + .nav-item { + .nav-link { + font-weight: 500; + } + } + } +} + +// Skin +.nav-pills.nav-tabs-btn { + a.nav-link { + &.active { + .nav-link-icon { + i { + color: #fff; + } + } + + .nav-link-title { + color: #fff; + } + } + + .nav-link-icon { + i { + color: kt-base-color(label, 1); + } + } + + .nav-link-title { + color: kt-base-color(label, 2); + } + } + + // state colors + @each $name, $color in $kt-state-colors { + &.nav-pills-btn-#{$name} { + a.nav-link { + &.active { + background-color: kt-get($color, base); + + .nav-link-icon { + i { + color: kt-get($color, inverse) !important; + } + } + + .nav-link-title { + color: kt-get($color, inverse) !important; + } + } + } + } + } +} + + +// Mobile Mode +@include kt-mobile { + .nav-pills.nav-tabs-btn { + .nav { + .nav-item { + max-width: 100%; + width: 6.5rem; + margin: 0.6rem; + + .nav-link { + + .nav-link-icon { + i { + font-size: 1.2rem; + } + } + + .nav-link-title { + font-size: 1rem; + } + } + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/frameworks/bootstrap/_tabs-line.scss b/src/assets/sass/global/integration/frameworks/bootstrap/_tabs-line.scss new file mode 100644 index 0000000..36c8970 --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/bootstrap/_tabs-line.scss @@ -0,0 +1,257 @@ +// +// Tabs +// + + + + +// Base +@mixin kt-nav-tabs-line-base() { + .nav-tabs.nav-tabs-line { + @include kt-clearfix(); + + margin: 0 0 25px 0; + + .nav-item { + margin-right: 20px; + margin-bottom: -1px; + + @include kt-media-below(xl) { + margin-right: 15px; + } + + &:last-child { + margin-right: 0; + } + } + + .nav-link { + border: 0; + border-bottom: 1px solid transparent; + padding: 12px 0; + font-size: 1rem; + font-weight: 400; + + @include kt-icons-style(font-size, (fontawesome: 1.2rem, lineawesome: 1.3rem, flaticon: 1.2rem) ); + + i { + vertical-align: middle; + line-height: 0; + display: inline-block; + margin-right: 0.5rem; + } + + // svg icons + svg { + margin-right: 0.5rem; + } + } + + &.nav-tabs-line-left { + float: left; + } + + &.nav-tabs-line-right { + float: right; + } + + // Portlet Tabs + .kt-portlet--tabs & { + margin: 0 0 -1px 0.5rem; + border-color: transparent !important; + + &.nav-tabs-line-2x { + margin: 0 0 -2px 0; + } + + .nav-item { + display: flex; + align-items: stretch; + + .nav-link { + display: flex; + align-items: center; + } + } + } + + // Bold tab links + &.nav-tabs-bold { + .nav-item { + .nav-link { + font-weight: 500; + } + } + } + + // Bolder tab links + &.nav-tabs-bolder { + .nav-item { + .nav-link { + font-weight: 600; + } + } + } + + // Bold tab links + &.nav-tabs-lg { + .nav-item { + margin-right: 30px; + + @include kt-media-below(xl) { + margin-right: 15px; + } + + &:last-child { + margin-right: 0; + } + + .nav-link { + padding: 12px 0; + font-size: 1rem; + } + } + } + + // Double line style + &.nav-tabs-line-2x { + border-bottom-width: 2px !important; + + .nav-item { + margin-bottom: -2px; + } + + a.nav-link { + border-bottom-width: 2px !important; + } + } + + // Double line style + &.nav-tabs-line-3x { + border-bottom-width: 3px !important; + + .nav-item { + margin-bottom: -3px; + } + + a.nav-link { + border-bottom-width: 3px !important; + } + } + + // Spacing + &.nav-tabs-space-lg { + .nav-item { + margin-right: 40px; + + &:last-child { + margin-right: 0; + } + + @include kt-tablet-and-mobile { + margin-right: 20px; + + &:last-child { + margin-right: 0; + } + } + } + } + + &.nav-tabs-space-xl { + .nav-item { + margin-right: 50px; + + &:last-child { + margin-right: 0; + } + + @include kt-tablet-and-mobile { + margin-right: 20px; + + &:last-child { + margin-right: 0; + } + } + } + } + } +} + +// Skin +@mixin kt-nav-tabs-line-skin() { + .nav-tabs.nav-tabs-line { + border-bottom: 1px solid kt-base-color(grey, 2); + + &.nav.nav-tabs .nav-link, + a.nav-link { + background-color: transparent; + color: kt-base-color(label, 3); + + i { + color: kt-base-color(label, 1); + } + + &:disabled { + opacity: 0.7; + } + + // svg icons + @include kt-svg-icon-color(kt-base-color(label, 2)); + + &:hover, + &.active { + background-color: transparent; + color: kt-base-color(label, 3); + border-bottom: 1px solid kt-state-color(brand, base); + + > i { + color: kt-state-color(brand, base); + } + + // svg icons + @include kt-svg-icon-color(kt-state-color(brand, base)); + } + } + + // state colors + @each $name, $color in $kt-state-colors { + &.nav-tabs-line-#{$name} { + &.nav.nav-tabs .nav-link, + a.nav-link { + &:hover { + border-bottom: 1px solid kt-get($color, base); + } + + &:hover, + &.active { + color: kt-get($color, base); + border-bottom: 1px solid kt-get($color, base); + + > i { + color: lighten(kt-get($color, base), 5%); + } + } + } + + // Double line style + &.nav-tabs-line-2x, + &.nav-tabs-line-3x { + border-bottom-color: rgba(kt-get($color, base), 0.1); + } + } + } + + // Clear base border + &.nav-tabs-clear { + border-bottom-color: transparent !important; + } + } +} + +// Build +// Base +@include kt-nav-tabs-line-base(); + +// Skin +@include kt-nav-tabs-line-skin(); \ No newline at end of file diff --git a/src/assets/sass/global/integration/frameworks/bootstrap/_tabs.scss b/src/assets/sass/global/integration/frameworks/bootstrap/_tabs.scss new file mode 100644 index 0000000..dc840b1 --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/bootstrap/_tabs.scss @@ -0,0 +1,146 @@ +// +// Tabs +// + + + +// Tabs +.nav-pills, +.nav-tabs { + margin: 0 0 25px 0; + + .nav-item { + .nav-link { + padding: 0.75rem 1.25rem; + font-size: 1rem; + font-weight: 400; + @include kt-transition(); + @include kt-icons-style(font-size, (fontawesome: 1.2rem, lineawesome: 1.3rem, flaticon: 1.4rem) ); + font-size: 1rem; + font-weight: 400; + + i { + vertical-align: middle; + line-height: 0; + display: inline-block; + margin-right: 0.5rem; + } + + &.active, + &:active, + &:hover { + @include kt-transition(); + } + } + } +} + +// Default Tabs +.nav-tabs { + .nav-item { + .nav-link { + color: kt-brand-color(); + + i { + color: kt-brand-color(); + } + + &.active, + &:active, + &:hover { + color: kt-brand-color(); + + i { + color: kt-brand-color(); + } + } + + &.disabled { + color: kt-base-color(label, 2); + + i { + color: kt-base-color(label, 2); + } + } + } + + &.show > .nav-link { + color: kt-brand-color(); + + i { + color: kt-brand-color(); + } + } + } +} + +// Pill Tabs +.nav-pills { + .nav-item { + margin-right: 0.5rem; + + &:last-child { + margin-right: 0; + } + + .nav-link { + color: kt-base-color(label, 3); + + &:active, + &.active, + &.active:hover { + background-color: kt-brand-color(); + color: kt-brand-color(inverse); + } + } + + &.show > .nav-link { + background-color: kt-brand-color(); + color: kt-brand-color(inverse); + } + } + + // Sizing + &.nav-pills-sm { + .nav-item { + .nav-link { + font-size: 0.9rem; + padding: $input-btn-padding-y-sm $input-btn-padding-x-sm; + } + } + } + + // Bold + &.nav-pills-bold { + .nav-item { + .nav-link { + font-weight: 500; + } + } + } + + // Label style + &.nav-pills-label { + .nav-item { + + .nav-link { + &:active, + &.active, + &.active:hover { + background-color: rgba(kt-brand-color(), 0.1); + color: kt-brand-color(); + } + } + + &.show > .nav-link { + background-color: rgba(kt-brand-color(), 0.1); + color: kt-brand-color(); + } + } + } +} + +// Marginless +.nav-fit { + margin: 0 !important; +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/frameworks/bootstrap/_toasts.scss b/src/assets/sass/global/integration/frameworks/bootstrap/_toasts.scss new file mode 100644 index 0000000..ad39c48 --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/bootstrap/_toasts.scss @@ -0,0 +1,110 @@ +// +// Toast +// + + + +// Base +.toast { + // Absolute positioned toast + &.toast-custom { + display: none; + position: absolute; + z-index: $toast-zindex; + top: $toast-spacing; + right: $toast-spacing; + width: $toast-width; + border: 0; + + &.toast-left { + left: $toast-spacing; + right: auto; + } + + &.toast-bottom { + top: auto; + bottom: $toast-spacing; + } + + &.toast-top { + bottom: auto; + top: $toast-spacing; + } + + &.toast-center-v { + top: 45%; + bottom: auto; + } + + &.toast-center-h { + right: auto; + left: 50%; + margin-left: -($toast-width/2); + } + + .toast-header { + padding: 0.5rem 1rem; + } + + .toast-body { + padding: 0.5rem 1rem; + font-size: 0.9rem; + } + + &.show { + display: block; + } + + &.toast-fill { + background-color: #fff; + } + } + + // Title + .toast-title { + font-size: 0.9rem; + font-weight: 500; + color: kt-base-color(label, 3); + margin-right: auto !important; + } + + // Time + .toast-time { + margin-left: 0.5rem; + font-size: 0.85rem; + font-weight: 400; + color: kt-base-color(label, 3); + } + + // Icon + .toast-icon { + margin-right: 0.5rem; + font-size: 1.2rem; + color: kt-base-color(label, 2); + } + + // Close + .toast-close { + @include kt-button-reset(); + + margin-left: 1rem; + display: flex; + align-items: center; + justify-content: center; + + i { + font-size: 1.1rem; + color: kt-base-color(label, 2); + &:before { + line-height: 0; + vertical-align: middle; + } + } + + &:hover { + i { + color: kt-brand-color(); + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/frameworks/bootstrap/_tooltip.scss b/src/assets/sass/global/integration/frameworks/bootstrap/_tooltip.scss new file mode 100644 index 0000000..01359b6 --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/bootstrap/_tooltip.scss @@ -0,0 +1,120 @@ +// +// Tooltip +// + + + +// Base +.tooltip { + .tooltip-inner { + box-shadow: $popover-box-shadow; + } + + &.bs-tooltip-left .arrow, + &.bs-tooltip-auto[x-placement^="left"] .arrow { + /*rtl:raw: + left: auto; + right: 0; + */ + + &:before { + /*rtl:raw: + border-width: 0.4rem 0 0.4rem 0.4rem; + border-left-color: #fff; + */ + } + } + + &.bs-tooltip-right .arrow, + &.bs-tooltip-auto[x-placement^="right"] .arrow { + /*rtl:raw: + right: auto; + left: 0; + */ + + &:before { + /*rtl:raw: + border-width: 0.4rem 0.4rem 0.4rem 0; + border-right-color: #fff; + */ + } + } + + &.tooltop-auto-width { + .tooltip-inner { + white-space:nowrap; + max-width:none; + } + } + + // Skins + // Dark skin + &.tooltip-dark { + $m-bg-color: #2c2e3e; + $m-font-color: #fff; + + .tooltip-inner { + color: $m-font-color; + background: #{$m-bg-color}; + } + + &.bs-tooltip-top { + .arrow::before { + border-top-color: #{$m-bg-color}; + } + } + + &.bs-tooltip-right { + .arrow::before { + border-right-color: #{$m-bg-color}#{'/*rtl:ignore*/'}; + } + } + + &.bs-tooltip-bottom { + .arrow::before { + border-bottom-color: #{$m-bg-color}; + } + } + + &.bs-tooltip-left { + .arrow::before { + border-left-color: #{$m-bg-color}#{'/*rtl:ignore*/'}; + } + } + } + + // Brand skin + &.tooltip-brand { + $m-bg-color: kt-brand-color(); + $m-font-color: kt-brand-color(inverse); + + .tooltip-inner { + color: $m-font-color; + background: #{$m-bg-color}; + } + + &.bs-tooltip-top { + .arrow::before { + border-top-color: #{$m-bg-color}; + } + } + + &.bs-tooltip-right { + .arrow::before { + border-right-color: #{$m-bg-color}#{'/*rtl:ignore*/'}; + } + } + + &.bs-tooltip-bottom { + .arrow::before { + border-bottom-color: #{$m-bg-color}; + } + } + + &.bs-tooltip-left { + .arrow::before { + border-left-color: #{$m-bg-color}#{'/*rtl:ignore*/'}; + } + } + } +} diff --git a/src/assets/sass/global/integration/frameworks/bootstrap/_variables.scss b/src/assets/sass/global/integration/frameworks/bootstrap/_variables.scss new file mode 100644 index 0000000..fa8096c --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/bootstrap/_variables.scss @@ -0,0 +1,212 @@ +// +// Override Bootstrap Variables +// + + + + +$enable-rounded: $kt-rounded; // pass rounded corners setting to bootstrap SASS + +// Fonts +$font-family-base: kt-get($kt-font-families, regular); + + + +// Color System +$primary: kt-get($kt-state-colors, primary, base) !default; +$secondary: #e1e1ef !default; +$success: kt-get($kt-state-colors, success, base) !default; +$info: kt-get($kt-state-colors, info, base) !default; +$warning: kt-get($kt-state-colors, warning, base) !default; +$danger: kt-get($kt-state-colors, danger, base) !default; +$light: #f8f9fa !default; +$dark: #343a40 !default; + +$theme-colors: ( + "primary": $primary, + "secondary": $secondary, + "success": $success, + "info": $info, + "warning": $warning, + "danger": $danger, + "light": $light, + "dark": $dark +); + + + +// Grid breakpoints +// +// Define the minimum dimensions at which your layout will change, +// adapting to different screen sizes, for use in media queries. + +$grid-breakpoints: $kt-media-breakpoints !default; + +// Border Radiues +$border-radius: .25rem !default; +$border-radius-lg: .3rem !default; +$border-radius-sm: .2rem !default; + + +// Form & Button Controls +$btn-font-weight: normal !default; +$input-plaintext-color: kt-base-color(label, 3) !default; +$input-placeholder-color: kt-base-color(label, 2) !default; + +$btn-secondary-color: kt-base-color(label, 3) !default; +$btn-secondary-hover-bg-color: #f4f5f8 !default; +$input-border-radius: $kt-border-radius !default; +$input-btn-padding-y: .65rem; +$input-btn-padding-x: 1rem; +$input-btn-line-height: 1.5; + +$input-btn-padding-y-sm: .5rem; +$input-btn-padding-x-sm: 1rem; +$input-btn-line-height-sm: 1.5; + +$input-btn-padding-y-lg: 1.15rem; +$input-btn-padding-x-lg: 1.65rem; +$input-btn-line-height-lg: 1.5; + +$input-border-color: kt-base-color(grey, 3) !default; +$input-focus-border-color: lighten(kt-state-color(brand, base), 12%); +$input-disabled-bg: kt-base-color(grey, 1) !default; +$input-readonly-bg: #ffffff !default; +$input-group-icon-color: kt-base-color(label, 2) !default; + +$input-group-addon-color: kt-base-color(label, 2) !default; +$input-group-addon-bg: kt-base-color(grey, 1) !default; + +// Button elevate shadows +$btn-elevate-shadow-1: 0px 0px 11px 0px rgba(56,36,99,0.08); +$btn-elevate-shadow-1-hover: 0px 0px 22px 0px rgba(56,36,99,0.11); +$btn-elevate-shadow-2: 0px 0px 11px 0px rgba(56,36,99,0.10); +$btn-elevate-shadow-2-hover: 0px 0px 22px 0px rgba(56,36,99,0.13); +$btn-elevate-shadow-3: 0px 0px 11px 0px rgba(56,36,99,0.12); +$btn-elevate-shadow-3-hover: 0px 0px 22px 0px rgba(56,36,99,0.15); + + +// Table +$table-bg: transparent !default; +$table-accent-bg: lighten(#f4f5f8, 1%); +$table-hover-bg: lighten(#f4f5f8, 2%); +$table-active-bg: kt-state-color(primary, base); + +$table-border-color: kt-base-color(grey, 2); + +$table-head-bg: kt-base-color(grey, 2); +$table-head-color: kt-base-color(label, 3); + + +// Card +$card-border-color: kt-base-color(grey, 2) !default; +$card-cap-bg: kt-base-color(grey, 1) !default; + + +// List group +$list-group-border-color: kt-base-color(grey, 2) !default; +$list-group-hover-bg: kt-base-color(grey, 2) !default; + + +// Modal +$modal-inner-padding: 1.25rem !default; +$modal-header-padding: 1.25rem !default; + +$modal-content-border-color: kt-base-color(grey, 2) !default; +$modal-content-box-shadow-xs: 0 .25rem .5rem rgba(kt-base-color(grey, 2), .5) !default; +$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba(kt-base-color(grey, 2), .5) !default; + +$modal-header-border-color: kt-base-color(grey, 2) !default; +$modal-footer-border-color: kt-base-color(grey, 2) !default; + + +// Pagination +$pagination-color: kt-state-color(brand, base) !default; +$pagination-border-color: kt-base-color(grey, 2) !default; + +$pagination-hover-bg: kt-base-color(grey, 2) !default; +$pagination-hover-border-color: kt-base-color(grey, 2) !default; + +$pagination-disabled-border-color: kt-base-color(grey, 2) !default; + + + +// Popovers +$popover-font-size: 0.9rem !default; +$popover-max-width: 276px !default; +$popover-border-width: 1px !default; +$popover-border-color: #ffffff !default; +$popover-border-radius: 3px !default; +$popover-box-shadow: 0px 0px 20px 0px rgba(0,0,0,0.15) !default; + +$popover-header-bg: #ffffff !default; +$popover-header-color: kt-base-color(label, 3) !default; +$popover-header-padding-y: 1rem !default; +$popover-header-padding-x: 1.25rem !default; + +$popover-body-color: kt-base-color(label, 2) !default; + + + +// Tooltips +$tooltip-font-size: 0.9rem !default; +$tooltip-max-width: 200px !default; +$tooltip-color: kt-base-color(label, 3) !default; +$tooltip-bg: #ffffff !default; +$tooltip-border-radius: 3px !default; +$tooltip-opacity: 1 !default; +$tooltip-padding-y: .75rem !default; +$tooltip-padding-x: 1rem !default; +$tooltip-margin: 0 !default; + +// Custom Toasts +$toast-zindex: $kt-dropdown-zindex + 100 !default; +$toast-spacing: 2rem !default; +$toast-width: 350px !default; +$toast-box-shadow: $kt-dropdown-shadow !default; + +$toast-header-color: kt-base-color(label, 3) !default; +$toast-header-background-color: #fff !default; +$toast-header-border-color: kt-base-color(grey, 2) !default; + + + +// Progress bars +$progress-bg: kt-get-color() !default; + + + +// Dropdown +$dropdown-box-shadow: $kt-dropdown-shadow !default; +$zindex-dropdown: $kt-dropdown-zindex !default; + + + +// Text muted +$text-muted: kt-base-color(label, 2) !default; + + + +// Badges +$badge-padding-y: .5em !default; +$badge-padding-x: .75em !default; +$badge-font-size: 85% !default; + + +// Grid columns +$grid-gutter-width: 20px !default; + + +// Dropdowns +// +// Dropdown menu container and contents. +$dropdown-link-color: kt-base-color(label, 2) !default; +$dropdown-link-hover-color: kt-base-color(label, 3) !default; +$dropdown-link-hover-bg: kt-base-color(grey, 1) !default; + +$dropdown-link-active-color: kt-brand-color(inverse) !default; +$dropdown-link-active-bg: kt-brand-color() !default; + +$dropdown-link-disabled-color: kt-base-color(label, 1) !default; + +$dropdown-header-color: kt-base-color(label, 2) !default; diff --git a/src/assets/sass/global/integration/frameworks/bootstrap/bootstrap.scss b/src/assets/sass/global/integration/frameworks/bootstrap/bootstrap.scss new file mode 100644 index 0000000..5dbcaf6 --- /dev/null +++ b/src/assets/sass/global/integration/frameworks/bootstrap/bootstrap.scss @@ -0,0 +1,26 @@ +// +// Custom Bootstrap Version +// + + + +// Extend Bootstrap +@import "accordion"; +@import "alert"; +@import "badge"; +@import "buttons"; +@import "button-group"; +@import "code"; +@import "dropdown"; +@import "forms"; +@import "grid"; +@import "modal"; +@import "pagination"; +@import "popover"; +@import "progress"; +@import "table"; +@import "tabs"; +@import "tabs-btn"; +@import "tabs-line"; +@import "toasts"; +@import "tooltip"; \ No newline at end of file diff --git a/src/assets/sass/global/integration/plugins/_blockui.scss b/src/assets/sass/global/integration/plugins/_blockui.scss new file mode 100644 index 0000000..182e8f6 --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_blockui.scss @@ -0,0 +1,36 @@ +// +// BlockUI +// + + + + +// Base +.blockui { + background: #fff; + box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.1); + display: table; + table-layout: fixed; + + &.blockui-noshadow { + box-shadow: none; + } + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + >span { + color: kt-base-color(label, 2); + display: table-cell; + vertical-align: middle; + padding: 0.75rem 1.2rem; + font-size: 1rem; + font-weight: 400; + + >.kt-loader, + >.kt-spinner { + margin-right: 1.25rem; + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/plugins/_bootstrap-datepicker.scss b/src/assets/sass/global/integration/plugins/_bootstrap-datepicker.scss new file mode 100644 index 0000000..ff21de6 --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_bootstrap-datepicker.scss @@ -0,0 +1,175 @@ +// +// Bootstrap Datetimepicker +// + + + + +// Base +.datepicker { + width: 265px; + padding: 10px; + + @include kt-not-rounded { + border-radius: 0; + } + + &.datepicker-orient-top { + margin-top: 8px; + } + + table { + width: 100%; + } + + td, + th { + font-weight: regular; + width: 35px; + height: 35px; + + @include kt-rounded { + border-radius: 3px; + } + + @include kt-not-rounded { + border-radius: 0; + } + } + + thead { + th { + color: kt-base-color(label, 2); + + &.prev, + &.datepicker-switch, + &.next { + font-weight: 500; + color: kt-base-color(label, 2); + + i { + font-size: 1.2rem; + color: kt-base-color(label, 2); + + &:before { + line-height: 0; + vertical-align: middle; + } + } + + &:hover { + background: kt-base-color(grey, 1) !important; + } + } + + &.dow { + color: kt-base-color(label, 3); + font-weight: 500; + } + } + } + + tbody { + tr > td { + &.day { + color: kt-base-color(label, 3); + + &:hover { + background: kt-base-color(grey, 2); + color: kt-base-color(label, 3); + } + + &.old { + color: kt-base-color(label, 2); + } + + &.new { + color: kt-base-color(label, 3); + } + + &.selected, + &.selected:hover, + &.active, + &.active:hover { + background: kt-state-color(primary, base); + color: kt-state-color(primary, inverse); + } + + &.today { + position: relative; + background: rgba(kt-state-color(brand, base), 0.7) !important; + color: kt-state-color(brand, inverse) !important; + + &:before { + content: ''; + display: inline-block; + border: solid transparent; + border-width: 0 0 7px 7px; + border-bottom-color: #ffffff; + border-top-color: kt-base-color(grey, 2); + position: absolute; + bottom: 4px; + right: 4px; + } + } + + &.range { + background: kt-base-color(grey, 1); + } + } + + span.year, + span.hour, + span.minute, + span.month { + color: kt-base-color(label, 3); + + &:hover { + background: kt-base-color(grey, 1); + } + + &.focused, + &.focused:hover, + &.active:hover, + &.active.focused:hover, + &.active { + background: kt-state-color(primary, base); + color: kt-state-color(brand, inverse); + } + } + } + } + + tfoot { + tr > th { + &.today, + &.clear { + @include kt-rounded { + border-radius: 3px; + } + font-weight: 500; + + &:hover { + background: kt-base-color(grey, 2); + } + } + } + } + + &.datepicker-inline { + border: 1px solid kt-base-color(grey, 2); + } +} + +.input-daterange { + .input-group-addon { + min-width: 44px; + } + + input { + @include kt-not-rounded { + border-radius: 0 !important; + } + text-align: left; + } +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/plugins/_bootstrap-daterangepicker.scss b/src/assets/sass/global/integration/plugins/_bootstrap-daterangepicker.scss new file mode 100644 index 0000000..8579b7d --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_bootstrap-daterangepicker.scss @@ -0,0 +1,189 @@ +// +// Bootstrap Daterangepicker +// + + + +// Base +.daterangepicker { + padding: 0; + margin: 0; + width: auto; + box-shadow: $kt-dropdown-shadow; + border-radius: $kt-border-radius; + border: 0; + font-family: #{kt-get($kt-font-families, regular)}; + z-index: $kt-dropdown-zindex; + + .modal-open & { + z-index: $kt-modal-zindex + 1; + } + + &:after, + &:before { + display: none; + } + + @include kt-not-rounded { + border-radius: 0 !important; + } + + .ranges { + ul { + padding: 1rem 0; + width: 170px; + } + + li { + padding: 0.7rem 1.75rem; + font-weight: 400; + font-size: 1rem; + color: kt-base-color(label, 3); + transition: color 0.3s ease; + + &:hover, + &.active { + background-color: kt-base-color(grey, 1); + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + } + + &.show-calendar { + .ranges { + border-right: 1px solid kt-base-color(grey, 2); + } + } + + &.show-ranges { + .drp-calendar.left { + border-left: 0; + } + } + + &.show-calendar { + .ranges { + margin-top: 0; + } + } + + .drp-buttons { + padding: 1rem 1.75rem; + border-top: 1px solid kt-base-color(grey, 2); + + .btn { + font-size: 0.9rem; + font-weight: 400; + padding: 0.5rem 1rem; + border-radius: 0; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + } + } + + .drp-calendar { + &.left, + &.right { + padding: 1rem 1.5rem 1rem 1.5rem; + } + + &.left { + border-left: 0 !important; + } + + th { + font-weight: 500; + font-size: 1rem; + color: kt-base-color(label, 3); + + &.month { + font-weight: 400; + color: kt-base-color(label, 2); + } + + &.next, + &.prev { + span { + border-width: 0 1px 1px 0; + border-color: kt-base-color(label, 2); + } + } + + &.next { + span { + margin-right: 1px; + } + } + + &.prev { + span { + margin-left: 1px; + } + } + } + + td { + font-size: 1rem; + color: kt-base-color(label, 3); + + &.available.off { + color: kt-base-color(label, 1); + } + + &.active { + background-color: kt-brand-color(); + color: kt-brand-color(inverse); + border-radius: 0; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + &.start-date { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + + &.end-date { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + + &.start-date.end-date { + @include kt-rounded { + border-radius: $kt-border-radius; + } + } + } + + &.today, + &.today.active { + border-radius: 0; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + background: rgba(kt-state-color(brand, base), 0.7) !important; + color: kt-state-color(brand, inverse) !important; + } + + &.in-range.available:not(.active):not(.off):not(.today) { + background-color: kt-base-color(grey, 1); + color: kt-base-color(label, 3); + } + } + } + + select { + @include kt-rounded { + border-radius: $kt-border-radius; + } + background: transparent !important; + border-color: kt-base-color(grey, 2); + color: kt-base-color(label, 3); + } +} diff --git a/src/assets/sass/global/integration/plugins/_bootstrap-datetimepicker.scss b/src/assets/sass/global/integration/plugins/_bootstrap-datetimepicker.scss new file mode 100644 index 0000000..1dc139a --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_bootstrap-datetimepicker.scss @@ -0,0 +1,192 @@ +// +// Bootstrap Datetimepicker +// + + + + +// Base +.datetimepicker { + width: 265px; + padding: 10px; + left: auto; + + @include kt-not-rounded { + border-radius: 0 !important; + } + + &.datetimepicker-orient-top { + margin-top: 8px; + } + + table { + width: 100%; + } + td, + th { + width: 35px; + height: 35px; + border-radius: 3px; + font-weight: normal; + + @include kt-not-rounded { + border-radius: 0 !important; + } + } + + thead { + th { + i { + font-size: 1.2rem; + } + + &.prev, + &.switch, + &.next { + color: kt-base-color(label, 2); + font-weight: 500; + + .glyphicon { + color: kt-base-color(label, 2); + } + + &:hover { + background: kt-base-color(grey, 1) !important; + } + } + + &.dow { + font-weight: 500; + color: kt-base-color(label, 3); + } + + &.next, + &.prev { + >span { + display: inline-block; + font: normal normal normal 16px/1 "LineAwesome"; + font-size: inherit; + text-decoration: inherit; + text-rendering: optimizeLegibility; + text-transform: none; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-smoothing: antialiased; + font-size: 1.2rem; + } + } + + &.next { + >span { + &:before { + content: "\f112"; + } + } + } + + &.prev { + >span { + &:before { + content: "\f111"; + } + } + } + } + } + + tbody { + tr>td { + span { + color: kt-base-color(label, 3); + } + &.day { + color: kt-base-color(label, 3); + + &:hover { + background: kt-base-color(grey, 1); + } + + &.old { + color: kt-base-color(label, 2); + } + + &.new { + color: kt-base-color(label, 3); + } + + &.selected, + &.active { + background: kt-state-color(primary, base); + color: kt-state-color(primary, inverse); + } + + &.today { + position: relative; + background: rgba(kt-state-color(brand, base), 0.7) !important; + color: kt-state-color(brand, inverse) !important; + + &:before { + content: ''; + display: inline-block; + border: solid transparent; + border-width: 0 0 7px 7px; + border-bottom-color: #ffffff; + border-top-color: kt-base-color(grey, 2); + position: absolute; + bottom: 4px; + right: 4px; + } + } + + &.range { + background: kt-base-color(grey, 1); + } + } + + span.year, + span.hour, + span.minute, + span.month { + color: kt-base-color(label, 3); + + &.focused, + &:hover { + background: kt-base-color(grey, 1); + } + + &.active:hover, + &.active { + background: kt-state-color(primary, base); + color: kt-state-color(primary, inverse); + } + } + } + } + + tfoot { + tr>th { + &.today, + &.clear { + @include kt-rounded { + border-radius: 3px; + } + + font-weight: 500; + + &:hover { + background-color: kt-base-color(grey, 1); + } + } + } + } + + &.datetimepicker-inline { + border: 1px solid kt-base-color(grey, 1); + } +} + +.input-daterange { + .input-group-addon { + min-width: 44px; + } +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/plugins/_bootstrap-markdown.scss b/src/assets/sass/global/integration/plugins/_bootstrap-markdown.scss new file mode 100644 index 0000000..ba89540 --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_bootstrap-markdown.scss @@ -0,0 +1,133 @@ +// +// Markdown +// + + + + +// Base +@mixin kt-bootstrap-markdown-base() { + .md-editor { + @include kt-rounded { + border-radius: $kt-border-radius; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } + + @include kt-not-rounded { + border-radius: 0 !important; + } + + outline: none !important; + + .md-footer, + .md-header { + padding: 10px 10px; + } + + .md-header { + @include kt-rounded { + border-top-left-radius: $kt-border-radius; + border-top-right-radius: $kt-border-radius; + } + + @include kt-not-rounded { + border-radius: 0 !important; + } + + .btn-group { + margin-right: 10px; + + .btn { + background: white; + border: 1px solid kt-base-color(grey, 2); + color: kt-base-color(label, 2); + @include kt-transition(); + + &:hover, + &:focus, + &:active, + &.active { + @include kt-transition(); + color: kt-base-color(label, 3); + background: transparent; + } + } + } + } + + .md-footer { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + + @include kt-not-rounded { + border-radius: 0 !important; + } + } + + > textarea { + padding: 10px 10px; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + + @include kt-not-rounded { + border-radius: 0 !important; + } + } + } +} + +// Skin +@mixin kt-bootstrap-markdown-skin() { + .md-editor { + border: 1px solid $input-border-color; + + &.active { + border: 1px solid $input-border-color; + box-shadow: none; + } + + .md-footer, + .md-header { + background: kt-base-color(grey, 1); + } + + > textarea { + background: kt-base-color(grey, 1); + } + + &.active { + > textarea { + background: kt-base-color(grey, 1); + } + } + } + + // Validation + .is-valid { + .md-editor { + border-color: kt-state-color(success, base); + } + } + + .is-invalid { + .md-editor { + border-color: kt-state-color(danger, base); + } + } +} + +@mixin kt-bootstrap-markdown-validation-state($state, $color) { + .kt-form.kt-form--state .has-#{$state} { + .md-editor { + border: 1px solid $color; + } + } +} + + +// Base +@include kt-bootstrap-markdown-base(); + +// Skin +@include kt-bootstrap-markdown-skin(); \ No newline at end of file diff --git a/src/assets/sass/global/integration/plugins/_bootstrap-maxlength.scss b/src/assets/sass/global/integration/plugins/_bootstrap-maxlength.scss new file mode 100644 index 0000000..d2a03bf --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_bootstrap-maxlength.scss @@ -0,0 +1,24 @@ +// +// Bootstrap Maxlength +// + + + + +// Base +@mixin kt-bootstrap-maxlength-base() { + .bootstrap-maxlength { + z-index: 1040 !important; + + &.kt-badge { + display: inline-flex !important; + } + + .modal & { + z-index: 1060 !important; + } + } +} + +// Base +@include kt-bootstrap-maxlength-base(); \ No newline at end of file diff --git a/src/assets/sass/global/integration/plugins/_bootstrap-notify.scss b/src/assets/sass/global/integration/plugins/_bootstrap-notify.scss new file mode 100644 index 0000000..43c942a --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_bootstrap-notify.scss @@ -0,0 +1,85 @@ +// +// Bootstrap Notify +// + + + + + +.alert[data-notify] { + min-width: 300px; + + .close { + right: 10px !important; + padding: 0.25rem 0 0 2rem; + + @include kt-close-icon(); + font-weight: 300; + + &:before { + font-size: 1.1rem; + color: #fff; + opacity: 0.7; + @include kt-transition(); + } + + &:hover { + &:before { + opacity: 1; + @include kt-transition(); + } + } + } + + @include kt-tablet { + max-width: 70%; + } + + @include kt-mobile { + max-width: 90%; + } + + &[data-notify-position=top-center], + &[data-notify-position=bottom-center] { + width: 30%; + + @include kt-tablet { + width: 70%; + } + + @include kt-mobile { + width: 90%; + } + } + + .icon { + position: absolute; + } + + @include kt-icons-style( font-size, (lineawesome: 1.8rem, fontawesome: 1.6rem, flaticon: 1.8rem) ); + @include kt-icons-style( margin-top, (lineawesome: -0.1rem, fontawesome: -0.1rem, flaticon: -0.4rem) ); + + [data-notify=title] { + display: block; + font-weight: 500; + } + + .icon ~ [data-notify=title] { + padding-left: 2.85rem; + } + + .icon ~ [data-notify=message] { + display: inline-block; + padding-left: 2.85rem; + } + + [data-notify=title]:not(:empty) ~ [data-notify=message] { + margin-top: 0.2rem; + } + + .progress { + margin-top: 0.5rem; + line-height: 0.5rem; + height: 0.5rem; + } +} diff --git a/src/assets/sass/global/integration/plugins/_bootstrap-select.scss b/src/assets/sass/global/integration/plugins/_bootstrap-select.scss new file mode 100644 index 0000000..7ea66c9 --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_bootstrap-select.scss @@ -0,0 +1,287 @@ +// +// Bootstrap Select +// + + + + +// Base +@mixin kt-bootstrap-select-base() { + $kt-general-padding: 10px 15px; + $kt-title-padding: 10px 15px; + + // Bootstrap select base + .bootstrap-select { + > .dropdown-toggle { + position: relative; + outline: none !important; + padding: $input-btn-padding-y $input-btn-padding-x; + + @include kt-rounded { + border-radius: $input-border-radius !important; + } + + &:focus { + outline: none !important; + } + + &:after { + border: 0; + margin-right: -2px; + font-size: 0.6rem; + display: inline-block; + @include kt-flaticon2-icon(kt-get($kt-action-bold-icons, down)); + } + + &:before { + width: auto; + } + } + + .dropdown-menu.inner { + display: block; + + > li { + > a { + display: block; + position: relative; + outline: none !important; + padding: $kt-general-padding; + + &:hover { + text-decoration: none; + } + + // icons + @include kt-icons-size((fontawesome: 1.2rem, lineawesome: 1.2rem, flaticon: 1.1rem)); + + i { + vertical-align: middle; + } + } + + &.selected { + > a { + span.check-mark { + @include kt-la-icon('\f17b'); + top: 50%; + position: absolute; + margin-top: - (0.85rem / 2); + font-size: 0.85rem; + right: $input-btn-padding-x; + display: inline-block; + + &:after { + display: none; + } + } + } + } + + &.divider { + margin: 10px 0; + } + + &.hidden { + display: none; + } + + &.no-results { + padding: $kt-general-padding; + } + } + } + + .popover-title { + padding: $kt-title-padding; + margin-bottom: 5px; + + .close { + display: none; + } + } + + .bs-searchbox, + .bs-actionsbox, + .bs-donebutton { + padding: $kt-title-padding; + } + } +} + +// Skin +@mixin kt-bootstrap-select-skin() { + // Bootstrap select base + .bootstrap-select { + // dropdown button + > .dropdown-toggle { + + &.btn-light, + &.btn-secondary { + background: #fff; + color: $input-plaintext-color; + border-color: $input-border-color; + box-shadow: none; + + &:focus, + &.active { + background-color: transparent; + border-color: $input-focus-border-color; + } + + &.disabled, + &:disabled { + background: $input-disabled-bg; + border-color: $input-disabled-bg + } + + .filter-option { + @include kt-icons { + color: kt-base-color(label, 2); + } + } + } + + &.bs-placeholder { + color: $input-placeholder-color; + + // state colors + @each $name, $color in $kt-state-colors { + &.btn-#{$name} { + color: kt-get($color, inverse); + + > .filter-option { + opacity: 0.8; + } + } + } + } + } + + // menu shown state + &.show { + > .dropdown-toggle { + &.btn-light, + &.btn-secondary { + border-color: $input-focus-border-color; + box-shadow: none; + } + } + } + + // Validation + &.is-invalid { + .btn.dropdown-toggle { + border-color: kt-state-color(danger, base); + + } + } + + &.is-valid { + .btn.dropdown-toggle { + border-color: kt-state-color(success, base); + } + } + + // menu dropdown + .dropdown-menu.inner { + > li { + > a { + .text { + color: kt-base-color(label, 3); + + small { + color: kt-base-color(label, 1); + } + } + + span.check-mark { + color: kt-base-color(label, 2); + } + + @include kt-icons { + color: kt-base-color(label, 1); + } + } + + &.selected, + &:hover { + > a { + background: kt-base-color(grey, 1); + + .text { + color: kt-base-color(label, 3); + } + + @include kt-icons { + color: kt-base-color(label, 1); + } + + span.check-mark { + color: kt-base-color(label, 2); + } + } + } + + &.dropdown-header { + color: kt-base-color(label, 2); + } + + &.selected { + > a { + background: kt-base-color(grey, 1); + } + } + + &.disabled { + > a { + opacity: 0.6; + } + } + + &.divider { + border-bottom: 1px solid kt-base-color(grey, 1); + } + + &.active:not(.selected) { + > a { + background: kt-state-color(primary, base); + + .text { + color: kt-state-color(primary, inverse); + } + + @include kt-icons { + color: kt-state-color(primary, inverse); + } + + span.check-mark { + color: kt-state-color(primary, inverse); + } + } + } + + &.no-results { + color: kt-base-color(label, 2); + } + } + } + + // menu header + .popover-title { + background: kt-base-color(grey, 1); + border: 0; + } + + .dropdown-menu { + margin-top: 1px; + } + } +} + + +// Base +@include kt-bootstrap-select-base(); + +// Skin +@include kt-bootstrap-select-skin(); diff --git a/src/assets/sass/global/integration/plugins/_bootstrap-session-timeout.scss b/src/assets/sass/global/integration/plugins/_bootstrap-session-timeout.scss new file mode 100644 index 0000000..7471e9f --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_bootstrap-session-timeout.scss @@ -0,0 +1,19 @@ +// +// Bootstrap Session Timeout +// + + +#session-timeout-dialog { + .modal-header { + .close { + position: absolute; + right: 25px; + font-size: 0; + top: 1.75rem; + } + + .modal-title { + flex: 1 auto; + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/plugins/_bootstrap-switch.scss b/src/assets/sass/global/integration/plugins/_bootstrap-switch.scss new file mode 100644 index 0000000..fd1bab0 --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_bootstrap-switch.scss @@ -0,0 +1,113 @@ +// +// Bootstrap Switch +// + + + + +[data-switch=true] { + opacity: 0; +} + +.bootstrap-switch { + // Label + .bootstrap-switch-label { + background: #fff; + } + + .bootstrap-switch-handle-on, + .bootstrap-switch-handle-off, + .bootstrap-switch-label { + padding-top: $input-btn-padding-y; + padding-bottom: $input-btn-padding-y; + padding-left: $input-btn-padding-x; + padding-right: $input-btn-padding-x; + line-height: $input-btn-line-height; + letter-spacing: 0.1rem; + font-size: 0.9rem; + font-weight: 400; + } + + &.bootstrap-switch-mini .bootstrap-switch-handle-on, + &.bootstrap-switch-mini .bootstrap-switch-handle-off, + &.bootstrap-switch-mini .bootstrap-switch-label { + font-size: 0.85rem; + line-height: $input-btn-line-height; + } + + &.bootstrap-switch-small .bootstrap-switch-handle-on, + &.bootstrap-switch-small .bootstrap-switch-handle-off, + &.bootstrap-switch-small .bootstrap-switch-label { + padding-top: $input-btn-padding-y-sm; + padding-bottom: $input-btn-padding-y-sm; + padding-left: $input-btn-padding-x-sm; + padding-right: $input-btn-padding-x-sm; + font-size: 0.9rem; + line-height: $input-btn-line-height-sm; + } + + &.bootstrap-switch-large .bootstrap-switch-handle-on, + &.bootstrap-switch-large .bootstrap-switch-handle-off, + &.bootstrap-switch-large .bootstrap-switch-label { + padding: $input-btn-padding-y-lg $input-btn-padding-x-lg; + font-size: 1.1rem; + line-height: $input-btn-line-height-lg; + } +} + +.bootstrap-switch { + display: inline-block; + + &.bootstrap-switch--pill { + .bootstrap-switch { + border-radius: $input-border-radius; + } + } + + &.bootstrap-switch--square { + .bootstrap-switch { + border-radius: 0 !important; + + .bootstrap-switch-handle-off, + .bootstrap-switch-handle-on { + border-radius: 0 !important; + } + } + } +} + +.bootstrap-switch { + border-color: $input-border-color; + + // Label + .bootstrap-switch-label { + color: kt-base-color(label, 2); + background: #fff; + } + + // State colors + @each $name, $color in $kt-state-colors { + .bootstrap-switch-handle-on.bootstrap-switch-#{$name}, + .bootstrap-switch-handle-off.bootstrap-switch-#{$name} { + background-color: kt-get($color, base); + border-color: kt-get($color, base); + color: kt-get($color, inverse); + } + } + + // Default state + .bootstrap-switch-handle-on.bootstrap-switch-default, + .bootstrap-switch-handle-off.bootstrap-switch-default { + background-color: $input-border-color; + border-color: $input-border-color; + color: kt-base-color(label, 2); + } +} + +.bootstrap-switch { + &.bootstrap-switch--air { + .bootstrap-switch { + box-shadow: $btn-elevate-shadow-1; + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/plugins/_bootstrap-timepicker.scss b/src/assets/sass/global/integration/plugins/_bootstrap-timepicker.scss new file mode 100644 index 0000000..3c705a2 --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_bootstrap-timepicker.scss @@ -0,0 +1,74 @@ +// +// Bootstrap Timepicker +// + + + + +// Base +@mixin kt-bootstrap-timepicker-base() { + .bootstrap-timepicker-widget { + left: auto; + width: 175px; + + @include kt-not-rounded { + border-radius: 0; + } + + .bootstrap-timepicker-hour, + .bootstrap-timepicker-minute, + .bootstrap-timepicker-meridian, + .bootstrap-timepicker-second { + @include kt-input-reset(); + } + + table td { + + @include kt-not-rounded { + border-radius: 0 !important; + } + + > a { + border: 0; + + @include kt-not-rounded { + border-radius: 0 !important; + } + + i { + font-size: 1.1rem; + } + } + } + } +} + +// Component Skin +@mixin kt-bootstrap-timepicker-skin() { + .bootstrap-timepicker-widget { + .bootstrap-timepicker-hour, + .bootstrap-timepicker-minute, + .bootstrap-timepicker-meridian, + .bootstrap-timepicker-second { + color: kt-base-color(label, 3); + } + + table td > a { + .la { + font-size: 1.2rem; + color: kt-base-color(label, 2); + } + + &:hover { + background: kt-base-color(grey, 1); + } + } + } +} + + +// Base +@include kt-bootstrap-timepicker-base(); + +// Skin +@include kt-bootstrap-timepicker-skin(); diff --git a/src/assets/sass/global/integration/plugins/_bootstrap-touchspin.scss b/src/assets/sass/global/integration/plugins/_bootstrap-touchspin.scss new file mode 100644 index 0000000..a1f94d3 --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_bootstrap-touchspin.scss @@ -0,0 +1,25 @@ +// +// Bootstrap Timepicker Component +// + + + + +// Base +.bootstrap-touchspin { + .input-group-btn-vertical { + .btn { + justify-content: center; + text-align: center; + + &:first-child { + border-bottom: 0; + } + + i { + padding: 0; + font-size: 1rem; + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/plugins/_ckeditor.scss b/src/assets/sass/global/integration/plugins/_ckeditor.scss new file mode 100644 index 0000000..9d0229b --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_ckeditor.scss @@ -0,0 +1,61 @@ +// +// CKEditor +// + + + + +// Base +.ck-target{ + display: none; +} + +.ck-toolbar{ + border-radius: $kt-border-radius !important; +} + +.ck-content{ + min-height: 200px; + border-radius: $kt-border-radius !important; + + &.ck-focused{ + border-color: kt-state-color(brand, base) !important; + box-shadow: none !important; + } +} + +// CKEditor Classic & Document +.ck-editor{ + .ck-toolbar{ + border-top-left-radius: $kt-border-radius !important; + border-top-right-radius: $kt-border-radius !important; + border-bottom-left-radius: 0 !important; + border-bottom-right-radius: 0 !important; + } + .ck-content{ + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; + border-bottom-left-radius: $kt-border-radius !important; + border-bottom-right-radius: $kt-border-radius !important; + } +} + +// CKEditor Inline / Balloon / Balloon Block +.ck-body .ck-balloon-panel{ + + .ck-content{ + min-height: 200px; + border-color: transparent !important; + + &.ck-focused{ + border-color: kt-state-color(brand, base) !important; + } + } + + &.ck-toolbar-container, .ck-toolbar{ + border-radius: $kt-border-radius !important; + } +} + + + diff --git a/src/assets/sass/global/integration/plugins/_datatables.scss b/src/assets/sass/global/integration/plugins/_datatables.scss new file mode 100644 index 0000000..d388853 --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_datatables.scss @@ -0,0 +1,360 @@ +// +// DataTables +// + + + + +// Base +@mixin kt-datatables-base() { + // Pagination colors + $page-size: 2.25rem; + + // Base wrapper + .dataTables_wrapper { + padding: 0 !important; + + // Table + .dataTable { + width: 100% !important; + border-collapse: initial !important; + border-spacing: 0 !important; + margin: 1rem 0 !important; + + // General + th, td { + vertical-align: middle; + + // Row checkbox + .kt-checkbox { + margin-top: 0.3rem; + margin-bottom: 0; + } + + // Cell alignments + &.dt-center { + text-align: center; + } + + &.dt-left { + text-align: left; + } + + &.dt-right { + text-align: right; + } + + // Sorting + &.sorting_desc, + &.orting_asc_disabled, + &.orting_desc_disabled, + &.sorting_asc, + &.sorting { + &:before, + &:after { + bottom: 1.25rem !important; + } + } + } + + // Filter + .filter { + th, td { + vertical-align: top; + + .input-group + .input-group { + margin-top: 0.5rem; + } + + .btn + .btn { + margin-top: 0.5rem; + } + } + } + + // Group + .group { + th, td { + font-size: 1.1rem; + font-weight: 500; + } + } + } + + // Scrollable + .dataTables_scroll { + margin: 1rem 0 !important; + + .dataTable { + margin: 0 !important; + } + } + + // Pagination + .dataTables_paginate { + .pagination { + .page-item { + margin-left: 0.4rem; + > .page-link { + border-radius: 3px; + + @include kt-not-rounded { + border-radius: 0; + } + + cursor: pointer; + display: flex; + justify-content: center; + align-items: center; + height: $page-size; + min-width: $page-size; + vertical-align: middle; + padding: 0.5rem; + text-align: center; + position: relative; + + font-size: 1rem; + line-height: 1rem; + font-weight: 400; + + > i { + font-size: 1rem; + text-align: center; + display: inline-block; + } + } + } + } + } + + // Filter + .text-right, + .text-left { + .dataTables_filter { + display: inline-block; + } + } + + // Info + .dataTables_info { + padding-top: 0.45rem; + } + + // Custom pager + .dataTables_pager { + text-align: right; + + // Length + .dataTables_length { + margin-right: 0.5rem; + display: inline-block; + + & + .dataTables_paginate { + margin-left: 1rem; + } + } + + // Info + .dataTables_info { + display: inline-block; + margin-right: 0.5rem; + } + + // Pagination + .dataTables_paginate { + display: inline-block; + } + } + + @include kt-tablet-and-mobile { + .dataTables_pager { + margin-top: 1rem; + text-align: center; + } + } + + @include kt-mobile { + .dataTables_paginate { + margin-left: 0 !important; + + .pagination .page-item:first-child { + margin-left: 0 !important; + } + } + + .dataTables_paginate { + .pagination { + display: flex; + justify-content: center; + align-items: center; + } + } + } + + // Responsive mode toggle icon + table.dataTable.dtr-inline.collapsed > tbody > { + tr[role="row"] > td:first-child:before { + box-shadow: none; + border-radius: 0; + top: 50%; + left: 8px; + height: 18px; + width: 18px; + margin-top: -9px; + font-size: 18px; + color: kt-state-color(brand, base); + border: 0; + background-color: transparent; + + @include kt-la-icon-self('\f2c3'); + } + + tr.parent > td:first-child:before { + @include kt-la-icon-self('\f28f'); + color: kt-state-color(brand, base); + background-color: transparent; + } + } + + // Responsive mode row expand details + .child { + .dtr-details { + display: table !important; + + > li { + display: table-row !important; + border: 0 !important; + + .dtr-title { + display: table-cell; + vertical-align: top; + border-bottom: 1px dashed #efefef; + font-weight: 500; + padding: 0.5rem 2rem 0.5rem 0; + + &:after { + content: ':'; + } + } + + .dtr-data { + display: table-cell; + vertical-align: top; + border-bottom: 1px dashed #efefef; + padding: 0.5rem 0; + } + + &:last-child { + .dtr-title { + border-bottom: 0; + } + + .dtr-data { + border-bottom: 0; + } + } + } + } + } + } + + // Bootstrap 4 + .dt-bootstrap4 { + .dropdown { + .dropdown-menu.dropdown-menu-right { + /*rtl:ignore*/ + margin-left: 65px; + } + } + } +} + +@mixin kt-datatables-skin() { + // Pagination colors + $base_color: #f4f3f8; + $page-default: darken($base-color, 3%); + $page-default-font: kt-base-color(label, 3); + $page-hover: kt-state-color(brand, base); + $page-hover-font: kt-state-color(brand, inverse); + $page-active: kt-state-color(brand, base); + $page-active-font: kt-state-color(brand, inverse); + + // Base wrapper + .dataTables_wrapper { + // Table + .dataTable { + // General + th, td { + color: kt-base-color(label, 3); + } + + // Row selected + .selected { + th, td { + background-color: kt-base-color(grey, 1); + color: kt-base-color(label, 3); + } + } + + // Group + .group { + th, td { + background-color: kt-base-color(grey, 1); + } + } + } + + // Pagination + .pagination { + .page-item { + > .page-link { + color: $page-default-font; + border: 0; + outline: none !important; + } + + &.previous, + &.next, + &.last, + &.first { + > .page-link { + background: $page-default; + + &:hover { + background: $page-hover; + color: $page-hover-font; + } + } + } + + &.active { + > .page-link { + background: $page-active; + color: $page-active-font; + } + } + + &:hover { + > .page-link { + background: $page-hover; + color: $page-hover-font; + } + } + + &.disabled, + &.disabled:hover { + > .page-link { + opacity: 0.6; + } + } + } + } + } +} + +// Build +// Base +@include kt-datatables-base(); + +// Skin +@include kt-datatables-skin(); \ No newline at end of file diff --git a/src/assets/sass/global/integration/plugins/_dropzone.scss b/src/assets/sass/global/integration/plugins/_dropzone.scss new file mode 100644 index 0000000..507dd11 --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_dropzone.scss @@ -0,0 +1,147 @@ +// +// Dropzone +// + + + + +// Base +.dropzone{ + min-height: auto; +} + +.dropzone.dropzone-default { + padding: 20px; + text-align: center; + cursor: pointer; + border: 2px dashed kt-base-color(grey, 2); + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + .dropzone-msg-title { + color: kt-base-color(label, 3); + margin: 0 0 5px 0; + padding: 0; + font-weight: 500; + font-size: 1.2rem; + } + + .dropzone-msg-desc { + color: kt-base-color(label, 2); + font-weight: 400; + font-size: 1rem; + } + + .dz-preview { + .dz-image { + @include kt-rounded { + border-radius: $kt-border-radius; + } + } + } + + // State colors + @each $name, $color in $kt-state-colors { + &.dropzone-#{$name} { + border-color: kt-get($color, base); + } + } +} + +// Multipe upload +.dropzone.dropzone-multi { + border: 0; + padding: 0; + + .dz-message{ + display: none; + } + + .dropzone-panel { + .dropzone-upload, + .dropzone-remove-all{ + display: none; + } + } + + .dropzone-item { + display: flex; + align-items: center; + margin-top: 0.75rem; + + @include kt-rounded { + border-radius: $kt-border-radius; + padding: 0.5rem 1rem; + background-color: darken(#f8f9fc, 1%); + } + + .dropzone-file { + flex-grow: 1; + + .dropzone-filename { + font-size: 0.9rem; + font-weight: 500; + color: kt-base-color(label, 3); + text-overflow: ellipsis; + margin-right: 0.5rem; + + b { + font-size: 0.9rem; + font-weight: 500; + color: kt-base-color(label, 1); + } + } + + .dropzone-error { + margin-top: 0.25rem; + font-size: 0.9rem; + font-weight: 400; + color: kt-state-color(danger); + text-overflow: ellipsis; + } + } + + .dropzone-progress { + width: 15%; + + .progress { + height: 5px; + @include transition; + } + } + + .dropzone-toolbar { + margin-left: 1rem; + display: flex; + flex-wrap: nowrap; + + .dropzone-start, + .dropzone-cancel, + .dropzone-delete { + height: 25px; + width: 25px; + display: inline-flex; + align-items: center; + justify-content: center; + cursor: pointer; + + i { + font-size: 0.8rem; + color: kt-base-color(label, 1); + } + + &:hover { + i { + color: kt-brand-color(); + } + } + } + + .dropzone-start{ + @include transition; + } + } + } +} diff --git a/src/assets/sass/global/integration/plugins/_duallistbox.scss b/src/assets/sass/global/integration/plugins/_duallistbox.scss new file mode 100644 index 0000000..18638d0 --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_duallistbox.scss @@ -0,0 +1,101 @@ +// +// DualListBox +// + + + + +// Base +.dual-listbox { + // Search input + .dual-listbox__search { + width: 225px; + border: 1px solid kt-base-color(grey, 2); + color: $input-plaintext-color; + outline: none !important; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + &:active, + &:focus { + border-color: $input-focus-border-color !important; + } + + &.dual-listbox__search--hidden { + display: none; + } + } + + // Container + .dual-listbox__container { + .dual-listbox__title { + color: kt-base-color(label, 3); + font-weight: 500; + font-size: 1.1rem; + padding: 0.75rem 0.75rem; + + border: 1px solid kt-base-color(grey, 2); + border-bottom: 0; + + @include kt-rounded { + border-top-left-radius: $kt-border-radius; + border-top-right-radius: $kt-border-radius; + } + } + + .dual-listbox__buttons { + margin: 0 1rem; + + .dual-listbox__button { + @include kt-btn-reset(); + + padding: $input-btn-padding-y-sm $input-btn-padding-x-sm; + color: kt-base-color(label, 1); + font-weight: 500; + font-size: 0.9rem; + background-color: #f2f3f7; + transition: all 0.3s ease; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + i { + font-size: 0.6rem; + } + + &:hover { + transition: all 0.3s ease; + color: kt-brand-color(); + } + } + } + + .dual-listbox__selected, + .dual-listbox__available { + width: 225px; + color: $input-plaintext-color; + border: 1px solid kt-base-color(grey, 2); + + @include kt-rounded { + border-bottom-left-radius: $kt-border-radius; + border-bottom-right-radius: $kt-border-radius; + } + + .dual-listbox__item { + padding: 0.75rem 0.75rem; + border-bottom: 1px solid kt-base-color(grey, 2); + + &:last-child { + border-bottom: 0; + } + + &.dual-listbox__item--selected { + background-color: #f2f3f7; + } + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/plugins/_fontawesome5.scss b/src/assets/sass/global/integration/plugins/_fontawesome5.scss new file mode 100644 index 0000000..ed85468 --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_fontawesome5.scss @@ -0,0 +1,58 @@ +// +// Fontawesome5 +// + + + + +.fa-lg { + font-size: 1.33333em !important; +} + +.fa-xs { + font-size: .75em !important; +} + +.fa-sm { + font-size: .875em !important; +} + +.fa-1x { + font-size: 1em !important; +} + +.fa-2x { + font-size: 2em !important; +} + +.fa-3x { + font-size: 3em !important; +} + +.fa-4x { + font-size: 4em !important; +} + +.fa-5x { + font-size: 5em !important; +} + +.fa-6x { + font-size: 6em !important; +} + +.fa-7x { + font-size: 7em !important; +} + +.fa-8x { + font-size: 8em !important; +} + +.fa-9x { + font-size: 9em !important; +} + +.fa-10x { + font-size: 10em !important; +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/plugins/_fullcalendar.scss b/src/assets/sass/global/integration/plugins/_fullcalendar.scss new file mode 100644 index 0000000..c919c7f --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_fullcalendar.scss @@ -0,0 +1,567 @@ +// +// Fullcalendar Component +// + + + + +// Base +@mixin kt-fullcalendar-base() { + $cell-space-x: 0.5rem; + $cell-space-y: 0.5rem; + $head-space-x: 0.5rem; + $head-space-y: 0.75rem; + $head-list-space-x: 1.25rem; + + .fc-unthemed { + // day + .fc-day-grid td:not(.fc-axis) { + padding: $cell-space-y $cell-space-x; + + &.fc-event-container { + padding: 0.2rem $cell-space-x; + } + } + + .fc-axis { + padding-top: $cell-space-y; + padding-bottom: $cell-space-y; + } + + .fc-scroller { + .fc-content-col { + padding: $cell-space-y $cell-space-x; + } + } + + // header + th.fc-day-header { + padding: $head-space-y $head-space-x; + font-size: 1rem; + font-weight: 500; + } + + .fc-list-heading { + .fc-widget-header { + padding: $head-space-y $head-list-space-x; + } + + .fc-list-heading-main, + .fc-list-heading-alt { + font-size: 1rem; + font-weight: 400; + } + + .fc-list-heading-main { + font-weight: 500; + text-transform: uppercase; + } + } + + .fc-list-item { + td { + padding: $head-space-y $head-list-space-x; + } + + .fc-event-dot { + border-radius: 50%; + } + } + + // past + td.fc-past { + + } + + // today + td.fc-today { + + } + + // future + td.fc-future { + + } + + // event + .fc-event, + .fc-event-dot { + padding: 0; + + .fc-content { + padding: 0.55rem 0.55rem 0.55rem 2rem; + + &:before { + display: block; + content: " "; + position: absolute; + height: 10px; + width: 10px; + border-radius: 50%; + top: 0.7rem; + left: 0.75rem; + } + } + + &.fc-not-start.fc-end { + .fc-content { + padding-left: 0.5rem; + } + } + + .fc-time { + font-size: 0.9rem; + text-transform: uppercase; + font-weight: 500; + } + + .fc-title { + font-size: 0.9rem; + font-weight: 400; + } + + @include kt-rounded { + border-radius: $kt-border-radius; + } + } + + // + .fc-description { + font-size: 0.9rem; + margin-top: 0.25rem; + font-weight: normal; + } + + .fc-list-item-title > a { + font-size: 1rem; + font-weight: 500; + } + + a.fc-more { + font-size: 0.9rem; + font-weight: 500; + } + + // popover + .fc-popover { + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + .fc-header { + padding: 0.75rem 1.25rem; + + @include kt-rounded { + border-top-left-radius: $kt-border-radius; + border-top-right-radius: $kt-border-radius; + } + + .fc-close { + margin-top: 0.35rem; + } + + .fc-title { + font-weight: 400; + } + } + + .fc-body { + .fc-event-container { + padding: 1.25rem 1.25rem 0.75rem 1.25rem; + } + + .fc-event { + margin-bottom: 0.5rem; + border-radius: $kt-border-radius; + + &.fc-not-start.fc-not-end { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + + &.fc-not-start.fc-end { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + } + } + } + + // toolbar + .fc-toolbar { + margin-bottom: 1.5rem; + + h2 { + font-size: 1.2rem; + font-weight: 500; + text-transform: uppercase; + margin-top: 0.75rem; + } + + .fc-button { + outline: none !important; + height: 2.75rem; + padding: 0 1.25rem; + font-size: 1rem; + + &.fc-corner-left { + @include kt-rounded { + border-top-left-radius:$kt-border-radius; + border-bottom-left-radius:$kt-border-radius; + } + } + + &.fc-corner-right { + @include kt-rounded { + border-top-right-radius:$kt-border-radius; + border-bottom-right-radius:$kt-border-radius; + } + } + + .fc-icon { + font-size: 1.1rem; + + &:after { + display: none; + } + + &.fc-icon-left-single-arrow { + @include kt-la-icon( kt-get($kt-action-icons, left) ); + } + + &.fc-icon-right-single-arrow { + @include kt-la-icon( kt-get($kt-action-icons, right) ); + } + } + } + } + + // time + .fc-axis { + > span { + font-size: 0.9rem; + } + } + } + + .ui-draggable-handle { + cursor: move; /* fallback if grab cursor is unsupported */ + cursor: grab; + cursor: -moz-grab; + cursor: -webkit-grab; + } + + @include kt-tablet-and-mobile { + .fc-unthemed { + // toolbar + .fc-toolbar { + margin-bottom: 1.5rem; + + .fc-left, + .fc-right, + .fc-center { + display: block; + float: none; + margin-bottom: 1rem; + text-align: center; + + h2 { + text-align: center; + float: none; + } + + > .fc-button-group { + display: inline-block; + float: none; + + > .fc-button { + float: none; + } + } + + > .fc-button { + float: none; + } + } + } + } + } +} + +// Skin +@mixin kt-fullcalendar-skin() { + $border-width: 6px; + + .fc-unthemed { + // general elements + + th, td, thead, tbody, .fc-divider, .fc-row, .fc-content, .fc-popover, .fc-list-view, .fc-list-heading td { + border-color: kt-base-color(grey, 2); + } + + // past + td.fc-past { + + } + + // today + td.fc-today { + background: rgba(kt-state-color(brand, base), 0.025); + } + + // future + td.fc-future { + + } + + // event + .fc-day-grid-event { + margin: 0; + } + + .fc-event, + .fc-event-dot { + background: #fff; + border: 1px solid kt-base-color(grey, 2); + + &.fc-not-start.fc-not-end { + border-left: 1px solid kt-base-color(grey, 1); + } + + &.fc-start { + .fc-content:before { + background: kt-base-color(grey, 3); + } + } + + box-shadow: 0px 0px 9px 0px rgba(0,0,0,0.055); + + .fc-time { + color: kt-base-color(label, 3); + } + + .fc-title { + color: kt-base-color(label, 3); + } + } + + .fc-description { + color:kt-base-color(label, 2); + } + + .fc-list-item-title > a[href] { + &:hover { + color: kt-state-color(brand, base); + text-decoration: none; + } + } + + .fc-more { + color: kt-base-color(label, 2); + } + + // event states + .fc-event, + .fc-event-dot { + @each $name, $color in $kt-state-colors { + &.fc-start.fc-event-#{$name} { + .fc-content { + &:before { + background: kt-get($color, base); + } + } + } + + &.fc-not-start.fc-end.fc-event-solid-#{$name}, + &.fc-not-start.fc-not-end.fc-event-solid-#{$name}, + &.fc-start.fc-event-solid-#{$name} { + background: kt-get($color, base); + + .fc-title { + color: kt-get($color, inverse); + } + + .fc-description { + color: kt-get($color, inverse); + } + + .fc-time { + color: kt-get($color, inverse); + } + } + } + } + + .fc-divider, + .fc-popover .fc-header, + .fc-list-heading td { + background: kt-base-color(grey, 1); + } + + .fc-time-grid-event { + overflow: hidden; + } + + // popover + .fc-popover { + box-shadow: 0px 0px 9px 0px rgba(0,0,0,0.075); + background: #fff; + + .fc-header { + background: #fff; + border-bottom: 1px solid kt-base-color(grey, 2); + + .fc-close { + color: kt-base-color(label, 2); + + &:hover { + color: kt-base-color(label, 3); + } + } + + .fc-title { + color: kt-base-color(label, 3); + } + } + + .fc-body { + .fc-event, + .fc-event-dot { + &.fc-not-start.fc-not-end { + .fc-content:before { + background: kt-base-color(grey, 2); + } + } + + @each $name, $color in $kt-state-colors { + &.fc-not-start.fc-not-end.fc-event-#{$name} { + .fc-content:before { + background: kt-get($color, base); + } + } + + &.fc-not-start.fc-not-end.fc-event-solid-#{$name} { + background: kt-get($color, base); + + .fc-title { + color: kt-get($color, inverse); + } + + .fc-description { + color: kt-get($color, inverse); + } + + .fc-time { + color: kt-get($color, inverse); + } + } + } + } + } + } + + // header + th.fc-day-header { + > a, + > span { + color: kt-base-color(label, 2); + } + } + + // list heading + .fc-list-heading { + td { + background: kt-base-color(grey, 2); + border-color: kt-base-color(grey, 2); + } + + .fc-list-heading-main { + color: kt-base-color(label, 3); + } + + .fc-list-heading-alt { + color: kt-base-color(label, 2); + } + } + + .fc-divider, .fc-popover .fc-header, .fc-list-heading td { + background: kt-base-color(grey, 1); + } + + // list item + .fc-list-item { + &:hover { + td { + background: transparent !important; + } + } + + .fc-event-dot { + background: kt-base-color(grey, 3); + border-color: kt-base-color(grey, 3); + } + + @each $name, $color in $kt-state-colors { + &.fc-event-solid-#{$name}, + &.fc-event-#{$name} { + .fc-event-dot { + background: kt-get($color, base); + border-color: kt-get($color, base); + } + } + } + } + + // toolbar + .fc-toolbar { + h2 { + + } + + .fc-button { + color: kt-base-color(label, 2); + background: transparent; + border: 1px solid kt-base-color(grey, 2); + text-shadow: none !important; + box-shadow: none !important; + + .fc-icon { + color: kt-base-color(label, 2); + } + + &:hover { + border: 0; + background: kt-base-color(grey, 1); + border: 1px solid kt-base-color(grey, 2); + color: kt-base-color(label, 2); + } + + &:focus, + &:active, + &.fc-button-active { + background: kt-state-color(brand, base); + color: kt-state-color(brand, inverse); + border: 1px solid kt-state-color(brand, base); + box-shadow: none; + text-shadow: none; + + .fc-icon { + color: kt-state-color(brand, inverse); + } + } + + &.fc-button-disabled { + opacity: 0.7; + } + } + } + } +} + +// Build +// Base +@include kt-fullcalendar-base(); + +// Skin +@include kt-fullcalendar-skin(); \ No newline at end of file diff --git a/src/assets/sass/global/integration/plugins/_gmaps.scss b/src/assets/sass/global/integration/plugins/_gmaps.scss new file mode 100644 index 0000000..3ad8e00 --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_gmaps.scss @@ -0,0 +1,28 @@ +// +// Gmaps Plugin +// + + + + +// Mixins +@mixin kt-gmaps-base() { + // Spinner markup + .kt-gmaps { + /* important! bootstrap sets max-width on img to 100% which conflicts with google map canvas*/ + img { + max-width: none; + } + + &.kt-gmaps--static{ + > div { + background-repeat: no-repeat ; + background-position: 50% 50% ; + display:block; + } + } + } +} + +// Build +@include kt-gmaps-base(); \ No newline at end of file diff --git a/src/assets/sass/global/integration/plugins/_ion-range-slider.scss b/src/assets/sass/global/integration/plugins/_ion-range-slider.scss new file mode 100644 index 0000000..fad7679 --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_ion-range-slider.scss @@ -0,0 +1,17 @@ +// +// ion Range Slider Component +// + + + +.m-ion-range-slider { + .irs { + .irs-min, + .irs-max, + .irs-from, + .irs-to, + .irs-single { + padding: 2px 5px 1px 5px; + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/plugins/_jquery-repeater.scss b/src/assets/sass/global/integration/plugins/_jquery-repeater.scss new file mode 100644 index 0000000..6325667 --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_jquery-repeater.scss @@ -0,0 +1,53 @@ +// +// jQuery Repeater +// + + + +.kt-repeater{ + .kt-repeater__row{ + display:flex; + flex-wrap:wrap; + + > input { + flex: 1; + } + + .kt-repeater__close{ + background-color: transparent; + border: none; + } + + .form-text { + flex-basis: 100%; + } + } + + .kt-repeater__item{ + position:relative; + + .btn-icon{ + height: auto; + } + + &:first-child{ + + .form-control{ + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + } + + .input-group-append{ + display:none; + } + } + } + + .kt-repeater__close { + &--align-right{ + position: absolute; + top: 0; + right:0; + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/plugins/_jqvmap.scss b/src/assets/sass/global/integration/plugins/_jqvmap.scss new file mode 100644 index 0000000..76a04e7 --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_jqvmap.scss @@ -0,0 +1,20 @@ +// +// jQVMap +// + + + + +.m-jqvmap { + position: relative; + overflow: hidden; + + .jqvmap-zoomout, + .jqvmap-zoomin { + height: 16px; + width: 16px; + line-height: 12px; + vertical-align: middle; + background-color: m-base-color(label, 3); + } +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/plugins/_jstree.scss b/src/assets/sass/global/integration/plugins/_jstree.scss new file mode 100644 index 0000000..a7086d9 --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_jstree.scss @@ -0,0 +1,159 @@ +// +// jsTree +// + + + +// Base +.jstree-default { + .jstree-anchor { + color: kt-base-color(label, 1); + padding: 0 8px 0 4px; + } + + .jstree-icon { + color: kt-base-color(label, 1); + + font-size: 1.3rem; + + &.la { + font-size: 1.5rem; + } + &.fa { + font-size: 1.2rem; + } + } + + .jstree-disabled { + cursor: not-allowed; + line-height: auto; + height: auto; + opacity: 0.7; + + .jstree-icon { + color: kt-base-color(label, 1); + } + } + + .jstree-clicked { + border: 0; + background: kt-base-color(grey, 1); + box-shadow: none; + } + + .jstree-hovered { + border: 0; + background-color: kt-base-color(grey, 1); + box-shadow: none; + } + + .jstree-wholerow-clicked, + .jstree-wholerow-clicked { + background: kt-base-color(grey, 2); + box-shadow: none; + } + + .jstree-wholerow-hovered, + &.jstree-wholerow .jstree-wholerow-hovered { + border: 0; + background-color: kt-base-color(grey, 1); + box-shadow: none; + } +} + +.jstree-open>.jstree-anchor>.fa-folder:before { + margin-left: 2px; + content: "\f07c"; +} + +.jstree-open>.jstree-anchor>.la-folder:before { + margin-left: 2px; + content: "\f200"; +} + +.jstree-default.jstree-rtl .jstree-node { + background-position: 100% 1px#{'/*rtl:ignore*/'} !important; +} + +.jstree-default.jstree-rtl .jstree-last { + background: transparent #{'/*rtl:ignore*/'}; + background-repeat: no-repeat; +} + +.jstree-rtl .jstree-anchor { + padding: 0 4px 0 8px#{'/*rtl:ignore*/'}; +} + +// context menu +.vakata-context, +.vakata-context ul { + padding: 0.5rem 0; + min-width: 150px; + font-size: 1rem; + font-family: #{kt-get($kt-font-families, regular)}; + background: #fff; + box-shadow: $dropdown-box-shadow; + border: 0; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + li { + padding: 0; + border: 0; + + a { + padding: 0rem 1.2rem; + border: 0; + //line-height: 2.2em; + + i { + display: none; + } + + .vakata-contextmenu-sep { + display: none; + } + + span, + ins { + display: none; + border: 0 !important; + } + } + } + + .vakata-context-hover>a, + li a:hover { + margin: 0; + background-color: kt-base-color(grey, 1); + color: kt-brand-color(); + box-shadow: none; + + .span, + .ins { + border: 0 !important; + } + } +} + +.vakata-context .vakata-context-separator a, +.vakata-context-rtl .vakata-context-separator a { + margin: 0; + border: 0; + height: 2px; + background-color: kt-base-color(grey, 2); +} + +.jstree-rename-input { + outline: none !important; + padding: 2px 6px !important; + margin-right: -4px !important; + background-color: kt-base-color(grey, 1) !important; + border: 1px solid kt-base-color(grey, 1) !important; + + @include kt-rounded { + border-radius: 4px; + } +} \ No newline at end of file diff --git a/src/assets/sass/global/integration/plugins/_kanban.scss b/src/assets/sass/global/integration/plugins/_kanban.scss new file mode 100644 index 0000000..b760a0f --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_kanban.scss @@ -0,0 +1,98 @@ +// +// Kanban Board +// + + + + +// Base +.kanban-container{ + width: 100% !important; + display: flex; + flex-wrap: wrap; + + .kanban-board { + width: calc(20% - 1.25rem) !important; + border-radius: $kt-border-radius; + margin-bottom: 1.25rem; + margin-right: 1.25rem !important; + background-color: kt-base-color(grey, 1); + + .kanban-title-board { + font-weight: 600; + font-size: 1.2rem; + } + + @each $name, $color in $kt-state-colors{ + .#{$name}{ + background-color: kt-state-color(#{$name}, base); + color: kt-state-color(#{$name}, inverse); + } + + .#{$name}-light{ + background-color: rgba(kt-state-color(#{$name}, base), 0.1); + color: kt-state-color(#{$name}, base); + } + } + + @include kt-minimal-desktop-and-below{ + width: calc(33% - 1.25rem) !important; + } + + @include kt-tablet-and-mobile{ + width: calc(50% - 1.25rem) !important; + } + + @include kt-mobile{ + width: 100% !important; + margin-right: 0 !important; + } + } + + .kanban-board-header{ + border-top-left-radius: $kt-border-radius; + border-top-right-radius: $kt-border-radius; + } + + .kanban-item { + border-radius: $kt-border-radius; + font-weight: 500; + box-shadow: 0px 0px 13px 0px rgba(#000, 0.05); + + @each $name, $color in $kt-state-colors{ + &[data-class="#{$name}"]{ + background-color: rgba(kt-state-color(#{$name}, base), 0.1); + color: kt-state-color(#{$name}, base); + box-shadow: none; + } + } + } +} + +.kt-kanban__badge{ + display: flex; + align-content: center; + + .kt-kanban__title{ + font-weight: 500; + margin-bottom: 0.5rem; + } + + .kt-kanban__image{ + margin-right: 1.25rem; + flex: 0 0 50px; + } +} + +.kanban-toolbar{ + padding: 1rem 0; + + .kanban-toolbar__title{ + font-weight: 500; + margin-bottom: 0.75rem; + } + + .form-control{ + align-items: center; + } +} diff --git a/src/assets/sass/global/integration/plugins/_nouislider.scss b/src/assets/sass/global/integration/plugins/_nouislider.scss new file mode 100644 index 0000000..e454a84 --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_nouislider.scss @@ -0,0 +1,103 @@ +// +// NoUiSlider +// + + + + +// Base +@mixin kt-nouislider-base() { + .noUi-target { + @include kt-not-rounded { + border-radius: 0 !important; + } + + &.noUi-horizontal { + height: 15px; + + .noUi-handle { + width: 24px; + height: 24px; + left: -17px; + top: -6px; + border-radius: 50%; + outline: none; + + &::before { + display: none; + } + + &::after { + display: none; + } + } + } + + &.noUi-vertical { + height: 150px; + width: 15px; + + .noUi-handle { + width: 24px; + height: 24px; + left: -5.5px; + top: -6px; + border-radius: 50%; + outline: none; + + &::before { + display: none; + } + + &::after { + display: none; + } + } + } + + + // State colors + &.nouislider { + @each $name, $color in $kt-state-colors { + &.nouislider-connect-#{$name} { + .noUi-connect { + background: kt-get($color, base); + } + } + + &.nouislider-handle-#{$name} { + .noUi-handle { + border: 0; + background: kt-get($color, base); + box-shadow: 0 3px 6px -3px kt-get($color, base); + } + } + } + } + } +} + +// Skin +@mixin kt-nouislider-skin() { + .noUi-target { + border: 1px solid $input-border-color; + background: kt-base-color(grey, 1); + box-shadow:none; + + .noUi-connect { + background: kt-state-color(brand, base); + } + + .noUi-handle { + border: 1px solid kt-base-color(grey, 1); + box-shadow: 0 3px 6px -3px rgba(#000, 0.7); + } + } +} + + +// Base +@include kt-nouislider-base(); + +// Skin +@include kt-nouislider-skin(); \ No newline at end of file diff --git a/src/assets/sass/global/integration/plugins/_perfect-scrollbar.scss b/src/assets/sass/global/integration/plugins/_perfect-scrollbar.scss new file mode 100644 index 0000000..5d30a09 --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_perfect-scrollbar.scss @@ -0,0 +1,22 @@ +// +// Scroll +// + + +// Base +.kt-scroll { + &.kt-scroll--pull { + padding-right: 12px; + margin-right: -12px; + + .ps__rail-y { + right: -2px; + } + } +} + +// Skin +@include kt-perfect-scrollbar-ver-size($kt-custom-scroll-size); +@include kt-perfect-scrollbar-hor-size($kt-custom-scroll-size); + +@include kt-perfect-scrollbar-skin($kt-scroll-color); \ No newline at end of file diff --git a/src/assets/sass/global/integration/plugins/_quill.scss b/src/assets/sass/global/integration/plugins/_quill.scss new file mode 100644 index 0000000..56c89ef --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_quill.scss @@ -0,0 +1,141 @@ +// +// Quill +// + + + +// Base +.ql-toolbar.ql-snow { + border: 1px solid kt-base-color(grey, 2); + + @include kt-rounded { + border-top-left-radius: $kt-border-radius; + border-top-right-radius: $kt-border-radius; + } + + button { + &.ql-active, + &:focus, + &:hover { + .ql-stroke { + stroke: kt-brand-color(); + } + } + } + + .ql-picker-label { + &.ql-active, + &:hover { + color: kt-brand-color(); + } + } + + .ql-picker-item { + &.ql-selected, + &.ql-active, + &:hover { + color: kt-brand-color(); + } + } +} + +.ql-container.ql-snow { + border: 1px solid kt-base-color(grey, 2); + border-top: 0; + + @include kt-rounded { + border-bottom-left-radius: $kt-border-radius; + border-bottom-right-radius: $kt-border-radius; + } +} + +.ql-snow { + .ql-picker { + &.ql-expanded { + outline: none !important; + border-color: transparent !important; + + .ql-picker-label { + border-color: transparent !important; + color: kt-brand-color(); + outline: none !important; + + &.ql-active, + &:hover { + color: kt-brand-color(); + } + } + + .ql-picker-options { + border: 0; + padding: 0.5rem 1rem; + box-shadow: $dropdown-box-shadow; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + } + } + } + + .ql-tooltip { + border: 0; + padding: 0.5rem 1rem; + box-shadow: $dropdown-box-shadow; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + input[type=text] { + @include kt-input-reset(); + border: 1px solid kt-base-color(grey, 2); + color: $input-plaintext-color; + outline: none !important; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + &:active, + &:focus { + border-color: $input-focus-border-color !important; + } + } + + .ql-preview { + color: kt-base-color(label, 2); + } + + .ql-action { + transition: color 0.3s ease; + color: kt-base-color(label, 2); + + &:hover { + transition: color 0.3s ease; + color: kt-brand-color(); + } + } + + // Tooltip adjustment in modal + .modal & { + &.ql-editing { + left: 20px !important; + } + } + } + + .ql-editor { + color: kt-base-color(label, 2); + } + + .ql-editor pre.ql-syntax { + background-color: #333; + color: #f8f8f2; + overflow: visible; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + } +} diff --git a/src/assets/sass/global/integration/plugins/_recaptcha.scss b/src/assets/sass/global/integration/plugins/_recaptcha.scss new file mode 100644 index 0000000..fcc4607 --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_recaptcha.scss @@ -0,0 +1,55 @@ +// +// Recaptcha +// + + + + +// Base +@mixin kt-recaptcha-base() { + .recaptcha { + padding: 15px; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + .recaptcha-img { + margin-bottom: 10px; + } + + .input-group { + .btn { + i { + padding-right: 0; + } + } + + .form-control { + @include kt-rounded { + border-top-left-radius: $kt-border-radius !important; + border-bottom-left-radius: $kt-border-radius !important; + } + } + } + } +} + +// Component Skin +@mixin kt-recaptcha-skin() { + .recaptcha { + border: 1px solid kt-base-color(grey, 2); + + .recaptcha_only_if_incorrect_sol { + color: kt-state-color(danger, base); + } + } +} + +// Generate Component ====// + +// Component Base +@include kt-recaptcha-base(); + +// Component Skin - Light +@include kt-recaptcha-skin(); \ No newline at end of file diff --git a/src/assets/sass/global/integration/plugins/_select2.scss b/src/assets/sass/global/integration/plugins/_select2.scss new file mode 100644 index 0000000..dc9daa3 --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_select2.scss @@ -0,0 +1,356 @@ +// +// Select2 +// + + + + +// Base +@mixin select2-base() { + $general-padding: 15px 15px; + + // Select2 base + + .select2-container--default { + .select2-selection--single, + .select2-selection--multiple { + outline: none !important; + @include kt-rounded { + border-radius: $input-border-radius; + } + + @include kt-not-rounded { + border-radius: 0 !important; + } + + height: auto; + line-height: 0; + } + + .select2-selection--single .select2-selection__arrow, + .select2-selection--multiple .select2-selection__arrow { + @include kt-arrow-icon(down); + border: 0; + top: 50%; + position: absolute; + margin-top: 0; + margin-left: 0; + font-size: 0.85rem; + left: auto; + right: 0; + display: inline-block; + width: 1.9rem; + + b { + display: none; + } + } + + .select2-selection--single .select2-selection__rendered{ + position: relative; + padding: $input-btn-padding-y 3rem $input-btn-padding-y $input-btn-padding-x; + line-height: $input-btn-line-height; + + .select2-selection__clear { + border: 0; + position: absolute; + top: 50%; + @include kt-la-icon-self('\f110'); + font-size: 1.4rem; + display: inline-block; + left: auto; + right: $input-btn-padding-x + 0.85rem; + margin-right: 0.4rem; + margin-top: -(2rem/2); + } + } + + .select2-selection--multiple .select2-selection__rendered { + padding: ($input-btn-padding-y - 0.28rem) $input-btn-padding-x; + line-height: $input-btn-line-height; + + .select2-selection__choice { + padding: 0.05rem 0.4rem 0.05rem 0.4rem; + font-size: 1rem; + margin: 0.1rem 0.4rem 0.1rem 0; + position: relative; + float: left#{'/*rtl:right*/'}; + + @include kt-not-rounded { + border-radius: $input-border-radius !important; + } + + .select2-selection__choice__remove { + @include kt-la-icon-self('\f110'); + font-size: 1.4rem; + display: inline-block; + line-height: 0; + margin-right: 0.3rem; + position: relative; + top: 0.1rem; + } + } + + .select2-search__field { + font-weight: 300; + margin: 0.25rem 0.25rem 0.25rem 0; + } + } + + .select2-search--dropdown .select2-search__field { + outline: none !important; + @include kt-rounded { + border-radius: $input-border-radius; + } + @include kt-not-rounded { + border-radius: 0 !important; + } + } + + .select2-search--dropdown { + padding: $general-padding; + } + + // results + .select2-results__option { + padding: 5px 15px; + + &[aria-disabled=true] { + cursor: not-allowed; + } + + .select2-results__group { + padding: 5px 15px; + font-weight: 600; + } + + .select2-results__option { + padding: 5px 30px; + } + } + } + + .select2-container .select2-search--inline .select2-search__field { + margin: 0; + } + + // Select2 component + + select.select2 { + opacity: 0; + } + + .select2 { + > select.form-control { + opacity: 0; + } + } + + // Select2 with bootstrap group input + .input-group { + > .select2-hidden-accessible { + &:first-child + .select2-container { + > .selection { + .select2-selection--single { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + + &, + &.form-control { + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-top-right-radius: 0; + } + } + } + + // the most right + &:not(:first-child) + .select2-container:last-child { + > .selection { + .select2-selection--single { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + + .select2-selection { + &, + &.form-control { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + } + } + } + + &:first-child + .select2-container + .input-group-text, + &:not(:first-child) + .select2-container + .input-group-text { + border-left: 0; + } + + &:not(:first-child) + .select2-container:not(:last-child) { + > .selection { + .select2-selection--single { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + + .select2-selection { + &, + &.form-control { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } + } + } + } + } + } +} + +// Skin +@mixin select2-skin() { + // select2 base + .select2-container--default { + .select2-selection--multiple, + .select2-selection--single { + border: 1px solid $input-border-color; + + .select2-selection__placeholder { + color: $input-placeholder-color; + } + } + + &.select2-container--focus, + &.select2-container--open { + .select2-selection--multiple, + .select2-selection--single { + border-color: $input-focus-border-color; + } + } + + .select2-selection--single .select2-selection__rendered { + color: $input-plaintext-color; + + .select2-selection__clear { + color: kt-base-color(label, 2); + } + } + + .select2-selection--multiple .select2-selection__rendered { + color: $input-plaintext-color; + + .select2-selection__choice { + color: kt-base-color(label, 2); + background: kt-base-color(grey, 1); + border: 1px solid kt-base-color(grey, 2); + + .select2-selection__choice__remove { + color: kt-base-color(label, 2); + } + } + + .select2-search__field { + @include kt-input-placeholder($input-placeholder-color); + } + } + + .select2-search--dropdown .select2-search__field { + border: 1px solid $input-border-color; + } + + //.select2-container--below. + + // dropdown + .select2-dropdown { + border: 1px solid $input-border-color; + box-shadow: $kt-dropdown-shadow; + } + + // result options + .select2-results__option { + &[aria-selected=true] { + background: kt-base-color(grey, 1); + color: kt-base-color(label, 2); + } + + &.select2-results__option--highlighted { + background: kt-base-color(grey, 1); + color: kt-base-color(label, 2); + } + } + + // disabled mode + &.select2-container--disabled { + cursor: not-allowed; + + .select2-selection--multiple, + .select2-selection--single { + cursor: not-allowed; + background: kt-base-color(grey, 1); + border-color: kt-base-color(label, 2); + } + } + } + + // select2 components + + .select2 { + // pill style + &.select2--air { + .select2-container--default { + .select2-selection--single, + .select2-selection--multiple { + box-shadow: $kt-dropdown-shadow; + } + } + } + + // pill style + &.select2--solid { + .select2-container--default { + .select2-selection--multiple, + .select2-selection--single { + background-color: kt-base-color(grey, 1); + border-color: kt-base-color(grey, 2); + + .select2-selection__placeholder { + color: $input-placeholder-color; + } + } + } + } + } +} + +// Component Validation State +@mixin select2-validation-state($state, $color) { + .m-form.m-form--state .is-#{$state} { + .select2-container--default { + .select2-selection--multiple, + .select2-selection--single { + border-color: $color; + } + + &.select2-container--focus, + &.select2-container--open { + .select2-selection--multiple, + .select2-selection--single { + border-color: $color; + } + } + } + } +} + +// Build +// Base +@include select2-base(); + +// Skin +@include select2-skin(); + +// Validation States +@include select2-validation-state(valid, success); +@include select2-validation-state(invalid, danger); \ No newline at end of file diff --git a/src/assets/sass/global/integration/plugins/_summernote.scss b/src/assets/sass/global/integration/plugins/_summernote.scss new file mode 100644 index 0000000..a79cf1b --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_summernote.scss @@ -0,0 +1,152 @@ +// +// Summernote +// + + + +// Base +@mixin kt-summernote-base() { + .note-popover { + display: none; + } + + .note-editor { + position: static; + + .note-toolbar { + position: static; + } + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + .modal { + .modal-header { + .close { + position: absolute; + right: 25px; + top: 20px; + font-size: 0; + } + } + } + + .panel-heading.note-toolbar { + padding: 5px 10px 10px 10px; + + @include kt-rounded { + border-top-left-radius: $kt-border-radius; + border-top-right-radius: $kt-border-radius; + } + + .btn { + outline: none !important; + } + + .dropdown-menu { + min-width: 185px; + } + + .note-color .dropdown-menu { + min-width: 350px; + padding: 10px; + + > li { + display: table; + table-layout: fixed; + + > .btn-group { + display: table-cell !important; + + &:first-child { + padding-right: 10px; + } + + .note-color-reset { + margin: 5px 0 10px 0; + } + + .note-palette-title { + margin: 5px 0; + text-align: left; + border: 0; + } + } + } + } + } + + .dropdown-toggle::after { + display: none; + } + } +} + +// Skin +@mixin kt-summernote-skin() { + .note-editor { + &.note-frame { + border: 1px solid $input-border-color; + + .panel-heading.note-toolbar { + background: kt-base-color(grey, 1); + } + + .note-statusbar { + background: kt-base-color(grey, 1); + } + } + + .note-toolbar { + .note-btn-group { + .btn { + background: white; + border: 1px solid kt-base-color(grey, 2); + + i { + vertical-align: initial; + line-height: initial; + padding-right: 0; + color: kt-base-color(label, 2); + } + + &:hover, + &:focus, + &:active, + &.active { + background: transparent; + color: kt-base-color(label, 3); + } + } + } + } + } + + .note-editable { + .table.table-bordered { + th,td { + border: 1px solid kt-base-color(grey, 3); + } + } + } + + // Validation + .is-valid { + .note-editor { + border-color: kt-state-color(success, base); + } + } + + .is-invalid { + .note-editor { + border-color: kt-state-color(danger, base); + } + } +} + +// Base +@include kt-summernote-base(); + +// Skin +@include kt-summernote-skin(); \ No newline at end of file diff --git a/src/assets/sass/global/integration/plugins/_sweetalert2.scss b/src/assets/sass/global/integration/plugins/_sweetalert2.scss new file mode 100644 index 0000000..612eb9a --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_sweetalert2.scss @@ -0,0 +1,91 @@ +// +// SweetAlert2 +// + + + + +// Base +@mixin kt-sweetalert-base() { + html.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown), + body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) { + overflow-y: initial !important; + + &:not(.kt-sweetalert2--nopadding) { + padding-right: 0 !important; + } + + @include kt-hack-ie { + overflow: visible; + } + } + + .swal2-popup { + padding: 2rem; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + .swal2-icon { + margin: 2rem 0 0rem 0; + } + + .swal2-title { + font-weight: 500; + font-size: 1.3rem; + margin: 2rem 0 0 0; + } + + .swal2-content { + font-weight: normal; + font-size: 1.1rem; + margin-top: 1.5rem; + } + + .btn { + margin: 15px 5px 0; + } + + .swal2-styled { + &:focus { + box-shadow: none; + } + } + + .swal2-actions { + margin: 1.5rem auto 1rem auto; + } + } + + .swal2-container { + overflow-y: hidden !important; + } + + body.swal2-height-auto { + height: 100% !important; + } +} + +@mixin kt-sweetalert-skin() { + .swal2-container.swal2-shown { + background-color: rgba(0, 0, 0, 0.2); + } + + .swal2-popup { + .swal2-title { + color: kt-base-color(label, 4); + } + + .swal2-content { + color: kt-base-color(label, 2); + } + } +} + +// Build +// Base +@include kt-sweetalert-base(); + +// Skin +@include kt-sweetalert-skin(); diff --git a/src/assets/sass/global/integration/plugins/_tagify.scss b/src/assets/sass/global/integration/plugins/_tagify.scss new file mode 100644 index 0000000..16031ed --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_tagify.scss @@ -0,0 +1,167 @@ +// +// Tagify +// + + + + +.tagify { + @include kt-rounded { + border-radius: $input-border-radius; + } + + border-color: $input-border-color; + //padding: $input-btn-padding-y $input-btn-padding-x; + + &:hover { + border-color: $input-border-color; + } + + &.tagify--focus { + border: 1px solid $input-focus-border-color; + } + + .tagify__input { + color: $input-plaintext-color; + + &:before { + margin-top: 2px; + } + } + + .tagify__tag { + background-color: kt-base-color(grey, 2); + display: inline-flex; + align-items: center; + padding: 0 0.5rem; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + div { + order: 1; + padding-right: 0.25rem; + + .tagify__tag-text { + color: kt-base-color(label, 2); + font-weight: 400; + } + + &:before { + box-shadow: none !important; + animation: none; + transition: none; + } + } + + .tagify__tag__removeBtn { + line-height: 1; + order: 2; + transform: none; + position: static; + border-radius: 0; + margin-top: -2px; + + &:after { + @include kt-flaticon2-icon(kt-get($kt-action-bold-icons, close)); + font-size: 0.6rem; + color: kt-base-color(label, 1); + } + + &:hover { + background: transparent; + color: kt-brand-color(); + + & + div > span { + opacity: .4; + } + } + } + + // State colors + @each $name, $color in $kt-state-colors { + &.tagify__tag--#{$name} { + background-color: rgba(kt-get($color, base), 0.1); + + div { + .tagify__tag-text { + color: kt-get($color, base); + } + } + + .tagify__tag__removeBtn { + &:after { + color: kt-get($color, base); + } + + &:hover { + background: transparent; + color: kt-get($color, inverse); + + & + div > span { + opacity: .3; + } + } + } + } + } + } +} + +.tagify--outside{ + border: 0 !important; + padding: 0 !important; + margin: 5px 0 10px 0 !important; + + tag { + &:first-child { + margin-left: 0; + } + } +} + +.tagify__input.form-control { + margin: 0; + + &:before { + top: 6px; + } +} + +.tagify__input--outside{ + display: block; + max-width: 600px; + border: 1px solid #DDD; + margin-top: 1.5em; + margin-bottom: 1em; +} + +.tagify__dropdown { + box-shadow: $dropdown-box-shadow; + background: #fff; + border: 0 !important; + padding: 0.75rem 0; + z-index: $kt-dropdown-zindex; + + .modal-open & { + z-index: $kt-modal-zindex + 1; + } + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + .tagify__dropdown__item { + color: kt-base-color(label, 2); + border-radius: 0; + padding: 0.75rem 1.5rem; + margin: 0; + box-shadow: none; + + &.tagify__dropdown__item--active { + background: kt-base-color(grey, 1); + color: kt-brand-color(); + } + } +} diff --git a/src/assets/sass/global/integration/plugins/_tinymce.scss b/src/assets/sass/global/integration/plugins/_tinymce.scss new file mode 100644 index 0000000..70ac1bf --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_tinymce.scss @@ -0,0 +1,16 @@ +// +// TinyMCE +// + + + + +// Base +.tox-target{ + display: none; +} + +.tox-tinymce{ + border-radius: $kt-border-radius !important; + height: 500px !important; +} diff --git a/src/assets/sass/global/integration/plugins/_toastr.scss b/src/assets/sass/global/integration/plugins/_toastr.scss new file mode 100644 index 0000000..b8a6bed --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_toastr.scss @@ -0,0 +1,63 @@ +// +// Toastr +// + + + + +// Base +@mixin kt-toastr-base() { + .toast { + background-position: 15px center #{'/*rtl:calc(100% - 15px) center*/'} !important; + box-shadow: $kt-dropdown-shadow; + border: 0; + + .toast-close-button { + @include kt-close-icon(); + outline: none !important; + font-size: 0; + content: " "; + &:before { + font-size: 0.9rem; + } + } + + // Title + .toast-title { + font-size: 1rem; + font-weight: 500; + margin-bottom: 0.25rem; + } + + // Message + .toast-message { + font-size: 0.9rem; + } + } +} + +@mixin kt-toastr-state($name, $color) { + .toast-#{$name} { + background-color: kt-get($color, base); + color: kt-get($color, inverse); + box-shadow: 0px 0px 20px 0px rgba(0,0,0,0.1); + } + + #toast-container > div:hover { + box-shadow: 0px 0px 20px 0px rgba(0,0,0,0.125); + } +} + +@mixin kt-toastr-skin() { + @include kt-toastr-state(success, kt-get($kt-state-colors, success)); + @include kt-toastr-state(warning, kt-get($kt-state-colors, warning)); + @include kt-toastr-state(info, kt-get($kt-state-colors, info)); + @include kt-toastr-state(error, kt-get($kt-state-colors, danger)); +} + +// Build +// Base +@include kt-toastr-base(); + +// Skin +@include kt-toastr-skin(); \ No newline at end of file diff --git a/src/assets/sass/global/integration/plugins/_typeahead.scss b/src/assets/sass/global/integration/plugins/_typeahead.scss new file mode 100644 index 0000000..5208ea5 --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_typeahead.scss @@ -0,0 +1,79 @@ +// +// Typeahead +// + + + + +// Base +@mixin kt-bootstrap-typeahead-base() { + .typeahead { + .twitter-typeahead { + display: block !important; + } + + .tt-menu { + border: 0; + margin: 0; + min-width: 275px; + padding: 5px 0; + left: auto #{'/*rtl:ignore*/'}!important; + + border-radius: 0; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + .tt-dataset { + .tt-suggestion { + padding: 5px 15px; + font-size: 1rem; + } + } + } + } +} + +// Skin +@mixin kt-bootstrap-typeahead-skin() { + .typeahead { + .form-control { + &.tt-hint { + color: $input-placeholder-color; + } + + &.tt-input { + color: $input-plaintext-color; + } + } + + .tt-menu { + background: white; + box-shadow: $kt-dropdown-shadow; + + .tt-dataset { + .tt-suggestion { + color: kt-base-color(label, 3); + cursor: pointer; + + .tt-highlight { + color: kt-base-color(label, 4); + font-weight: 500; + } + + &:hover { + background: kt-base-color(grey, 1); + } + } + } + } + } +} + + +// Base +@include kt-bootstrap-typeahead-base(); + +// Light +@include kt-bootstrap-typeahead-skin(); \ No newline at end of file diff --git a/src/assets/sass/global/integration/plugins/_uppy.scss b/src/assets/sass/global/integration/plugins/_uppy.scss new file mode 100644 index 0000000..e3445c3 --- /dev/null +++ b/src/assets/sass/global/integration/plugins/_uppy.scss @@ -0,0 +1,373 @@ +// +// Uppy +// + + + + +// Base +.kt-uppy { + .uppy-Root { + font-family: kt-get($kt-font-families, regular); + + &.uppy-DragDrop--is-dragdrop-supported { + border: 2px dashed kt-base-color(grey, 2); + } + } + + .uppy-Dashboard-inner { + background-color: kt-base-color(grey, 1); + border: 1px solid kt-base-color(grey, 2); + + .uppy-DashboardContent-bar, + .uppy-Dashboard-AddFilesPanel, + .uppy-DashboardContent-panel, + .uppy-DashboardItem-progress, + .uppy-DashboardItem-action, + .uppy-DashboardItem-previewLink{ + z-index: 1; + } + + .uppy-DashboardContent-title { + color: kt-base-color(label, 2); + font-size: 1rem; + font-weight: 500; + } + + .uppy-DashboardTabs { + .uppy-Dashboard-dropFilesTitle { + color: kt-base-color(label, 2); + font-size: 1.3rem; + font-weight: 500; + } + + .uppy-DashboardTab-name{ + color: kt-base-color(label, 2); + } + } + + .uppy-DashboardItem.is-complete .progress{ + stroke: kt-state-color(success, base); + fill: kt-state-color(success, base); + } + + .uppy-StatusBar-statusSecondary { + overflow: visible; + } + } + + .uppy-DashboardAddFiles-info { + bottom: 20px !important; + } + + .uppy-Dashboard-note { + color: kt-base-color(label, 2); + font-size: 0.9rem; + font-weight: 400; + } + + .uppy-c-btn-primary { + font-size: 1rem; + font-weight: 400; + background: kt-brand-color(); + color: kt-brand-color(inverse); + outline: none !important; + + &:focus, + &:hover { + background-color: darken(kt-brand-color(), 6%); + } + } + + .uppy-DashboardContent-back { + font-size: 1rem; + font-weight: 500; + color: kt-brand-color(); + outline: none !important; + &:focus, + &:hover { + color: darken(kt-brand-color(), 6%); + } + } + + .uppy-Dashboard-browse { + color: kt-state-color(brand, base); + + &:focus, + &:hover { + color: darken(kt-brand-color(), 6%); + } + } + + .uppy-DashboardContent-addMore { + svg { + stroke: kt-state-color(brand, base); + fill: kt-state-color(brand, base); + } + } + + .uppy-ProgressBar{ + z-index: 1; + .uppy-ProgressBar-inner { + background-color: kt-brand-color(); + box-shadow: none; + } + + .uppy-ProgressBar-percentage { + color: kt-base-color(label, 2); + font-size: 0.9rem; + font-weight: 400; + } + } + + .uppy-DragDrop-label { + font-size: 1rem; + font-weight: 500; + color: kt-base-color(label, 2); + + .uppy-DragDrop-dragText { + color: kt-state-color(brand, base); + &:focus, + &:hover { + color: darken(kt-brand-color(), 6%); + } + } + } + + .uppy-StatusBar{ + z-index: 1; + + .uppy-StatusBar-status{ + overflow-x: visible; + display: none; + } + + .uppy-StatusBar-progress{ + background-color: kt-state-color(brand, base); + } + + .uppy-StatusBar-content { + .uppy-StatusBar-statusPrimary { + font-size: 0.9rem; + font-weight: 400; + color: kt-base-color(label, 2); + } + + .uppy-StatusBar-spinner { + svg { + fill: kt-state-color(brand, base); + } + } + } + + .uppy-StatusBar-actions { + .uppy-StatusBar-actionCircleBtn { + .UppyIcon { + circle { + transition: all 0.3s ease; + fill: kt-base-color(grey, 2); + } + + path { + transition: all 0.3s ease; + fill: kt-base-color(label, 2); + } + + &:hover { + circle { + transition: all 0.3s ease; + fill: kt-brand-color(); + } + + path { + transition: all 0.3s ease; + fill: kt-brand-color(inverse); + } + } + } + } + } + + &.is-complete{ + .uppy-StatusBar-progress{ + background-color: kt-state-color(success, base); + } + } + + &.uppy-Root { + .uppy-StatusBar-content { + padding-left: 0 !important; + } + + .uppy-StatusBar-actions { + right: 0 !important; + } + } + } + + .uppy.uppy-Informer { + p { + background-color: rgba(kt-state-color(danger, base), 0.1); + color: kt-state-color(danger, base); + border-radius: 0; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + } + } + + .kt-uppy__progress{ + position: relative; + display:flex; + align-items: center; + } + + .kt-uppy__status{ + @include transition; + + &.kt-uppy__status--ongoing{ + height: 40px; + opacity: 1; + } + + &.kt-uppy__status--hidden{ + display: none; + } + } + + .kt-uppy__btn{ + margin-top: 10px; + } + + .kt-uppy__thumbnails{ + display: flex; + position: relative; + width: 100%; + flex-wrap: wrap; + justify-content: space-between; + + .kt-uppy__thumbnail-container{ + width: calc(50% - 5px); + margin: 10px 5px 0; + position: relative; + display: flex; + align-items: center; + height: 50px; + background-color: kt-base-color(grey, 1); + border-radius: $kt-border-radius; + overflow: hidden; + + .kt-uppy__thumbnail{ + width: 60px; + height: 50px; + overflow: hidden; + display: flex; + justify-content: center; + + img{ + height: 100%; + width: auto; + } + } + + .kt-uppy__thumbnail-label{ + font-weight: 400; + color: kt-base-color(label, 2); + margin-left: 10px; + padding-right: 10px; + } + + .kt-uppy__remove-thumbnail{ + margin: auto 10px auto auto; + cursor: pointer; + } + + &:nth-child(odd){ + margin-left: 0; + } + + &:nth-child(even){ + margin-right: 0; + } + + @include kt-minimal-desktop-and-below{ + width: 100%; + margin: 10px 0 0; + } + } + } + + .kt-uppy__list{ + .kt-uppy__list-item{ + display: flex; + justify-content: space-between; + align-items: center; + padding: 0.5rem 1rem; + background-color: kt-base-color(grey, 1); + margin-top: 0.75rem; + border-radius: $kt-border-radius; + + &:last-child { + margin-bottom: 0.75rem; + } + + .kt-uppy__list-label{ + font-weight: 500; + color: kt-base-color(label, 2); + } + + .kt-uppy__list-remove{ + cursor: pointer; + margin-left: 1rem; + + i { + transition: color 0.3s ease; + font-size: 0.7rem; + color: kt-base-color(label, 1); + } + + &:hover { + i { + transition: color 0.3s ease; + color: kt-brand-color(); + } + } + } + } + } + + .kt-uppy__wrapper { + .uppy-FileInput-container { + margin-bottom: 0rem; + } + } + + .kt-uppy__input-control { + position: relative; + z-index: 1; + height: 0; + width: 0; + opacity: 0; + } + + .kt-uppy__informer--min { + .uppy-Informer { + position: static !important; + top: auto; + bottom: auto; + + &[aria-hidden="true"] { + display: none; + } + + transform: none; + z-index: 0; + + p { + display: block; + max-width: none; + } + } + } +} diff --git a/src/assets/sass/global/integration/plugins/mixins/_perfect-scrollbar.scss b/src/assets/sass/global/integration/plugins/mixins/_perfect-scrollbar.scss new file mode 100644 index 0000000..e4478be --- /dev/null +++ b/src/assets/sass/global/integration/plugins/mixins/_perfect-scrollbar.scss @@ -0,0 +1,118 @@ +// +// Scroll Mixins +// + + + +// Skin +@mixin kt-perfect-scrollbar-skin($color) { + .ps { + > .ps__rail-x { + background: transparent; + + &:hover, + &:focus { + opacity: 1; + background: transparent; + + > .ps__thumb-x { + opacity: 1; + } + } + + > .ps__thumb-x { + background: $color; + opacity: 1; + + + &:hover, + &:focus { + opacity: 1; + background: $color; + } + } + } + + > .ps__rail-y { + background: transparent; + + &:hover, + &:focus { + background: transparent; + opacity: 1; + + > .ps__thumb-y { + opacity: 1; + } + } + + > .ps__thumb-y { + background: $color; + opacity: 1; + + &:hover, + &:focus { + opacity: 1; + background: $color; + } + } + } + } +} + +@mixin kt-perfect-scrollbar-ver-size($size) { + .ps { + > .ps__rail-y { + //right: $size; + width: $size; + + &:hover, + &:focus { + width: $size; + } + + > .ps__thumb-y { + //right: 0; + width: $size; + border-radius: $kt-border-radius; + @include kt-not-rounded { + border-radius: 0; + } + + &:hover, + &:focus { + //right: 0; + width: $size; + } + } + } + } +} + +@mixin kt-perfect-scrollbar-hor-size($size) { + .ps { + > .ps__rail-x { + height: $size; + + &:hover, + &:focus { + height: $size; + } + + > .ps__thumb-x { + top: 0; + height: $size; + border-radius: $kt-border-radius; + @include kt-not-rounded { + border-radius: 0; + } + + &:hover, + &:focus { + top: 0; + height: $size; + } + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/layout/_config.scss b/src/assets/sass/global/layout/_config.scss new file mode 100644 index 0000000..7fa1758 --- /dev/null +++ b/src/assets/sass/global/layout/_config.scss @@ -0,0 +1,73 @@ +// +// Layout Config +// Here you can set the demo level SASS variables and override the global variables for this demo. +// Note: To override the global variables in the demo level use the variables without "!default". More info: https://sass-lang.com/documentation/variables +// + + + + +// State colors +$kt-state-colors: ( + // Metronic states + brand: ( + base: #E63C2D, + inverse: #ffffff + ), + light: ( + base: #ffffff, + inverse: #282a3c + ), + dark: ( + base: #282a3c, + inverse: #ffffff + ), + + // Bootstrap states + primary: ( + base: #223D98, + inverse: #ffffff + ), + success: ( + base: #1dc9b7, + inverse: #ffffff + ), + info: ( + base: #2786fb, + inverse: #ffffff + ), + warning: ( + base: #ffb822, + inverse: #111111 + ), + danger: ( + base: #f11f1f, + inverse: #ffffff + ) +); + +// Brand Color +$kt-brand-hover-color: #f5f6fc; + +// Secondary Brand Color +$kt-secondary-brand-color: #fbce44; + +// Page bg color +$kt-page-bg-color: #f9f9fc; // page bg color + +// Aside bg color +$kt-aside-bg-color: #fff; + +// Layout +$kt-aside-default-width: 250px; +$kt-aside-minimize-width: 100px; +$kt-aside-offcanvas-width: 255px; + +// Page padding +$kt-page-padding: ( + desktop: 25px, + mobile: 15px +); + +// Page container +$kt-page-container-width: 1380px; // fixed page width diff --git a/src/assets/sass/global/layout/aside/_aside.scss b/src/assets/sass/global/layout/aside/_aside.scss new file mode 100644 index 0000000..2d2b746 --- /dev/null +++ b/src/assets/sass/global/layout/aside/_aside.scss @@ -0,0 +1,94 @@ +// +// Aside +// + + + + +// Aside +.kt-aside { + background-color: $kt-aside-bg-color; + box-shadow: 13px -2px 27px -12px rgba(41, 50, 66, 0.075); + width: kt-get($kt-aside-config, base, default, width); + transition: kt-get($kt-aside-config, base, minimize, transition); + + // Scrollbar + @include kt-perfect-scrollbar-skin(#e0e2f0); + + // Menu + .kt-aside-menu { + margin: 0; + padding: 15px 0; + + .ps__rail-y { + right: 2px; + } + } +} + +// Desktop Mode +@include kt-desktop { + .kt-aside { + // Fixed + .kt-aside--fixed & { + position: fixed; + top: kt-get($kt-header-config, base, desktop, default, height); + bottom: 0; + left: 0; + z-index: kt-get($kt-aside-config, base, fixed, zindex); + } + + .kt-aside--static & { + position: relative; + z-index: 1; + + .kt-aside-menu { + margin-top: kt-get($kt-header-config, base, desktop, default, height); + } + } + + .kt-header--fixed.kt-aside--static & { + padding-top: kt-get($kt-header-config, base, default, height); + } + + // Minimize + .kt-aside--minimize & { + width: kt-get($kt-aside-config, base, minimize, width); + transition: kt-get($kt-aside-config, base, minimize, transition); + } + + .kt-aside--minimizing & { + overflow: hidden; + + .kt-aside-menu { + .kt-menu__nav { + width: kt-get($kt-aside-config, base, default, width); + overflow: hidden; + } + } + } + + // Scroll + @include kt-perfect-scrollbar-ver-size( kt-get($kt-aside-config, base, fixed, scroll, width) ); + } + + // Fixed & Minimize Aside hover + .kt-aside--fixed.kt-aside--minimize-hover { + .kt-aside { + width: kt-get($kt-aside-config, base, default, width); + transition: kt-get($kt-aside-config, base, minimize, transition); + } + + .kt-wrapper { + transition: kt-get($kt-aside-config, base, minimize, transition); + padding-left: kt-get($kt-aside-config, base, minimize, width); + } + } +} + +// Build aside menu +@include kt-menu-ver-build-layout(kt-get($kt-aside-config, menu)); +@include kt-menu-ver-build-skin(kt-get($kt-aside-config, menu), default); + +// Aside offcanvas panel for mobile mode +@include kt-offcanvas-build(kt-aside, tablet-and-mobile, kt-get($kt-aside-config, base, offcanvas-mobile)); \ No newline at end of file diff --git a/src/assets/sass/global/layout/aside/_config.scss b/src/assets/sass/global/layout/aside/_config.scss new file mode 100644 index 0000000..8871f8e --- /dev/null +++ b/src/assets/sass/global/layout/aside/_config.scss @@ -0,0 +1,785 @@ +// +// Aside Config +// + + + + +$kt-header-fixed-zindex: kt-get($kt-header-config, base, desktop, fixed, zindex); + +$kt-aside-menu-dropdown-submenu-width: 245px; + +$kt-aside-config: ( + base: ( + default: ( + width: $kt-aside-default-width + ), + fixed: ( + zindex: 98, + scroll: ( + width: 6px + ) + ), + minimize: ( + width: $kt-aside-minimize-width, + transition: all 0.3s ease + ), + offcanvas-mobile: ( + layout: ( + self: ( + zindex: 1001, + width: 275px + ), + close: ( + size: 25px, + font-size: 1.4rem + ) + ), + skin: ( + self: ( + bg-color: $kt-aside-bg-color, + shadow: 0px 1px 9px -3px rgba(0,0,0,0.75) + ), + overlay: ( + bg-color: rgba(#000000, 0.1), + ), + + close: ( + icon-color: ( + default: #968ad4, + hover: #ffffff + ), + bg-color: ( + default: darken(#f8f8fb, 5%), + hover: kt-brand-color() + ) + ) + ) + ) + ), + + menu: ( + // base parameters required to build the base menu + base: ( + class: kt-aside-menu, // menu element class name + parent-class: kt-aside, // manu parent aside element class name + mode: general, // menu mode: general or tablet-and-mobile + ), + + // customize the menu + build: ( + // Layout + layout: ( + // default mode + default: ( + // menu panel itself + self: ( + padding: 15px 0 + ), + + // root item + item: ( + // item itself + self: ( + margin: 2px 0 + ), + + // item link + link: ( + // link itself + self: ( + height: 60px, + padding: 5px 40px + ), + + // link icon + icon: ( + width: 35px, + font-size: 1.6rem + ), + + // link bullet + bullet: ( + self: ( + width: 15px, + ), + + dot: ( + size: 4px + ), + + line: ( + width: 5px, + height: 1px + ) + ), + + // link text + text: ( + font-size: 1rem, + font-weight: 400, + font-transform: initial + ), + + // link arrow + arrow: ( + width: 20px, + transition: all 0.3s ease, + font-size: 0.7rem + ), + + // link badge + badge: ( + padding: 0px 0px 0px 5px + ) + ), + + // item submenu + submenu: ( + // submenu self + self: ( + indent: 25px, + margin: 0 + ), + + // submenu item + item: ( + // item itself + self: ( + margin: 0 + ), + + // item link + link: ( + // link itself + self: ( + height: 40px, + padding: 5px 40px, + padding-x: 30px + ), + + // link icon + icon: ( + width: 35px, + font-size: 1.3rem + ), + + // link bullet + bullet: ( + self: ( + width: 20px, + ), + dot: ( + size: 4px + ), + line: ( + width: 5px, + height: 1px + ) + ), + + // link text + text: ( + font-size: 1rem, + font-weight: 400, + font-transform: initial + ), + + // link arrow + arrow: ( + width: 20px, + transition: all 0.3s ease, + font-size: 0.7rem + ), + + // link badge + badge: ( + padding: 0px 0px 0px 5px + ) + ) + ), + + // submenu section + section: ( + self: ( + indent: 15px, + padding: 0 25px, + margin: 20px 0 0 0, + height: 40px + ), + + text: ( + font-size: 0.8rem, + font-weight: 300, + font-transform: uppercase, + letter-spacing: 0.3px + ), + + icon: ( + font-size: 1.1rem + ) + ), + + // submenu separator + separator: ( + margin: 15px 0 + ) + ) + ), + + // root section + section: ( + self: ( + padding: 0 27px, + margin: 20px 0 0 0, + height: 40px + ), + + text: ( + font-size: 0.83rem, + font-weight: 500, + font-transform: uppercase, + letter-spacing: 0.3px + ), + + icon: ( + font-size: 1.1rem + ) + ), + + // root separator + separator: ( + margin: 15px 0, + ) + ), + + // minimize mode + minimize: ( + // menu panel itself + self: ( + padding: 15px 0, + width: $kt-aside-minimize-width, + ), + + // root item + item: ( + // self + self: ( + zindex: $kt-header-fixed-zindex - 1, + width: $kt-aside-menu-dropdown-submenu-width + $kt-aside-minimize-width + 1, + ), + + // item link + link: ( + badge: ( + right: 7px, + size: 6px + ) + ), + + // item submenu + submenu: ( + // self + self: ( + width: $kt-aside-menu-dropdown-submenu-width, + margin-left: $kt-aside-minimize-width + 1 + ), + + // parent item + parent-item: ( + // item itself + self: ( + margin: 0 + ), + + // item link + link: ( + // link itself + self: ( + height: 40px, + margin-bottom: 0px, + padding: 0 30px 10px 30px + ), + // link text + text: ( + font-size: 1.05rem, + font-weight: 400, + font-transform: initial + ), + // link badge + badge: ( + padding: 0px 0px 0px 5px + ) + ) + ) + ) + ), + + // root section + section: ( + icon: ( + font-size: 1.1rem, + padding: 0 + ) + ), + ), + + // dropdown mode + dropdown: ( + // dropdown menu item + item: ( + // item itself + self: ( + margin: 0, + zindex: $kt-header-fixed-zindex + 1, + ), + + // submenu + submenu: ( + // submenu itself + self: ( + // submenu base styles + padding: 20px 0, + width: $kt-aside-menu-dropdown-submenu-width, + parent-width: $kt-aside-default-width, + border-radius: 4px, + + // submenu animation + animation: ( + offset: 10px + ), + + // vertical offset + offset: ( + root: ( + default: -5px, + up: -10px + ), + inner: ( + default: -10px, + up: -10px + ) + ) + ), + + // submenu item + item: ( + // item itself + self: ( + margin: 0 + ), + + // item link + link: ( + // link itself + self: ( + height: 40px, + padding: 7px 30px + ), + // link icon + icon: ( + width: 35px, + font-size: 1.35rem + ), + // link bullet + bullet: ( + self: ( + width: 20px, + ), + dot: ( + size: 4px + ), + line: ( + width: 5px, + height: 1px + ) + ), + // link text + text: ( + font-size: 1rem, + font-weight: 400, + font-transform: initial + ), + + // link arrow + arrow: ( + width: 20px, + transition: all 0.3s ease, + font-size: 0.7rem + ), + + // link badge + badge: ( + padding: 0px 0px 0px 5px, + align: right, + ) + ) + ), + + // submenu section + section: ( + self: ( + margin: 20px 0 0 0, + padding: 0 25px, + height: 40px + ), + + text: ( + font-size: 0.8rem, + font-weight: 300, + font-transform: uppercase, + ), + + icon: ( + font-size: 1.1rem, + ) + ), + + // submenu separator + separator: ( + margin: 15px 0, + ) + ) + ) + ) + ), + + // Skins + skin: ( + // Default mode + default: ( + // menu panel itself + self: ( + bg-color: $kt-aside-bg-color + ), + + // root item + item: ( + // item itself + self: ( + bg-color: ( + default: null, + open: null, + here: null, + active: null, + hover: null + ) + ), + + // item link + link: ( + // link itself + self: ( + bg-color: ( + default: transparent, + open: transparent, + here: $kt-brand-hover-color, + active: $kt-brand-hover-color, + hover: transparent + ) + ), + // link icon + icon: ( + font-color: ( + default: #b8bac3, + open: kt-brand-color(), + here: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ), + ), + // link bullet + bullet: ( + dot: ( + bg-color: ( + default: #b8bac3, + open: kt-brand-color(), + here: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ) + ), + line: ( + bg-color: ( + default: #b8bac3, + open: kt-brand-color(), + here: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ) + ) + ), + // link text + text: ( + font-color: ( + default: #9899ac, + open: kt-brand-color(), + here: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ) + ), + // link arrow + arrow: ( + font-color: ( + default: #b8bac3, + open: kt-brand-color(), + here: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ) + ) + ), + // item submenu + submenu: ( + // submenu self + self: ( + bg-color: ( + default: null, + open: null, + active: null, + hover: null + ) + ), + // submenu item + item: ( + // item itself + self: ( + bg-color: ( + default: null, + open: null, + here: null, + active: null, + hover: null + ) + ), + // item link + link: ( + // link itself + self: ( + bg-color: ( + default: transparent, + open: transparent, + here: $kt-brand-hover-color, + active: $kt-brand-hover-color, + hover: transparent + ) + ), + + // link icon + icon: ( + font-color: ( + default: #b8bac3, + open: kt-brand-color(), + here: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ) + ), + + // link bullet + bullet: ( + dot: ( + bg-color: ( + default: #b8bac3, + open: kt-brand-color(), + here: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ) + ), + line: ( + bg-color: ( + default: #b8bac3, + open: kt-brand-color(), + here: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ) + ) + ), + // link text + text: ( + font-color: ( + default: #9899ac, + open: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ) + ), + // link arrow + arrow: ( + font-color: ( + default: #b8bac3, + open: kt-brand-color(), + here: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ) + ) + ) + ), + // submenu section + section: ( + text: ( + font-color: #b8bac3 + ), + icon: ( + font-color: #b8bac3 + ) + ), + // submenu separator + separator: ( + border: 1px solid #b8bac3 + ) + ) + ), + // root section + section: ( + text: ( + font-color: #b8bac3 + ), + icon: ( + font-color: #b8bac3 + ) + ), + // root separator + separator: ( + border: 1px solid rgba(#fff, 0.05) + ) + ), + + // Minimize mode + minimize: ( + // root item + item: ( + // item link + link: ( + // self + self: ( + bg-color: ( + default: null, + open: null, + active: null, + hover: null + ) + ), + // link icon + icon: ( + font-color: ( + default: #b8bac3, + open: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ) + ) + ) + ) + ), + + // Dropdown mode + dropdown: ( + // dropdown menu item + item: ( + // submenu + submenu: ( + // submenu itself + self: ( + // submenu base styles + bg-color: #fff, + box-shadow: 0px 0px 50px 0px rgba(82,63,105,0.15), + ), + // submenu item + item: ( + // item itself + self: ( + bg-color: ( + default: null, + open: null, + here: null, + active: null, + hover: null + ) + ), + // item link + link: ( + // link itself + self: ( + bg-color: ( + default: transparent, + open: transparent, + here: $kt-brand-hover-color, + active: $kt-brand-hover-color, + hover: transparent + ) + ), + // link icon + icon: ( + font-color: ( + default: lighten(#8c8ea4, 10%), + open: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ) + ), + // link bullet + bullet: ( + dot: ( + bg-color: ( + default: lighten(#8c8ea4, 10%), + open: kt-brand-color(), + here: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ) + ), + line: ( + bg-color: ( + default: lighten(#8c8ea4, 10%), + open: kt-brand-color(), + here: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ) + ) + ), + // link text + text: ( + font-color: ( + default: darken(#868aa8, 10%), + open: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ) + ), + // link arrow + arrow: ( + font-color: ( + default: lighten(#8c8ea4, 10%), + open: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ) + ) + ) + ), + // submenu section + section: ( + text: ( + font-color: lighten(#868aa8, 10%) + ), + icon: ( + font-color: lighten(#868aa8, 12%) + ) + ), + // submenu separator + separator: ( + border: 1px solid rgba(#000000, 0.07) + ) + ) + ) + ) + ) + ) + ) +); diff --git a/src/assets/sass/global/layout/base/_base.scss b/src/assets/sass/global/layout/base/_base.scss new file mode 100644 index 0000000..26768b6 --- /dev/null +++ b/src/assets/sass/global/layout/base/_base.scss @@ -0,0 +1,133 @@ +// +// Base +// + + + +// Body +body { + background: $kt-page-bg-color; +} + +// Base +.kt-subheader { + &.kt-subheader--clear { + margin-bottom: 0 !important; + } +} + +// Desktop mode +@include kt-desktop { + // Page + .kt-wrapper { + transition: kt-get($kt-aside-config, base, minimize, transition); + + // Fixed Header + .kt-header--fixed & { + padding-top: kt-get($kt-header-config, base, desktop, default, height); + } + + // Fixed Content Head + .kt-header--fixed.kt-subheader--fixed.kt-subheader--enabled & { + padding-top: kt-get($kt-header-config, base, desktop, default, height) + kt-get($kt-subheader-config, fixed, height); + } + + // Fixed Aside + .kt-aside--fixed & { + padding-left: kt-get($kt-aside-config, base, default, width); + } + + // Minimize Aside + .kt-aside--fixed.kt-aside--minimize & { + padding-left: kt-get($kt-aside-config, base, minimize, width); + transition: kt-get($kt-aside-config, base, minimize, transition); + } + } + + // Subheader + .kt-subheader { + // Fixed subheader mode + .kt-header--fixed.kt-subheader--fixed & { + position: fixed; + height: kt-get($kt-subheader-config, fixed, height); + top: kt-get($kt-header-config, base, desktop, default, height); + left: 0; + right: 0; + transition: all 0.3s ease; + z-index: kt-get($kt-header-config, base, desktop, fixed, zindex) - 3; + background-color: #fff; + box-shadow: 0px 10px 30px 0px rgba(82,63,105,0.08); + margin: 0; + } + + // Fixed header, minimized header and fixed subheader + .kt-header--fixed.kt-header--minimize.kt-subheader--fixed & { + top: kt-get($kt-header-config, base, desktop, fixed, minimizeHeight); + transition: top 0.3s ease; + } + + .kt-aside--enabled.kt-subheader--fixed & { + left: kt-get($kt-aside-config, base, default, width); + } + + .kt-subheader--fixed.kt-aside--minimize-hover &, + .kt-subheader--fixed.kt-aside--minimize & { + left: kt-get($kt-aside-config, base, minimize, width); + transition: kt-get($kt-aside-config, base, minimize, transition); + } + + // Static header & solid subheader + .kt-header--static.kt-subheader--solid & { + margin: 0 0 kt-get($kt-page-padding, desktop) 0; + min-height: kt-get($kt-subheader-config, fixed, height); + } + } + + // Container + .kt-container { + padding: 0 kt-get($kt-page-padding, desktop); + } + + // Content & fixed subheader mode + .kt-subheader--enabled:not(.kt-subheader--fixed) { + .kt-content { + padding-top: 0; + } + } +} + +// Fixed container width change to fluid +@include kt-media-range( lg, $kt-page-container-width + $kt-aside-minimize-width + (2 * kt-get($kt-page-padding, desktop)) ) { + .kt-container:not(.kt-container--fluid) { + width: 100%; + } +} + +// Tablet and mobile mode +@include kt-tablet-and-mobile { + // Page + .kt-wrapper { + // Fixed Header + .kt-header-mobile--fixed & { + padding-top: kt-get($kt-header-config, base, mobile, self, default, height); + } + } + + // Container + .kt-container { + padding: 0 kt-get($kt-page-padding, mobile); + } + + // Content & fixed subheader mode + .kt-subheader--enabled { + .kt-content { + padding-top: 0; + } + } + + .kt-subheader--enabled.kt-subheader--solid { + .kt-subheader { + margin-bottom: kt-get($kt-page-padding, mobile); + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/layout/brand/_brand.scss b/src/assets/sass/global/layout/brand/_brand.scss new file mode 100644 index 0000000..fa2c947 --- /dev/null +++ b/src/assets/sass/global/layout/brand/_brand.scss @@ -0,0 +1,36 @@ +// +// Aside Brand +// + + + +.kt-header__brand { + display: flex; + flex-direction: row; + padding: 0 kt-get($kt-page-padding, desktop); + height: kt-get($kt-header-config, base, desktop, default, height); + background-color: $kt-secondary-brand-color; + justify-content: center; + align-self: center; + width: 100%; + + .kt-header__brand-logo { + display: flex; + align-self: center; + justify-content: center; + } +} + +@include kt-desktop { + .kt-header__brand { + width: kt-get($kt-aside-config, base, minimize, width); + transition: kt-get($kt-aside-config, base, minimize, transition); + } +} + +// Tablet and mobile mode +@include kt-tablet-and-mobile { + .kt-header__brand { + display: none; + } +} \ No newline at end of file diff --git a/src/assets/sass/global/layout/brand/_config.scss b/src/assets/sass/global/layout/brand/_config.scss new file mode 100644 index 0000000..756778f --- /dev/null +++ b/src/assets/sass/global/layout/brand/_config.scss @@ -0,0 +1,25 @@ +// +// Aside Brand Config +// + + + +$kt-brand-config: ( + self: ( + bg-color: #272631, + shadow: 0px 1px 9px -3px rgba(0,0,0,0.2) + ), + aside-toggler: ( + width: 26px, + height: 26px, + transition-duration: 0.4s, + thickness: 2px, + space: 6px, + radius: 2px, + color: ( + default: #484f66, + hover: #ffffff, + active: #ffffff + ) + ) +); \ No newline at end of file diff --git a/src/assets/sass/global/layout/content/_content.scss b/src/assets/sass/global/layout/content/_content.scss new file mode 100644 index 0000000..a264bcf --- /dev/null +++ b/src/assets/sass/global/layout/content/_content.scss @@ -0,0 +1,47 @@ +// +// Content +// + + + +@include kt-desktop { + // Content + .kt-content { + padding: kt-get($kt-page-padding, desktop) 0; + + // Content fit + &.kt-content--fit-top { + padding-top: 0; + } + + &.kt-content--fit-bottom { + padding-bottom: 0; + } + + // Footer fixed + .kt-footer--fixed & { + padding-bottom: kt-get($kt-footer-config, self, fixed, height); + } + } +} + +@include kt-tablet-and-mobile { + // Content + .kt-content { + padding: kt-get($kt-page-padding, mobile) 0; + + // Content fit + &.kt-content--fit-top { + padding-top: 0; + } + + &.kt-content--fit-bottom { + padding-bottom: 0; + } + + // Subheader enabled + .kt-subheader--enabled.kt-subheader--transparent & { + padding-top: 0; + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/layout/footer/_config.scss b/src/assets/sass/global/layout/footer/_config.scss new file mode 100644 index 0000000..937acb8 --- /dev/null +++ b/src/assets/sass/global/layout/footer/_config.scss @@ -0,0 +1,14 @@ +// +// Footer Config +// + + + +$kt-footer-config: ( + self: ( + fixed: ( + zindex: 97, + height: 60px + ) + ) +) \ No newline at end of file diff --git a/src/assets/sass/global/layout/footer/_footer.scss b/src/assets/sass/global/layout/footer/_footer.scss new file mode 100644 index 0000000..81dff1c --- /dev/null +++ b/src/assets/sass/global/layout/footer/_footer.scss @@ -0,0 +1,100 @@ +// +// Content +// + + + +.kt-footer { + padding: 20px 0; + background: #ffffff; + + .kt-container { + display: flex; + justify-content: space-between; + } + + .kt-footer__copyright { + display: flex; + margin: 0; + padding: 0 1.25rem 0 0; + font-size: 1rem; + font-weight: 400; + justify-content: flex-start; + color: kt-base-color(label, 2); + + .kt-link { + @include kt-link-color(kt-base-color(label, 2), kt-brand-color()); + } + } + + .kt-footer__menu { + display: flex; + justify-content: flex-end; + padding: 0 0 0 0.75rem; + margin: 0; + + .kt-footer__menu-link { + margin: 0 0 0 1.25rem; + padding: 0; + font-size: 1rem; + font-weight: 400; + @include kt-link-color(kt-base-color(label, 3), kt-brand-color()); + } + } +} + +@include kt-desktop { + .kt-footer { + .kt-footer--fixed & { + position: fixed; + transition: kt-get($kt-aside-config, base, minimize, transition); + height: kt-get($kt-footer-config, self, fixed, height); + z-index: kt-get($kt-footer-config, self, fixed, z-index); + bottom: 0; + right: 0; + left: kt-get($kt-aside-config, base, default, width); + box-shadow: 0px 0px 28px 0px rgba(82,63,105,0.13) + } + + .kt-aside--minimize-hover.kt-footer--fixed &, + .kt-aside--minimize.kt-footer--fixed & { + transition: kt-get($kt-aside-config, base, minimize, transition); + left: kt-get($kt-aside-config, base, minimize, width); + } + } +} + +@include kt-tablet-and-mobile { + .kt-footer { + padding: 15px 0; + } +} + +@include kt-mobile { + .kt-footer { + .kt-container { + flex-direction: column; + justify-content: center; + } + + .kt-footer__copyright { + justify-content: center; + padding: 0; + order: 2; + } + + .kt-footer__menu { + justify-content: center; + order: 1; + padding: 0; + margin: 0 0 0.75rem 0; + + .kt-footer__menu-link { + &:first-child { + padding-left: 0; + margin-left: 0; + } + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/layout/header/_base-mobile.scss b/src/assets/sass/global/layout/header/_base-mobile.scss new file mode 100644 index 0000000..306ec85 --- /dev/null +++ b/src/assets/sass/global/layout/header/_base-mobile.scss @@ -0,0 +1,83 @@ +// +// Header Mobile +// + + + +// Desktop mode +@include kt-desktop { + .kt-header-mobile { + display: none; + } +} + +// Tablet & mobile mode +@include kt-tablet-and-mobile { + .kt-header-mobile { + display: flex; + justify-content: space-between; + padding: 0 kt-get($kt-page-padding, mobile); + height: kt-get($kt-header-config, base, mobile, self, default, height); + min-height: kt-get($kt-header-config, base, mobile, self, default, height); + position: relative; + z-index: 1; + background-color: #19385E; + box-shadow: 0px 0px 40px 0px rgba(82,63,105,0.1); + + .kt-header__topbar--mobile-on & { + box-shadow: none; + } + + // Fixed + .kt-header-mobile--fixed & { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: kt-get($kt-header-config, base, mobile, self, fixed, zindex); + } + + // Logo + .kt-header-mobile__logo { + display: flex; + align-items: center; + justify-content: flex-start; + } + + // Toolbar + .kt-header-mobile__toolbar { + display: flex; + align-items: center; + justify-content: flex-end; + + @include kt-burger-icon-build(kt-header-mobile__toolbar-toggler, kt-get($kt-header-config, base, mobile, toolbar, toggler)); + @include kt-burger-icon-skin(kt-header-mobile__toolbar-toggler, kt-get($kt-header-config, base, mobile, toolbar, toggler, color)); + + .kt-header-mobile__toolbar-toggler { + margin: 0 0 0 1.5rem; + } + + .kt-header-mobile__toolbar-topbar-toggler { + @include kt-button-reset(); + display: flex; + align-items: center; + margin: 0 0.5rem 0 1.25rem; + + i { + @include kt-transition(); + color: kt-get($kt-header-config, base, mobile, toolbar, toggler, color, default); + font-size: 1.5rem; + line-height: 0; + } + + &.kt-header-mobile__toolbar-topbar-toggler--active, + &:hover { + i { + @include kt-transition(); + color: kt-get($kt-header-config, base, mobile, toolbar, toggler, color, hover) + } + } + } + } + } +} diff --git a/src/assets/sass/global/layout/header/_config.scss b/src/assets/sass/global/layout/header/_config.scss new file mode 100644 index 0000000..5f938a4 --- /dev/null +++ b/src/assets/sass/global/layout/header/_config.scss @@ -0,0 +1,790 @@ +// +// Header +// + + + +$kt-header-fixed-zindex: 97; + +$kt-header-config: ( + base: ( + desktop: ( + default: ( + height: 80px + ), + fixed: ( + zindex: $kt-header-fixed-zindex + ) + ), + + mobile: ( + self: ( + default: ( + height: 50px, + ), + fixed: ( + zindex: $kt-header-fixed-zindex + ) + ), + + toolbar: ( + toggler: ( + width: 26px, + height: 26px, + transition-duration: 0.4s, + thickness: 2px, + space: 6px, + radius: 2px, + color: ( + default: #b8bac3, + hover: kt-brand-color(), + active: kt-brand-color() + ) + ) + ) + ) + ), + + menu: ( + // Desktop + desktop: ( + // Base Parameters + base: ( + class: kt-header-menu, // menu element class name + mode: desktop // menu mode: "desktop", "desktop-and-tablet" or "general" + ), + + // Customize + build: ( + layout: ( + // self + self: ( + margin: 0 0 0 kt-get($kt-page-padding, desktop) + ), + + // primary item + item: ( + // menu itself + self: ( + padding: 0px 0.25rem + ), + + // primary menu link + link: ( + // self + self: ( + padding: 0.25rem 0.5rem + ), + + // link icon + icon: ( + width: 30px, + font-size: 1.4rem, + padding: 0 + ), + + // link bullet + bullet: ( + self: ( + width: 20px + ), + + dot: ( + size: 4px, + ), + + line: ( + width: 5px, + height: 1px, + ) + ), + + // link text + text: ( + font-size: 1rem, + font-weight: 400, + font-transform: initial + ), + + // link badge + badge: ( + padding: 0px 0px 0px 5px + ), + + // link arrow + arrow: ( + width: 20px, + align: flex-end, + font-size: 0.8rem + ) + ), + + // submenu + submenu: ( + // submenu itself + self: ( + zindex: $kt-header-fixed-zindex + 1, + padding: ( + classic: 20px 0px, + megamenu: 0px + ), + border-radius: 4px, + width: ( + // classic width + classic: 275px, + + // full width + full: ( + offset: 20px + ) + ), + animation: ( + offset: -10px + ), + space: 1px + ), + + // submenu item + item: ( + self: ( + padding: 0px + ), + + link: ( + // link self + self: ( + padding: 11px 30px, + padding-x: 30px + ), + + // link icon + icon: ( + width: 33px, + font-size: 1.4rem, + padding: 0 + ), + + // link bullet + bullet: ( + self: ( + width: 20px + ), + + dot: ( + size: 4px + ), + + line: ( + width: 9px, + height: 1px + ) + ), + + // link text + text: ( + font-size: 1rem, + font-weight: 400, + font-transform: initial + ), + + // link badge + badge: ( + padding: 0px 0px 0px 5px + ), + + // link arrow + arrow: ( + padding: 0px 0px 0px 10px, + width: 20px, + font-size: 0.8rem + ) + ), + + column: ( + // column itself + self: ( + padding: 0 0 20px 0 + ), + + // heading + heading: ( + // heading itself + self: ( + padding: 30px 30px 10px 30px + ), + + // heading caption + caption: ( + // caption icon + icon: ( + width: 30px, + font-size: 1.35rem, + padding: 0 + ), + + // caption text + text: ( + font-size: 1.07rem, + font-weight: 500, + font-transform: initial + ), + + // caption badge + badge: ( + padding: 0px 0px 0px 5px + ) + ) + ) + ) + ) + ) + ) + ), + + skin: ( + // Primary item + item: ( + // submenu + submenu: ( + // submenu itself + self: ( + bg-color: #ffffff, + box-shadow: 0px 0px 50px 0px rgba(82,63,105,0.15) + ), + + // item + item: ( + link: ( + self: ( + bg-color: ( + active: $kt-brand-hover-color, + here: $kt-brand-hover-color, + hover: transparent + ) + ), + // link icon + icon: ( + font-color: ( + default: #cacad2, + active: kt-brand-color(), + here: kt-brand-color(), + hover: kt-brand-color() + ) + ), + // link bullet + bullet: ( + dot: ( + bg-color: ( + default: #cacad2, + active: kt-brand-color(), + here: kt-brand-color(), + hover: kt-brand-color() + ) + ), + line: ( + bg-color: ( + default: #cacad2, + active: kt-brand-color(), + here: kt-brand-color(), + hover: kt-brand-color() + ) + ) + ), + + // link text + text: ( + font-color: ( + default: #5f6281, + active: kt-brand-color(), + here: kt-brand-color(), + hover: kt-brand-color() + ) + ), + // link arrow + arrow: ( + font-color: ( + default: #cacad2, + active: kt-brand-color(), + here: kt-brand-color(), + hover: kt-brand-color() + ) + ) + ), + // mega menu column + column: ( + // separator + separator: ( + border: 1px solid #f6f6f9 + ), + // heading + heading: ( + // heading caption + caption: ( + // caption icon + icon: ( + font-color: #cacad2 + ), + // caption text + text: ( + font-color: #5f6281 + ) + ) + ) + ) + ) + ) + ) + ) + ) + ), + + // Tablet & mobile + tablet-and-mobile: ( + // Base Parameters + base: ( + class: kt-header-menu-mobile, + parent-class: kt-header-menu-wrapper, + mode: tablet-and-mobile, //menu mode: "mobile", "tablet-and-mobile" or "general" + ), + + // Customize + build: ( + // Layout + layout: ( + // default mode + default: ( + // menu panel itself + self: ( + padding: 30px 0 30px 0 + ), + + // root item + item: ( + // item itself + self: ( + margin: 0 + ), + + // item link + link: ( + // link itself + self: ( + height: 44px, + padding: 9px 30px + ), + + // link icon + icon: ( + width: 35px, + font-size: 1.4rem + ), + + // link bullet + bullet: ( + self: ( + width: 15px, + ), + + dot: ( + size: 4px + ), + + line: ( + width: 5px, + height: 1px + ) + ), + + // link text + text: ( + font-size: 1.02rem, + font-weight: 400, + font-transform: initial + ), + + // link arrow + arrow: ( + width: 20px, + transition: all 0.3s ease, + font-size: 0.7rem + ), + + // link badge + badge: ( + padding: 0px 0px 0px 5px, + align: right + ) + ), + + // item submenu + submenu: ( + // submenu self + self: ( + indent: 15px, + margin: 0 + ), + + // submenu item + item: ( + // item itself + self: ( + margin: 0 + ), + + // item link + link: ( + // link itself + self: ( + height: 40px, + padding: 0 30px, + padding-x: 30px + ), + + // link icon + icon: ( + width: 35px, + font-size: 1.35rem + ), + + // link bullet + bullet: ( + self: ( + width: 20px, + ), + dot: ( + size: 4px + ), + line: ( + width: 5px, + height: 1px + ) + ), + + // link text + text: ( + font-size: 1rem, + font-weight: 400, + font-transform: initial + ), + + // link arrow + arrow: ( + width: 20px, + transition: all 0.3s ease, + font-size: 0.7rem + ), + + // link badge + badge: ( + padding: 0px 0px 0px 5px + ) + ) + ), + + // submenu section + section: ( + self: ( + indent: 15px, + padding: 0 25px, + margin: 20px 0 0 0, + height: 40px + ), + + text: ( + font-size: 0.8rem, + font-weight: 300, + font-transform: uppercase, + letter-spacing: 0.3px + ), + + icon: ( + font-size: 1.1rem + ) + ), + + // submenu separator + separator: ( + margin: 15px 0 + ) + ) + ), + + // root section + section: ( + self: ( + padding: 0 27px, + margin: 20px 0 0 0, + height: 40px + ), + + text: ( + font-size: 0.83rem, + font-weight: 500, + font-transform: uppercase, + letter-spacing: 0.3px + ), + + icon: ( + font-size: 1.1rem + ) + ), + + // root separator + separator: ( + margin: 15px 0, + ) + ) + ), + + skin: ( + // default mode + default: ( + // menu panel itself + self: ( + bg-color: #ffffff + ), + + // root item + item: ( + // item itself + self: ( + bg-color: ( + default: null, + open: null, + here: null, + active: null, + hover: null + ) + ), + // item link + link: ( + // link itself + self: ( + bg-color: ( + default: transparent, + open: $kt-brand-hover-color, + here: $kt-brand-hover-color, + active: transparent, + hover: transparent + ) + ), + // link icon + icon: ( + font-color: ( + default: lighten(#8c8ea4, 10%), + open: kt-brand-color(), + here: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ), + ), + // link bullet + bullet: ( + dot: ( + bg-color: ( + default: lighten(#8c8ea4, 10%), + open: kt-brand-color(), + here: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ) + ), + line: ( + bg-color: ( + default: lighten(#8c8ea4, 10%), + open: kt-brand-color(), + here: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ) + ) + ), + // link text + text: ( + font-color: ( + default: darken(#868aa8, 15%), + open: kt-brand-color(), + here: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ) + ), + // link arrow + arrow: ( + font-color: ( + default: lighten(#8c8ea4, 10%), + open: kt-brand-color(), + here: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ) + ) + ), + + // item submenu + submenu: ( + // submenu self + self: ( + bg-color: ( + default: null, + open: null, + active: null, + hover: null + ) + ), + // submenu item + item: ( + // item itself + self: ( + bg-color: ( + default: null, + open: null, + here: null, + active: null, + hover: null + ) + ), + // item link + link: ( + // link itself + self: ( + bg-color: ( + default: transparent, + open: transparent, + here: $kt-brand-hover-color, + active: $kt-brand-hover-color, + hover: transparent + ) + ), + // link icon + icon: ( + font-color: ( + default: lighten(#8c8ea4, 10%), + open: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ) + ), + // link bullet + bullet: ( + dot: ( + bg-color: ( + default: lighten(#8c8ea4, 10%), + open: kt-brand-color(), + here: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ) + ), + line: ( + bg-color: ( + default: lighten(#8c8ea4, 10%), + open: kt-brand-color(), + here: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ) + ) + ), + // link text + text: ( + font-color: ( + default: #6b6f8d, + open: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ) + ), + + // link arrow + arrow: ( + font-color: ( + default: lighten(#8c8ea4, 10%), + open: kt-brand-color(), + active: kt-brand-color(), + hover: kt-brand-color() + ) + ) + ) + ), + + // submenu section + section: ( + text: ( + font-color: lighten(#868aa8, 10%) + ), + icon: ( + font-color: lighten(#868aa8, 12%) + ) + ), + + // submenu separator + separator: ( + border: 1px solid rgba(#000000, 0.07) + ) + ) + ), + + // root section + section: ( + text: ( + font-color: lighten(#868aa8, 10%) + ), + icon: ( + font-color: lighten(#868aa8, 12%) + ) + ), + + // root separator + separator: ( + border: 1px solid rgba(#000000, 0.07) + ) + ) + ) + ) + ), + + // Offcanvas mobile mode + offcanvas-mobile: ( + layout: ( + self: ( + zindex: 1001, + width: 275px + ), + + close: ( + size: 25px, + font-size: 1.4rem + ) + ), + + skin: ( + self: ( + bg-color: #ffffff, + shadow: 0px 1px 9px -3px rgba(0,0,0,0.75) + ), + + overlay: ( + bg-color: rgba(#000000, 0.1), + ), + + close: ( + icon-color: ( + default: #968ad4, + hover: #ffffff + ), + bg-color: ( + default: darken(#f8f8fb, 5%), + hover: kt-brand-color() + ) + ) + ) + ) + ), + + topbar: ( + height: ( + mobile: 50px + ) + ) +); \ No newline at end of file diff --git a/src/assets/sass/global/layout/header/_header.scss b/src/assets/sass/global/layout/header/_header.scss new file mode 100644 index 0000000..f523873 --- /dev/null +++ b/src/assets/sass/global/layout/header/_header.scss @@ -0,0 +1,73 @@ +// +// Header +// + + + + +// Styles +$kt-header-item-icon-color: rgba(kt-brand-color(), 0.7); +$kt-header-item-hover-bg: rgba(#f0f3ff, 0.7); + +// Desktop mode +@include kt-desktop { + // Header + .kt-header { + display: flex; + justify-content: space-between; + height: kt-get($kt-header-config, base, desktop, default, height); + transition: kt-get($kt-aside-config, base, minimize, transition); + background-color: #fff; + box-shadow: 0px 0px 40px 0px rgba(82,63,105,0.1); + + // Fixed + &.kt-header--fixed { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: kt-get($kt-header-config, base, desktop, fixed, zindex); + } + + // Fixed header & fixed subheader + .kt-header--fixed.kt-subheader--fixed & { + border-bottom: 1px solid #eff0f6; + box-shadow: none; + } + + // Title + .kt-header__title { + display: flex; + align-self: center; + font-weight: 500; + font-size: 1.4rem; + color: #434349; + margin-left: kt-get($kt-page-padding, desktop); + margin-right: 1rem; + } + } +} + +// Mobile mode +@include kt-tablet-and-mobile { + // Header + .kt-header { + // Title + .kt-header__title { + display: none; + } + + // Topbar + .kt-header__topbar { + background-color: #ffffff; + box-shadow: none; + + // Topbar expaneded on mobile mode + .kt-header__topbar--mobile-on & { + box-shadow: 0px 0px 40px 0px rgba(82,63,105,0.1); + border-top: 1px solid kt-base-color(grey, 2); + } + } + } +} + diff --git a/src/assets/sass/global/layout/header/_menu.scss b/src/assets/sass/global/layout/header/_menu.scss new file mode 100644 index 0000000..ffa2e25 --- /dev/null +++ b/src/assets/sass/global/layout/header/_menu.scss @@ -0,0 +1,90 @@ +// +// Header Menu +// + + + + +// Desktop Mode +@include kt-menu-hor-build-layout(kt-get($kt-header-config, menu, desktop)); +@include kt-menu-hor-build-skin(kt-get($kt-header-config, menu, desktop), default); + +// Tablet & Mobile Mode +@include kt-menu-ver-build-layout(kt-get($kt-header-config, menu, tablet-and-mobile)); +@include kt-menu-ver-build-skin(kt-get($kt-header-config, menu, tablet-and-mobile), default); + +// Header Menu Mobile Offcanvas +@include kt-offcanvas-build(kt-header-menu-wrapper, tablet-and-mobile, kt-get($kt-header-config, menu, offcanvas-mobile)); + +// Desktop Mode +@include kt-desktop { + // Header menu + .kt-header-menu { + // Menu nav + .kt-menu__nav { + // Menu item + > .kt-menu__item { + &:first-child { + padding-left: 0; + } + + // Menu link + > .kt-menu__link { + padding: 0.75rem 1.25rem; + + @include kt-rounded { + border-radius: 40px; + } + + > .kt-menu__link-text { + color: #8a88a2; + font-weight: 500; + } + + > .kt-menu__link-icon { + color: #8a88a2; + } + + > .kt-menu__hor-arrow { + color: #8a88a2; + } + } + + // Menu submenu + > .kt-menu__submenu { + > .kt-menu__subnav { + border-top-left-radius: 0; + border-top-right-radius: 0; + } + } + + // Menu item states + &.kt-menu__item--active, + &.kt-menu__item--here { + > .kt-menu__link { + background-color: $kt-brand-hover-color; + } + } + + &:hover, + &.kt-menu__item--active, + &.kt-menu__item--here, + &.kt-menu__item--hover { + > .kt-menu__link { + > .kt-menu__link-text { + color: kt-brand-color(); + } + + > .kt-menu__link-icon { + color: kt-brand-color(); + } + + > .kt-menu__hor-arrow { + color: kt-brand-color(); + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/layout/header/_topbar.scss b/src/assets/sass/global/layout/header/_topbar.scss new file mode 100644 index 0000000..59d45cb --- /dev/null +++ b/src/assets/sass/global/layout/header/_topbar.scss @@ -0,0 +1,248 @@ +// +// Topbar +// + + + + +$kt-header-topbar-item-size: 40px; +$kt-header-topbar-lage-flag-size: 19px; +$kt-header-topbar-user-avatar-size: 34px; +$kt-header-topbar-item-size-mobile: 34px; +$kt-header-topbar-user-avatar-size-mobile: 30px; + +.kt-header__topbar { + display: flex; + align-items: stretch; + padding: 0; + padding-right: kt-get($kt-page-padding, desktop); + + .kt-header__topbar-item { + display: flex; + align-items: stretch; + margin: 0 0.1rem; + + .kt-header__topbar-wrapper { + cursor: pointer; + display: flex; + align-items: stretch; + + .kt-badge.kt-badge--notify { + position: absolute; + left: 50%; + margin-left: -2px; + top: 14px; + } + } + + .kt-header__topbar-icon { + display: flex; + align-items: center; + align-self: center; + justify-content: center; + height: $kt-header-topbar-item-size; + width: $kt-header-topbar-item-size; + cursor: pointer; + border-radius: 50%; + @include kt-transition(); + + i { + @include kt-transition(); + font-size: 1.4rem; + color: #b8bac3; + } + } + + // Languages + &.kt-header__topbar-item--langs { + .kt-header__topbar-icon { + img { + border-radius: 50%; + width: $kt-header-topbar-lage-flag-size; + } + } + + .dropdown-menu { + .kt-nav__link-icon { + padding-right: 10px; + + img { + border-radius: 50%; + width: 18px; + } + } + } + } + + &:hover, + &.show { + .kt-header__topbar-icon { + @include kt-transition(); + background-color: $kt-brand-hover-color; + + i { + @include kt-transition(); + color: kt-brand-color(); + } + } + } + + // User profile + &.kt-header__topbar-item--user { + margin-left: 0.5rem; + + .kt-header__topbar-wrapper { + .kt-header__topbar-welcome { + display: flex; + align-self: center; + padding: 0 0.55rem 0 0; + font-weight: 500; + font-size: 0.9rem; + color: #636177; + } + + .kt-header__topbar-username { + display: flex; + align-self: center; + padding: 0 0.55rem 0 0; + font-weight: 500; + font-size: 1rem; + color: #fff; + } + + img { + align-self: center; + max-height: $kt-header-topbar-user-avatar-size; + border-radius: 50%; + } + + .kt-header__topbar-icon { + background-color: kt-brand-color(); + font-size: 1.5rem; + font-weight: 500; + color: #fff; + + > i { + color: #fff; + } + } + } + + &:hover, + &.show { + .kt-header__topbar-icon { + background-color: kt-brand-color(); + color: #fff; + + > i { + color: #fff; + } + } + } + } + + // Quickpanel + &.kt-header__topbar-item--quickpanel { + margin-left: 0.5rem; + + .kt-header__topbar-icon { + background-color: $kt-secondary-brand-color; + + > i { + color: #fff; + } + } + + &:hover, + &.show { + .kt-header__topbar-icon { + background-color: $kt-secondary-brand-color; + + > i { + color: #fff; + } + } + } + } + } +} + +@include kt-tablet-and-mobile { + .kt-header__topbar { + padding: 0 kt-get($kt-page-padding, mobile); + background-color: #fff; + box-shadow: 0px 1px 9px -3px rgba(0,0,0, 0.1); + transition: all 0.3s ease; + margin-top: -(kt-get($kt-header-config, topbar, height, mobile)); + height: kt-get($kt-header-config, topbar, height, mobile); + position: absolute; + left: 0; + right: 0; + justify-content: flex-end; + + // Fixed mobile header + .kt-header-mobile--fixed & { + position: fixed; + z-index: kt-get($kt-header-config, base, mobile, self, fixed, zindex) - 1; + } + + // Topbar shown + .kt-header__topbar--mobile-on & { + margin-top: 0; + transition: all 0.3s ease; + } + + // Topbar item + .kt-header__topbar-item { + margin: 0 2px; + padding: 0; + + .kt-header__topbar-wrapper { + display: flex; + align-items: stretch; + + .kt-badge.kt-badge--notify { + top: 6px; + } + } + + .kt-header__topbar-icon { + height: $kt-header-topbar-item-size-mobile; + width: $kt-header-topbar-item-size-mobile; + + i { + font-size: 1.3rem; + } + } + + &.kt-header__topbar-item--user { + margin-left: 2px; + margin-right: 0; + padding: 0; + + .kt-header__topbar-wrapper { + padding: 0 2px; + + .kt-header__topbar-welcome { + padding: 0 0.35rem 0 0; + font-size: 0.9rem; + } + + .kt-header__topbar-username { + padding: 0 0.55rem 0 0; + font-size: 0.9rem; + } + + img { + max-height: $kt-header-topbar-user-avatar-size-mobile; + } + + .kt-badge.kt-badge--username { + height: $kt-header-topbar-user-avatar-size-mobile; + width: $kt-header-topbar-user-avatar-size-mobile; + } + } + } + } + } +} \ No newline at end of file diff --git a/src/assets/sass/global/layout/subheader/_subheader.scss b/src/assets/sass/global/layout/subheader/_subheader.scss new file mode 100644 index 0000000..6bf8b57 --- /dev/null +++ b/src/assets/sass/global/layout/subheader/_subheader.scss @@ -0,0 +1,131 @@ +// +// Subheader Search +// + + + + +// Variables +$kt-base-color: #574cc6; +$kt-border-color: lighten($kt-base-color, 8%); +$kt-icon-color: #22b9ff; // General Mode + +// Subheader Search +.kt-subheader-search { + background: #564FC1; + padding: 40px 0; + margin-bottom: kt-get($kt-page-padding, desktop); + + // Title + .kt-subheader-search__title { + font-size: 1.8rem; + font-weight: 500; + color: #fff; + margin: 0; + } + + // Desc + .kt-subheader-search__desc { + font-size: 1rem; + font-weight: 500; + color: #9388fa; + display: inline-block; + padding-left: 0.5rem; + } + + // Input icon + .kt-input-icon { + margin-right: 15px; + } + + .kt-input-icon__icon { + i { + color: $kt-icon-color; + } + } + + // Form control + .form-control { + background: transparent; + border-color: $kt-border-color; + color: lighten($kt-border-color, 10%); + @include kt-input-placeholder( lighten($kt-border-color, 5%)); + + &:focus { + border-color: lighten($kt-border-color, 10%); + @include kt-input-placeholder( lighten($kt-border-color, 10%)); + color: lighten($kt-border-color, 13%); + + &+.kt-input-icon__icon i { + color: lighten($kt-icon-color, 5%); + } + } + } + + // Search button + .kt-subheader-search__submit-btn { + background: $kt-icon-color; + border-color: $kt-icon-color; + color: #fff; + + &:hover { + background: lighten($kt-icon-color, 5%); + border-color: lighten($kt-icon-color, 5%); + } + } + + // Search link + .kt-subheader-search__link { + display: inline-block; + margin-left: 20px; + font-weight:500; + color: #9388fa; + + &:hover { + color: lighten(#9388fa, 7%); + } + + @include kt-link-color( #9388fa, lighten(#9388fa, 7%)); + } + + // Search form + .kt-form { + margin-top: 2rem; + } + + // Clear bottom margin + &.kt-subheader-search--clear { + margin-bottom: 0; + } +} + +// Tablet and mobile mode +@include kt-tablet-and-mobile { + // Subheader Search + .kt-subheader-search { + padding: 20px 0; + margin-bottom: kt-get($kt-page-padding, mobile); + + // Title + .kt-subheader-search__title { + font-size: 1.4rem; + } + + // Desc + .kt-subheader-search__desc { + font-size: 1rem; + padding-left: 0; + } + + // Input icon + .kt-input-icon { + width: auto; + margin-bottom: 10px; + } + + // Clear bottom margin + &.kt-subheader-search--clear { + margin-bottom: 0; + } + } +} \ No newline at end of file diff --git a/src/assets/sass/pages/error/error-1.scss b/src/assets/sass/pages/error/error-1.scss new file mode 100644 index 0000000..08f621c --- /dev/null +++ b/src/assets/sass/pages/error/error-1.scss @@ -0,0 +1,51 @@ +// +// Page - Error 1 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +.kt-error-v1 { + background-position: center; + background-repeat: no-repeat; + background-attachment: fixed; + background-size: cover; + + .kt-error-v1__container { + .kt-error-v1__number { + font-size: 150px; + margin-left: 80px; + margin-top: 9rem; + font-weight: 700; + color: kt-base-color(label, 3); + } + + .kt-error-v1__desc { + font-size: 1.5rem; + margin-left: 80px; + color: kt-base-color(label, 2); + } + } +} + +@include kt-mobile() { + .kt-error-v1 { + .kt-error-v1__container { + .kt-error-v1__number { + margin: 120px 0 0 3rem; + font-size: 8rem; + } + + .kt-error-v1__desc { + margin-left: 3rem; + padding-right: 0.5rem; + } + } + } +} diff --git a/src/assets/sass/pages/error/error-2.scss b/src/assets/sass/pages/error/error-2.scss new file mode 100644 index 0000000..ca18311 --- /dev/null +++ b/src/assets/sass/pages/error/error-2.scss @@ -0,0 +1,49 @@ +// +// Page - Error 2 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +.kt-error-v2 { + background-position: center; + background-repeat: no-repeat; + background-attachment: fixed; + background-size: cover; + + .kt-error_container { + .kt-error_title2 { + + > h1 { + font-size: 6rem; + text-align: center; + margin-top: 45rem; + font-weight: 500; + } + } + + .kt-error_desc { + font-size: 2.5rem; + text-align: center; + display: block; + font-weight: 700; + } + } +} + +@include kt-mobile() { + .kt-error-v2 { + .kt-error_container { + .kt-error_desc { + padding-left: 0.6rem; + padding-right: 0.6rem; + } + } + } +} diff --git a/src/assets/sass/pages/error/error-3.scss b/src/assets/sass/pages/error/error-3.scss new file mode 100644 index 0000000..a639ad5 --- /dev/null +++ b/src/assets/sass/pages/error/error-3.scss @@ -0,0 +1,92 @@ +// +// Page - Error 3 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +.kt-error-v3 { + background-position: center; + background-repeat: no-repeat; + background-attachment: fixed; + background-size: cover; + + .kt-error_container { + .kt-error_number { + > h1 { + font-size: 15.7rem; + margin-left: 7.85rem; + margin-top: 11.4rem; + font-weight: 500; + -webkit-text-stroke-width: 0.35rem; + -moz-text-stroke-width: 0.35rem; + text-stroke-width: 0.35rem; + + color:#A3DCF0; + -webkit-text-stroke-color: white; + -moz-text-stroke-color: white; + text-stroke-color: white; + + @include kt-hack-ie { + color: white; + } + } + } + + .kt-error_title { + margin-left: 7.85rem; + font-size: 2.5rem; + font-weight: 700; + color: kt-base-color(label, 4); + } + + .kt-error_subtitle { + margin-left: 7.85rem; + margin-top: 3.57rem; + font-size: 1.8rem; + font-weight: 700; + color: kt-base-color(label, 3); + } + + .kt-error_description { + margin-left: 7.85rem; + font-size: 1.4rem; + font-weight: 500; + color: kt-base-color(label, 2); + } + } +} + +@include kt-mobile() { + .kt-error-v3 { + .kt-error_container { + .kt-error_number { + > h1 { + font-size: 8rem; + margin-left: 4rem; + margin-top: 3.5rem; + } + } + + .kt-error_title { + margin-left: 4rem; + } + + .kt-error_subtitle { + margin-left: 4rem; + padding-right: 0.5rem; + } + + .kt-error_description { + margin-left: 4rem; + padding-right: 0.5rem; + } + } + } +} diff --git a/src/assets/sass/pages/error/error-4.scss b/src/assets/sass/pages/error/error-4.scss new file mode 100644 index 0000000..a45d14f --- /dev/null +++ b/src/assets/sass/pages/error/error-4.scss @@ -0,0 +1,97 @@ +// +// Page - Error 4 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +.kt-error-v4 { + background-position: center; + background-repeat: no-repeat; + background-attachment: fixed; + background-size: cover; + + .kt-error_container { + + .kt-error_number { + font-size: 15.7rem; + margin-left: 14.3rem; + margin-top: 11.4rem; + font-weight: 700; + color: #84D49E; + } + + .kt-error_title { + margin: -70px 0 2% 14.3rem; + font-size: 10rem; + font-weight: 700; + color: #84D49E; + } + + .kt-error_description { + margin-left: 15rem; + font-size: 2.5rem; + margin: -70px 0 2% 14.8rem; + font-weight: 700; + color: #CC6622; + } + } +} + +@include kt-tablet { + .kt-error-v4 { + .kt-error_container { + .kt-error_number { + font-size: 12rem; + margin-left: 7rem; + margin-top: 8rem; + font-weight: 700; + } + + .kt-error_title { + margin: -40px 0 2% 7rem; + font-size: 7rem; + font-weight: 700; + } + + .kt-error_description { + margin-left: 15rem; + font-size: 2rem; + margin: -40px 0 2% 7.3rem; + font-weight: 700; + } + } + } +} + +@include kt-mobile() { + .kt-error-v4 { + .kt-error_container { + text-align: center; + + .kt-error_number { + font-size: 9rem; + margin: 4rem auto 0 auto; + } + + .kt-error_title { + margin: 0.3rem auto; + text-align: center; + font-size: 5rem; + } + + .kt-error_description { + text-align: center; + font-size: 2rem; + margin: 0.3rem auto; + padding: 0 0.5rem 0 0.5rem; + } + } + } +} diff --git a/src/assets/sass/pages/error/error-5.scss b/src/assets/sass/pages/error/error-5.scss new file mode 100644 index 0000000..e112b65 --- /dev/null +++ b/src/assets/sass/pages/error/error-5.scss @@ -0,0 +1,137 @@ +// +// Page - Error 5 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +.kt-error-v5 { + background-position: center; + background-repeat: no-repeat; + background-attachment: fixed; + background-size: cover; + + .kt-error_container { + .kt-error_title { + > h1 { + font-size: 14rem; + margin-left: 25rem; + margin-top: 18rem; + font-weight: 700; + color: #314DA7; + -webkit-text-stroke-color: white; + } + } + + .kt-error_subtitle { + margin-left: 26rem; + margin-top: 3.57rem; + font-size: 2.3rem; + font-weight: 700; + color: kt-base-color(label, 3); + } + + .kt-error_description { + margin-left: 26rem; + font-size: 1.8rem; + font-weight: 500; + line-height: 130%; + color: kt-base-color(label, 2); + } + } +} + +@include kt-minimal-desktop() { + .kt-error-v5 { + background-position: bottom -80px left 1300px; + + .kt-error_container { + .kt-error_title { + + > h1 { + font-weight: 700; + font-size: 12rem; + margin-left: 7rem; + } + } + + .kt-error_subtitle { + margin-left: 7rem; + font-size: 2.3rem; + font-weight: 700; + } + + .kt-error_description { + margin-left: 7rem; + font-size: 1.8rem; + font-weight: 500; + line-height: 130%; + } + } + } +} + +@include kt-tablet { + .kt-error-v5 { + .kt-error_container { + .kt-error_title { + + > h1 { + font-weight: 700; + font-size: 12rem; + margin-left: 7rem; + } + } + + .kt-error_subtitle { + margin-left: 7rem; + font-size: 2.3rem; + font-weight: 700; + } + + .kt-error_description { + margin-left: 7rem; + font-size: 1.8rem; + font-weight: 500; + line-height: 130%; + } + } + } +} + +@include kt-mobile() { + .kt-error-v5 { + .kt-error_container { + + .kt-error_title { + + + > h1 { + font-size: 6rem; + margin-top: 5rem; + margin-left: 4rem; + } + } + + .kt-error_subtitle { + margin-top: 2rem; + margin-left: 4rem; + font-size: 2rem; + line-height: 2rem; + + } + + .kt-error_description { + font-size: 1.4rem; + margin-left: 4rem; + + } + } + } +} diff --git a/src/assets/sass/pages/error/error-6.scss b/src/assets/sass/pages/error/error-6.scss new file mode 100644 index 0000000..adf6fa2 --- /dev/null +++ b/src/assets/sass/pages/error/error-6.scss @@ -0,0 +1,56 @@ +// +// Page - Error 6 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +.kt-error-v6 { + background-position: center; + background-repeat: no-repeat; + background-attachment: fixed; + background-size: cover; + + .kt-error_container { + text-align: center; + + .kt-error_subtitle { + > h1 { + font-size: 10rem; + margin-top: 12rem; + font-weight: 700; + } + } + + .kt-error_description { + margin-top: 3rem; + font-size: 2.3rem; + font-weight: 500; + line-height: 3rem; + } +} +} + +@include kt-mobile() { + .kt-error-v6 { + .kt-error_container { + .kt-error_subtitle { + > h1 { + font-size: 5rem; + } + } + + .kt-error_description { + font-size: 1.7rem; + padding-left: 1.5rem; + padding-right: 1.5rem; + } + } + } +} diff --git a/src/assets/sass/pages/faq/faq-1.scss b/src/assets/sass/pages/faq/faq-1.scss new file mode 100644 index 0000000..a2d499c --- /dev/null +++ b/src/assets/sass/pages/faq/faq-1.scss @@ -0,0 +1,48 @@ +// +// Page - FAQ v1 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +.kt-faq-v1 { + .kt-nav { + .kt-nav__item { + padding: 0.5rem 0; + + .kt-nav__link { + background-color: transparent !important; + + > .kt-nav__link-text { + font-size: 1.1rem; + font-weight: 500; + color: kt-base-color(label, 2); + transition: color 0.3s ease; + } + } + + &:hover, + &.kt-nav__item--active { + > .kt-nav__link { + + > .kt-nav__link-text { + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + } + + .kt-nav__sub { + .kt-nav__item { + padding: 0.25rem 0; + } + } + } + } +} diff --git a/src/assets/sass/pages/inbox/inbox.scss b/src/assets/sass/pages/inbox/inbox.scss new file mode 100644 index 0000000..afcfbd4 --- /dev/null +++ b/src/assets/sass/pages/inbox/inbox.scss @@ -0,0 +1,1350 @@ +// +// Page - Inbox +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +// Config for aside +$kt-aside-config: ( + offcanvas: ( + layout: ( + self: ( + zindex: 1001, + width: 300px + ), + close: ( + size: 25px, + font-size: 1.4rem + ) + ), + skin: ( + overlay: ( + bg-color: rgba(#000000, 0.05) + ), + close: ( + bg-color: ( + default: kt-base-color(grey, 1), + hover: transparent + ), + icon-color: ( + default: kt-base-color(label, 2), + hover: kt-brand-color() + ) + ) + ) + ) +); + +$kt-inbox-icon-color: #8e96b8; +$kt-inbox-hover-bg: #f2f3f7; + +// Base +.kt-inbox { + // Icon + .kt-inbox__icon { + @include kt-btn-reset(); + display: flex; + justify-content: center; + align-items: center; + height: 35px; + width: 35px; + background-color: kt-base-color(grey, 1); + transition: all 0.3s ease; + cursor: pointer; + margin: 0; + border-radius: 0; + + i { + font-size: 1.1rem; + } + + &.kt-inbox__icon--sm { + height: 26px; + width: 26px; + + i { + font-size: 0.8rem; + } + } + + &.kt-inbox__icon--md { + height: 30px; + width: 30px; + + i { + font-size: 1rem; + } + } + + &.kt-inbox__icon--light { + background-color: transparent; + } + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + i { + color: $kt-inbox-icon-color; + } + + @include kt-svg-icon-color($kt-inbox-icon-color); + + &.kt-inbox__icon--active, + &:hover { + transition: all 0.3s ease; + background-color: kt-base-color(grey, 2); + + &.kt-inbox__icon--light { + background-color: transparent; + } + + i { + color: kt-brand-color(); + } + + @include kt-svg-icon-color(kt-brand-color()); + } + + // Back + &.kt-inbox__icon--back { + background-color: transparent; + + i { + color: $kt-inbox-icon-color; + font-size: 1.5rem; + } + + @include kt-svg-icon-color($kt-inbox-icon-color); + + svg { + height: 32px; + width: 32px; + } + + &:hover { + background-color: transparent; + + i { + color: kt-brand-color(); + } + + @include kt-svg-icon-color(kt-brand-color()); + } + } + } + + // Aside + .kt-inbox__aside { + padding: 40px 20px; + width: 275px; + + .kt-inbox__compose { + margin: 0 20px; + padding: 0.9rem 0; + } + + .kt-inbox__nav { + margin-top: 1.2rem; + + .kt-nav { + .kt-nav__item { + margin-bottom: 0.5rem; + + .kt-nav__link { + padding: 0.75rem 20px; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + i { + color: $kt-inbox-icon-color; + } + + @include kt-svg-icon-color($kt-inbox-icon-color); + + .kt-nav__link-icon { + text-align: center; + margin: 0 0.7rem 0 -0.23rem; + } + + .kt-nav__link-text { + font-weight: 500; + color: kt-base-color(label, 2); + } + } + + &:last-child { + margin-bottom: 0; + + .kt-nav__link { + .kt-nav__link-icon { + font-size: 0.9rem; + } + } + } + + &.hover, + &.kt-nav__item--selected, + &.kt-nav__item--active { + .kt-nav__link { + background-color: kt-base-color(grey, 1); + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + i { + color: kt-brand-color(); + } + + @include kt-svg-icon-color(kt-brand-color()); + + .kt-nav__link-text { + color: kt-brand-color(); + } + } + } + } + } + } + } + + // List + .kt-inbox__list { + display: none; + padding: 0; + + @include kt-desktop { + margin-left: kt-get($kt-page-padding, desktop); + } + + &.kt-inbox__list--shown { + display: flex; + } + + .kt-inbox__items { + padding: 0; + + .kt-inbox__item { + display: none; + align-items: flex-start; + padding: 12px kt-get($kt-portlet, space, desktop); + transition: all 0.3s ease; + cursor: pointer; + + .kt-inbox__info { + display: flex; + + @include kt-hack-ie { + padding: 8px 0; + } + + @include kt-hack-ie { + min-width: 210px; + } + + .kt-inbox__actions { + display: flex; + margin-right: 10px; + align-items: center; + + @include kt-hack-ie { + min-width: 70px; + } + + .kt-checkbox { + margin: 0; + padding: 0; + margin-right: 10px; + } + + .kt-inbox__icon { + height: 22px; + width: 22px; + + i { + font-size: 1rem; + color: kt-base-color(grey, 2); + } + + &:hover { + i { + color: rgba(kt-state-color(warning), 0.5) !important; + } + } + + &.kt-inbox__icon--on { + i { + color: kt-state-color(warning) !important; + } + } + } + } + + .kt-inbox__sender { + display: flex; + align-items: center; + margin-right: 30px; + width: 175px; + + @include kt-hack-ie { + min-width: 175px; + } + + .kt-media { + margin-right: 10px; + min-width: 30px !important; + + span { + min-width: 30px !important; + } + } + + .kt-inbox__author { + font-size: 1rem; + color: kt-base-color(label, 3); + font-weight: 500; + } + + @include kt-media-below(1400px) { + display: block; + width: 70px; + margin-right: 10px; + + .kt-inbox__author { + display: block; + } + + .kt-media { + margin-bottom: 5px; + } + } + } + } + + .kt-inbox__details { + flex-grow: 1; + margin-top: 5px; + + @include kt-hack-ie { + width: 0; + height: 0; + } + + .kt-inbox__message { + .kt-inbox__subject { + font-size: 1rem; + color: kt-base-color(label, 4); + font-weight: 400; + } + + .kt-inbox__summary { + font-size: 1rem; + color: kt-base-color(label, 1); + font-weight: 400; + text-overflow: ellipsis; + } + } + + .kt-inbox__labels { + display: flex; + margin-top: 5px; + + .kt-inbox__label { + margin-right: 5px; + } + } + } + + .kt-inbox__datetime { + font-size: 1rem; + color: kt-base-color(label, 1); + font-weight: 400; + margin-left: 20px; + margin-top: 5px; + width: 85px; + text-align: right; + + @include kt-media-below(1400px) { + width: 70px; + } + } + + &:hover, + &.kt-inbox__item--selected { + transition: all 0.3s ease; + background-color: $kt-inbox-hover-bg; + + .kt-inbox__info { + .kt-inbox__actions { + .kt-inbox__icon { + i { + font-size: 1rem; + color: kt-base-color(grey, 3); + } + } + } + } + } + + &.kt-inbox__item--unread { + .kt-inbox__sender { + .kt-inbox__author { + color: kt-base-color(label, 4); + font-weight: 600; + } + } + + .kt-inbox__details { + .kt-inbox__message { + .kt-inbox__subject { + color: kt-base-color(label, 4); + font-weight: 600; + } + } + } + + .kt-inbox__datetime { + color: kt-base-color(label, 4); + font-weight: 600; + } + } + } + + // Item types + &[data-type="inbox"] { + .kt-inbox__item[data-type="inbox"] { + display: flex; + } + } + + &[data-type="marked"] { + .kt-inbox__item[data-type="marked"] { + display: flex; + } + } + + &[data-type="draft"] { + .kt-inbox__item[data-type="draft"] { + display: flex; + } + } + + &[data-type="sent"] { + .kt-inbox__item[data-type="sent"] { + display: flex; + } + } + + &[data-type="trash"] { + .kt-inbox__item[data-type="trash"] { + display: flex; + } + } + } + } + + // Toolbar + .kt-inbox__toolbar { + position: relative; + display: flex; + flex-grow: 1; + align-items: center; + justify-content: space-between; + flex-wrap: wrap; + + .kt-inbox__actions { + display: flex; + align-items: center; + margin-right: 1rem; + + .kt-inbox__check { + display: flex; + align-items: center; + + .kt-checkbox { + margin: 0; + padding-left: 0; + } + + .kt-inbox__icon { + margin-left: 0; + } + } + + .kt-inbox__panel { + display: none; + flex-wrap: wrap; + } + + &.kt-inbox__actions--expanded { + .kt-inbox__panel { + display: flex; + } + } + + .kt-inbox__icon { + margin-right: 0.5rem; + + &.kt-inbox__icon--back { + margin-right: 2.5rem; + } + } + } + + .kt-inbox__controls { + display: flex; + align-items: center; + margin-left: 1rem; + + .kt-inbox__icon { + margin-left: 0.5rem; + } + + .kt-inbox__sort { + margin-left: 0.5rem; + } + + .kt-inbox__pages { + margin-left: 0.5rem; + + .kt-inbox__perpage { + color: kt-base-color(label, 2); + font-size: 1rem; + font-weight: 500; + margin-right: 1rem; + cursor: pointer; + transition: all 0.3s ease; + padding: 0.5rem 0; + + &:hover { + transition: all 0.3s ease; + color: kt-brand-color(); + } + } + } + } + + .kt-inbox__search { + width: 300px; + + @include kt-media-above(1600px) { + position: absolute; + left: 50%; + width: 300px; + margin-left: -150px; + + @include kt-hack-ie { + top: 18px; + } + } + + @include kt-media-below(1599px) { + width: 175px; + } + + .input-group { + .input-group-text { + border: none; + background-color: $kt-inbox-hover-bg; + padding: 0 0.65rem 0 1rem; + + .kt-svg-icon { + height: 22px; + width: 22px; + } + + i { + font-size: 1.1rem; + } + } + + .form-control { + height: 44px; + border: none; + background-color: $kt-inbox-hover-bg; + + @include kt-tablet-and-mobile { + height: 40px; + } + } + } + } + + .kt-inbox__sep { + display: flex; + height: 1rem; + width: 1rem; + } + + //kt-media-breakpoint(lg), + @include kt-media-below(1450px) { + position: static; + + .kt-inbox__search { + order: 1; + margin-top: kt-get($kt-portlet, space, desktop); + margin-bottom: 10px; + flex-grow: 1; + width: 100%; + } + + .kt-inbox__actions { + margin-top: 10px; + margin-bottom: 10px; + } + + .kt-inbox__controls { + margin-top: 10px; + margin-bottom: 10px; + } + + &.kt-inbox__toolbar--extended { + .kt-inbox__actions { + order: 2; + margin-bottom: 10px; + justify-content: flex-first; + } + + .kt-inbox__controls { + order: 2; + margin-bottom: 10px; + justify-content: flex-end; + } + } + } + } + + // View + .kt-inbox__view { + padding: 0; + display: none; + + @include kt-desktop { + margin-left: kt-get($kt-page-padding, desktop); + } + + // Shown + &.kt-inbox__view--shown { + display: flex; + } + + // Subject + .kt-inbox__subject { + display: flex; + align-items: center; + justify-content: space-between; + flex-wrap: wrap; + padding: 0 kt-get($kt-portlet, space, desktop); + + .kt-inbox__title { + margin-right: 1rem; + display: flex; + align-items: center; + + .kt-inbox__text { + margin: 0; + padding: 0; + color: kt-base-color(label, 3); + font-size: 1.4rem; + font-weight: 500; + } + + .kt-inbox__label { + margin-left: 0.75rem; + } + } + + .kt-inbox__actions { + display: flex; + align-items: center; + margin: 10px 0; + + .kt-inbox__icon { + margin-left: 0.5rem; + + &:first-child { + margin-left: 0; + } + } + } + } + + // Reply + .kt-inbox__reply { + margin-top: 30px; + margin-bottom: 10px; + display: flex; + flex-direction: column; + padding: 0 kt-get($kt-portlet, space, desktop); + + .kt-inbox__actions { + display: flex; + + .btn { + margin-right: 1rem; + } + } + + .kt-inbox__form { + display: none; + } + + &.kt-inbox__reply--on { + .kt-inbox__actions { + display: none; + } + + .kt-inbox__form { + display: flex; + } + } + } + + // Messages + .kt-inbox__messages { + margin-top: 15px; + + // Message + .kt-inbox__message { + // Base + padding: 0 kt-get($kt-portlet, space, desktop) 15px kt-get($kt-portlet, space, desktop); + margin-bottom: 15px; + + &:last-child { + margin-bottom: 0; + } + + @include kt-rounded { + border-radius: $kt-border-radius; + box-shadow: 0px 3px 7px 0px rgba(0,0,0,0.05); + } + + // Head + .kt-inbox__head { + display: flex; + align-items: center; + cursor: pointer; + + .kt-media { + margin-right: 1.2rem; + } + + .kt-inbox__info { + display: flex; + flex-direction: column; + flex-wrap: wrap; + padding: 0.5rem 0.5rem 0.5rem 0; + flex-grow: 1; + + .kt-inbox__author { + display: flex; + align-items: center; + flex-wrap: wrap; + + .kt-inbox__name { + color: kt-base-color(label, 4); + font-weight: 600; + font-size: 1.1rem; + margin-right: 0.5rem; + } + + .kt-inbox__status { + color: kt-base-color(label, 1); + font-weight: 500; + + a { + font-size: 0.9rem; + } + + .kt-badge { + margin-right: 0.4rem; + margin-bottom: 0.1rem; + } + } + } + + .kt-inbox__details { + display: flex; + + .kt-inbox__tome { + display: none; + + .kt-inbox__details { + padding: 20px 0; + + td { + padding: 5px 10px; + vertical-align: top; + + &:nth-child(1) { + width: 30px; + text-align: right; + color: kt-base-color(label, 1); + } + + &:nth-child(2) { + text-align: left; + color: kt-base-color(label, 3); + font-weight: 500; + } + } + } + + .kt-inbox__label { + color: kt-base-color(label, 2); + font-weight: 400; + font-size: 1rem; + + i { + margin-left: 0.5rem; + font-size: 0.7rem; + color: kt-base-color(label, 2); + } + } + } + + .kt-inbox__desc { + color: kt-base-color(label, 2); + font-weight: 400; + font-size: 1rem; + } + } + } + + .kt-inbox__actions { + display: flex; + align-items: center; + + .kt-inbox__datetime { + color: kt-base-color(label, 1); + font-weight: 500; + font-size: 1rem; + margin-right: 1.5rem; + } + + .kt-inbox__group { + display: flex; + } + + .kt-inbox__icon { + &.kt-inbox__icon--label { + &:hover { + i { + color: rgba(kt-state-color(warning), 0.5) !important; + } + } + + &.kt-inbox__icon--on { + i { + color: kt-state-color(warning) !important; + } + } + } + } + } + } + + // Body + .kt-inbox__body { + display: none; + padding: 1rem 0; + } + + // Message expanded + &.kt-inbox__message--expanded { + // Head + .kt-inbox__head { + .kt-inbox__info { + .kt-inbox__details { + .kt-inbox__tome { + display: flex; + } + + .kt-inbox__desc { + display: none; + } + } + } + } + + // Body + .kt-inbox__body { + display: block; + } + } + + // Message reply + &.kt-inbox__message--reply { + .kt-inbox__reply { + display: flex; + } + } + } + + .kt-inbox__reply { + margin-bottom: 30px; + } + } + } + + // Form + .kt-inbox__form { + display: flex; + flex-direction: column; + box-shadow: 0px 0px 7px 0px rgba(0,0,0,0.1); + + .kt-inbox__head { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding: 20px kt-get($kt-portlet, space, desktop) - 10px 20px kt-get($kt-portlet, space, desktop); + border-bottom: 1px solid kt-base-color(grey, 2); + + .kt-inbox__title { + margin-right: 10px; + font-size: 1.2rem; + font-weight: 500; + color: kt-base-color(label, 3); + } + + .kt-inbox__actions { + display: flex; + + .kt-inbox__icon { + margin-left: 5px; + } + } + } + + .kt-inbox__body { + padding: 0 0 10px 0; + + .kt-inbox__to { + display: flex; + min-height: 50px; + align-items: center; + padding: 10px kt-get($kt-portlet, space, desktop); + + .kt-inbox__wrapper { + display: flex; + flex-direction: column; + flex-grow: 1; + } + + .tagify { + border: 0 !important; + + .tagify__input { + border: 0 !important; + } + } + + .kt-inbox__field { + display: flex; + align-items: center; + width: 100%; + padding: 0; + + &.kt-inbox__field--cc, + &.kt-inbox__field--bcc { + display: none; + margin-top: 5px; + } + + .kt-inbox__label { + font-weight:400; + font-size: 1rem; + width: 40px; + min-width: 40px; + color: kt-base-color(label, 2); + } + + .kt-inbox__input { + flex-grow: 1; + + input { + border: 0 !important; + box-shadow: none !important; + -moz-appearance: none !important; + -webkit-appearance: none !important; + } + + .form-control { + border: 0; + border-radius: 0; + padding-left: 0; + padding-right: 0; + + @include kt-input-placeholder(kt-base-color(label, 2)); + color: kt-base-color(label, 2); + } + } + + .kt-inbox__tools { + display: flex; + align-items: center; + margin-left: 1rem; + + .kt-inbox__tool { + font-size: 1rem; + color: kt-base-color(label, 1); + font-weight: 500; + margin-left: 10px; + cursor: pointer; + } + } + } + + &.kt-inbox__to--cc { + .kt-inbox__tools { + .kt-inbox__tool:nth-child(1) { + display: none; + } + } + + .kt-inbox__field.kt-inbox__field--cc { + display: flex; + } + } + + &.kt-inbox__to--bcc { + .kt-inbox__tools { + .kt-inbox__tool:nth-child(2) { + display: none; + } + } + + .kt-inbox__field.kt-inbox__field--bcc { + display: flex; + } + } + } + + .kt-inbox__subject { + display: flex; + min-height: 50px; + align-items: center; + padding: 0 kt-get($kt-portlet, space, desktop); + border-top: 1px solid kt-base-color(grey, 2); + + .form-control { + border: 0; + border-radius: 0; + padding-left: 0; + padding-right: 0; + font-weight:400; + font-size: 1rem; + + @include kt-input-placeholder(kt-base-color(label, 2)); + color: kt-base-color(label, 2); + } + } + + .kt-inbox__text { + padding: 10px kt-get($kt-portlet, space, desktop); + padding-bottom: 0; + font-weight:400; + font-size: 1rem; + color: kt-base-color(label, 2); + } + + .ql-container.ql-snow { + border: 0; + padding: 0; + border-radius: 0; + + .ql-editor { + font-weight:400; + font-size: 1rem; + color: kt-base-color(label, 2); + padding: 15px kt-get($kt-portlet, space, desktop); + font-family: kt-get($kt-font-families, regular); + + &.ql-blank { + &:before { + left: kt-get($kt-portlet, space, desktop); + color: kt-base-color(label, 1); + font-weight: 400; + font-style: normal; + } + } + } + } + + .ql-toolbar.ql-snow { + display: flex; + height: 50px; + align-items: center; + border-radius: 0; + border: 0; + border-top: 1px solid kt-base-color(grey, 2); + border-bottom: 1px solid kt-base-color(grey, 2); + padding-left: 18px; + + .ql-picker-label { + &, + &:before { + font-weight:400; + font-size: 1rem; + color: kt-base-color(label, 2); + font-family: kt-get($kt-font-families, regular); + } + } + } + + .kt-inbox__attachments { + min-width: 500px; + display: inline-block; + padding: 0 kt-get($kt-portlet, space, desktop); + } + } + + .kt-inbox__foot { + display: flex; + flex-wrap: wrap; + align-items: center; + width: 100%; + padding: 20px kt-get($kt-portlet, space, desktop) - 10px 20px kt-get($kt-portlet, space, desktop); + border-top: 1px solid kt-base-color(grey, 2); + + .kt-inbox__primary { + display: flex; + flex-grow: 1; + align-items: center; + + .btn-group { + .btn { + &:nth-child(1) { + padding-left: 20px; + padding-right: 20px; + } + + &:nth-child(2) { + padding-left: 6px; + padding-right: 9px; + } + } + } + + .kt-inbox__panel { + display: flex; + align-items: center; + margin-left: 1rem; + } + } + + .kt-inbox__secondary { + display: flex; + align-items: center; + margin: 0; + } + } + } + + // Portlet head + .kt-portlet__head { + min-height: 80px !important; + padding: 10px kt-get($kt-portlet, space, desktop); + } +} + +// Tablet and mobile mode +@include kt-tablet-and-mobile { + // Inbox + .kt-inbox { + display: flex; + flex-wrap: wrap; + + // Aside + .kt-inbox__aside { + background: #fff; + margin: 0; + + .kt-inbox__compose { + margin: 0; + } + + .kt-inbox__nav { + .kt-nav { + .kt-nav__item { + .kt-nav__link { + padding: 0.75rem 10px; + } + } + } + } + } + + // Toolbar + .kt-inbox__toolbar { + position: static; + + .kt-inbox__search { + margin: 10px 0; + } + + .kt-inbox__actions { + margin: 10px 0; + } + + .kt-inbox__controls { + margin: 10px 0; + } + } + + // List + .kt-inbox__list { + .kt-inbox__items { + overflow: auto; + + .kt-inbox__item { + min-width: 500px; + //flex-wrap: wrap; + padding: 10px kt-get($kt-portlet, space, mobile); + margin-bottom: 15px; + } + } + + // Portlet head + .kt-portlet__head { + min-height: 60px !important; + padding: 10px kt-get($kt-portlet, space, mobile); + } + } + + // View + .kt-inbox__view { + .kt-inbox__subject { + padding: 10px kt-get($kt-portlet, space, mobile); + + .kt-inbox__title { + display: block; + + .kt-inbox__text { + display: inline; + } + } + } + + .kt-inbox__messages { + padding: 10px kt-get($kt-portlet, space, mobile); + + .kt-inbox__message { + padding: 0 10px 5px 10px; + margin-bottom: 15px; + + .kt-inbox__head { + .kt-media { + span { + width: 26px; + height: 26px; + } + } + + .kt-inbox__info { + .kt-inbox__details { + .kt-inbox__desc { + display: none; + } + } + } + } + } + } + + .kt-inbox__reply { + padding: 10px kt-get($kt-portlet, space, mobile); + overflow: auto; + } + } + + // Form + .kt-inbox__form { + min-width: 400px; + .kt-inbox__body { + .kt-inbox__to { + padding: 10px kt-get($kt-portlet, space, mobile); + } + + .kt-inbox__subject { + padding: 10px kt-get($kt-portlet, space, mobile); + } + + .kt-inbox__text { + padding: 10px kt-get($kt-portlet, space, mobile); + } + + .ql-container.ql-snow { + .ql-editor { + padding: 15px kt-get($kt-portlet, space, mobile); + + &.ql-blank { + &:before { + left: kt-get($kt-portlet, space, mobile); + } + } + } + } + + .kt-inbox__attachments { + min-width: auto; + padding: 0 kt-get($kt-portlet, space, mobile); + } + } + } + + // Portlet head + .kt-portlet__head { + min-height: 60px !important; + padding: 10px kt-get($kt-portlet, space, mobile); + } + } +} + +// Mobile mode +@include kt-mobile { + // Inbox + .kt-inbox { + // View + .kt-inbox__view { + .kt-inbox__messages { + .kt-inbox__message { + .kt-inbox__head { + flex-wrap: wrap; + + .kt-media { + + } + + .kt-inbox__info { + + } + + .kt-inbox__actions { + flex-grow: 1; + justify-content: space-between; + } + } + } + } + + .kt-inbox__reply { + padding: 10px kt-get($kt-portlet, space, mobile); + } + } + } +} + +// Aside offcanvas +@include kt-offcanvas-build(kt-inbox__aside, tablet-and-mobile, kt-get($kt-aside-config, offcanvas) ); diff --git a/src/assets/sass/pages/invoices/invoice-1.scss b/src/assets/sass/pages/invoices/invoice-1.scss new file mode 100644 index 0000000..dcb8be2 --- /dev/null +++ b/src/assets/sass/pages/invoices/invoice-1.scss @@ -0,0 +1,378 @@ +// +// Invoice 1 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +.kt-invoice-1 { + @include kt-rounded { + border-top-left-radius: $kt-border-radius; + border-top-right-radius: $kt-border-radius; + } + + .kt-invoice__container { + width: 100%; + margin: 0; + padding: 0 30px; + } + + .kt-invoice__head { + @include kt-rounded { + border-top-left-radius: $kt-border-radius; + border-top-right-radius: $kt-border-radius; + } + + .kt-invoice__container { + @include kt-rounded { + border-top-left-radius: $kt-border-radius; + border-top-right-radius: $kt-border-radius; + } + } + + background-size: cover; + background-repeat: no-repeat; + padding: 80px 0; + + .kt-invoice__brand { + display: flex; + justify-content: space-between; + flex-wrap: wrap; + + .kt-invoice__title { + font-weight: 700; + font-size: 2.7rem; + margin-right: 10px; + margin-top: 5px; + color: #fff; + vertical-align: top; + } + + .kt-invoice__logo { + display: flex; + flex-direction: column; + margin-top: 5px; + text-align: right; + + img { + text-align: right; + } + + .kt-invoice__desc { + display: flex; + flex-direction: column; + text-align: right; + padding: 1rem 0 1rem 0; + color: rgba(#fff, 0.7); + } + } + } + + .kt-invoice__items { + display: flex; + flex-wrap: wrap; + margin-top: 50px; + width: 100%; + border-top: 1px solid rgba(#fff, 0.2); + + .kt-invoice__item { + display: flex; + flex-direction: column; + flex: 1; + color: #fff; + margin-right: 10px; + margin-top: 20px; + + &:last-child { + margin-right: 0; + } + + .kt-invoice__subtitle { + font-weight: 500; + padding-bottom: 0.5rem; + } + + .kt-invoice__text { + color: rgba(#fff, 0.7); + } + } + } + } + + .kt-invoice__body { + padding: 3rem 0; + + table { + background-color: transparent; + + thead { + tr { + th { + background-color: transparent; + padding: 1rem 0 0.5rem 0; + border-top: none; + color: kt-base-color(label, 2); + + &:not(:first-child) { + text-align: right; + } + } + } + } + tbody { + tr { + td { + background-color: transparent; + padding: 1rem 0 1rem 0; + border-top: none; + font-weight: 700; + font-size: 1.1rem; + color: kt-base-color(label, 3); + + &:not(:first-child) { + text-align: right; + } + + &:last-child { + color: #FE21BE; + font-size: 1.2rem; + } + } + + &:first-child td { + padding-top: 1.8rem; + } + } + } + } + } + + .kt-invoice__footer { + padding: 3rem 0; + background-color: kt-base-color(grey, 1); + + .kt-invoice__container { + display: flex; + flex-direction: row; + justify-content: space-between; + flex-wrap: wrap; + } + + .kt-invoice__bank { + margin-right: 10px; + display: flex; + flex-direction: column; + flex-wrap: wrap; + + .kt-invoice__title { + font-size: 1.2rem; + text-transform: capitalize; + font-weight: 600; + color: kt-base-color(label, 2); + } + + .kt-invoice__item { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + margin-top: 10px; + + .kt-invoice__label { + font-size: 1.1rem; + font-weight: 500; + margin-right: 40px; + color: kt-base-color(label, 3); + text-align: left; + } + + .kt-invoice__value { + font-size: 1.1rem; + font-weight: 400; + color: kt-base-color(label, 2); + text-align: right; + } + } + } + + .kt-invoice__total { + display: flex; + flex-direction: column; + text-align: right; + + .kt-invoice__title { + font-size: 1.2rem; + text-transform: capitalize; + font-weight: 600; + color: kt-base-color(label, 2); + } + + .kt-invoice__price { + color: #FE21BE; + font-weight: 700; + font-size: 24px; + } + + .kt-invoice__notice { + font-size: 1rem; + font-weight: 500; + color: kt-base-color(label, 2); + } + } + } + + .kt-invoice__actions { + padding: 2rem 0; + + .kt-invoice__container { + display: flex; + flex-direction: row; + justify-content: space-between; + } + } +} + +@include kt-desktop { + .kt-invoice-1 { + .kt-invoice__container { + width: 80%; + margin: 0 auto; + } + } +} + +@include kt-mobile { + .kt-invoice-1 { + .kt-invoice__container { + width: 100%; + margin: 0; + padding: 0 20px; + } + + .kt-invoice__head { + padding: 20px 0; + + .kt-invoice__brand { + display: flex; + flex-direction: column; + + .kt-invoice__title { + font-weight: 700; + font-size: 2rem; + margin-bottom: 30px; + } + + .kt-invoice__logo { + text-align: left; + + img { + text-align: left; + } + + .kt-invoice__desc { + text-align: left; + } + } + } + + .kt-invoice__items { + margin-top: 20px; + + .kt-invoice__item { + .kt-invoice__subtitle { + } + + .kt-invoice__text { + } + } + } + } + + .kt-invoice__body { + padding: 2rem 0; + } + + .kt-invoice__footer { + padding: 2rem 0; + + .kt-invoice__container { + flex-direction: column; + } + + .kt-invoice__bank { + .kt-invoice__item { + .kt-invoice__label { + margin-right: 20px; + } + } + } + + .kt-invoice__total { + margin-top: 30px; + text-align: left; + } + } + } +} + +// Print media +@media print { + // Hide partials + .kt-header, + .kt-header-mobile, + .kt-aside, + .kt-footer, + .kt-subheader, + .kt-scrolltop, + .kt-quick-panel, + .kt-demo-panel, + .kt-sticky-toolbar { + display: none !important; + } + + // Parent containers + body, + .kt-wrapper, + .kt-body, + .kt-content { + background: transparent !important; + padding: 0 !important; + margin: 0 !important; + } + + // Invoice + .kt-invoice-1 { + @include kt-rounded { + border-top-left-radius: 0; + border-top-right-radius: 0; + } + + .kt-invoice__head { + @include kt-rounded { + border-top-left-radius: 0; + border-top-right-radius: 0; + } + + .kt-invoice__container { + @include kt-rounded { + border-top-left-radius: 0; + border-top-right-radius: 0; + } + } + } + + .kt-invoice__actions { + display: none !important; + } + + .kt-invoice__container { + width: 100%; + padding: 0 10px; + } + } +} diff --git a/src/assets/sass/pages/invoices/invoice-2.scss b/src/assets/sass/pages/invoices/invoice-2.scss new file mode 100644 index 0000000..1417fde --- /dev/null +++ b/src/assets/sass/pages/invoices/invoice-2.scss @@ -0,0 +1,335 @@ +// +// Invoice 1 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +.kt-invoice-2 { + @include kt-rounded { + border-top-left-radius: $kt-border-radius; + border-top-right-radius: $kt-border-radius; + } + + .kt-invoice__container { + width: 100%; + margin: 0; + padding: 0 30px; + } + + .kt-invoice__head { + @include kt-rounded { + border-top-left-radius: $kt-border-radius; + border-top-right-radius: $kt-border-radius; + } + + .kt-invoice__container { + @include kt-rounded { + border-top-left-radius: $kt-border-radius; + border-top-right-radius: $kt-border-radius; + } + } + + background-size: cover; + background-repeat: no-repeat; + padding: 80px 0; + + .kt-invoice__brand { + display: flex; + justify-content: space-between; + flex-wrap: wrap; + + .kt-invoice__title { + font-weight: 700; + font-size: 2.7rem; + margin-right: 10px; + margin-top: 5px; + color: kt-base-color(label, 3); + vertical-align: top; + } + + .kt-invoice__logo { + display: flex; + flex-direction: column; + margin-top: 5px; + text-align: right; + + img { + text-align: right; + } + + .kt-invoice__desc { + display: flex; + flex-direction: column; + text-align: right; + font-weight: 400; + padding: 1rem 0 1rem 0; + color: kt-base-color(label, 2); + } + } + } + + .kt-invoice__items { + display: flex; + flex-wrap: wrap; + margin-top: 50px; + width: 100%; + border-top: 1px solid kt-base-color(grey, 2); + + .kt-invoice__item { + display: flex; + flex-direction: column; + flex: 1; + color: kt-base-color(label, 3); + margin-right: 10px; + margin-top: 20px; + + &:last-child { + margin-right: 0; + } + + .kt-invoice__subtitle { + font-weight: 500; + padding-bottom: 0.5rem; + } + + .kt-invoice__text { + font-weight: 400; + color: kt-base-color(label, 2); + } + } + } + } + + .kt-invoice__body { + padding: 3rem 0; + + table { + background-color: transparent; + + thead { + tr { + th { + background-color: transparent; + padding: 1rem 0 0.5rem 0; + color: kt-base-color(label, 2); + border-top: 0; + border-bottom: 1px solid kt-base-color(grey, 2); + + &:not(:first-child) { + text-align: right; + } + } + } + } + tbody { + tr { + td { + background-color: transparent; + padding: 1rem 0 1rem 0; + border-top: none; + font-weight: 700; + font-size: 1.1rem; + color: kt-base-color(label, 3); + + &:not(:first-child) { + text-align: right; + } + } + + &:first-child td { + padding-top: 1.8rem; + } + } + } + } + } + + .kt-invoice__footer { + padding: 3rem 0; + background-color: kt-base-color(grey, 1); + + .kt-invoice__container { + display: flex; + flex-direction: row; + justify-content: space-between; + flex-wrap: wrap; + } + + .table { + background-color: transparent; + padding: 0; + + th { + font-size: 1.1rem; + text-transform: capitalize; + font-weight: 500; + color: kt-base-color(label, 2); + border-top: 0; + border-bottom: 1px solid kt-base-color(grey, 2); + padding: 10px 10px 10px 0; + background-color: transparent; + + &:last-child { + padding-right: 0; + } + } + + td { + font-size: 1.1rem; + text-transform: capitalize; + background-color: transparent; + font-weight: 500; + color: kt-base-color(label, 3); + padding: 10px 10px 10px 0; + + &:last-child { + padding-right: 0; + } + } + } + } + + .kt-invoice__actions { + padding: 2rem 0; + + .kt-invoice__container { + display: flex; + flex-direction: row; + justify-content: space-between; + } + } +} + +@include kt-desktop { + .kt-invoice-2 { + .kt-invoice__container { + width: 80%; + margin: 0 auto; + } + } +} + +@include kt-mobile { + .kt-invoice-2 { + .kt-invoice__container { + width: 100%; + margin: 0; + padding: 0 20px; + } + + .kt-invoice__head { + padding: 20px 0; + + .kt-invoice__brand { + display: flex; + flex-direction: column; + + .kt-invoice__title { + font-weight: 700; + font-size: 2rem; + margin-bottom: 30px; + } + + .kt-invoice__logo { + text-align: left; + + img { + text-align: left; + } + + .kt-invoice__desc { + text-align: left; + } + } + } + + .kt-invoice__items { + margin-top: 20px; + + .kt-invoice__item { + .kt-invoice__subtitle { + } + + .kt-invoice__text { + } + } + } + } + + .kt-invoice__body { + padding: 2rem 0; + } + + .kt-invoice__footer { + padding: 2rem 0; + } + } +} + +// Print media +@media print { + // Hide partials + .kt-header, + .kt-header-mobile, + .kt-aside, + .kt-footer, + .kt-subheader, + .kt-scrolltop, + .kt-quick-panel, + .kt-demo-panel, + .kt-sticky-toolbar { + display: none !important; + } + + // Parent containers + body, + .kt-wrapper, + .kt-body, + .kt-content { + background: transparent !important; + padding: 0 !important; + margin: 0 !important; + } + + // Invoice + .kt-invoice-2 { + @include kt-rounded { + border-top-left-radius: 0; + border-top-right-radius: 0; + } + + .kt-invoice__head { + @include kt-rounded { + border-top-left-radius: 0; + border-top-right-radius: 0; + } + + .kt-invoice__container { + @include kt-rounded { + border-top-left-radius: 0; + border-top-right-radius: 0; + } + } + } + + .kt-invoice__actions { + display: none !important; + } + + .kt-invoice__footer { + background-color: transparent !important; + } + + .kt-invoice__container { + width: 100%; + padding: 0 10px; + } + } +} diff --git a/src/assets/sass/pages/login/login-1.scss b/src/assets/sass/pages/login/login-1.scss new file mode 100644 index 0000000..bd014e9 --- /dev/null +++ b/src/assets/sass/pages/login/login-1.scss @@ -0,0 +1,245 @@ +// +// Page - User Login 1 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +// Login Base +.kt-login.kt-login--v1 { + // Aside + .kt-login__aside { + width: 605px; + padding: 3rem 3.5rem; + background-repeat: no-repeat; + background-size: cover; + + .kt-login__logo { + display: flex; + } + + .kt-login__title { + color: #ffffff; + font-size: 2rem; + font-weight: 500; + } + + .kt-login__subtitle { + font-size: 1.2rem; + font-weight: 200; + margin: 2.5rem 0 3.5rem 0; + color: rgba(#fff, 0.7); + } + + .kt-login__info { + display: flex; + justify-content: space-between; + + .kt-login__menu { + > a { + text-decoration: none; + color: #fff; + margin-right: 2rem; + display: inline-block; + + @include kt-link-color(rgba(#fff, 0.7), #fff); + + &:last-child { + margin-right: 0; + } + } + } + + .kt-login__copyright { + color: rgba(#fff, 0.4); + } + } + } + + // Wrapper + .kt-login__wrapper { + padding: 3rem 3rem; + background: #fff; + + // Head + .kt-login__head { + font-size: 1rem; + font-weight: 500; + text-align: right; + + .kt-login__signup-label { + color: kt-base-color(label, 2); + } + + .kt-login__signup-link { + color: kt-brand-color(); + } + } + + // Body + .kt-login__body { + display: flex; + justify-content: center; + align-items: center; + height: 100%; + + // Form Wrapper + .kt-login__form { + width: 100%; + max-width: 450px; + + .kt-login__title { + display: block; + text-align: center; + margin-bottom: 5rem; + text-decoration: none; + + > h3 { + font-size: 2rem; + color: #67666e; + } + } + + // Form + .kt-form { + margin: 4rem auto; + + .form-group { + margin: 0; + padding: 0; + margin: 0 auto; + + .form-control { + border: none; + height: 50px; + margin-top: 1.25rem; + background-color: rgba(#f7f7f9, 0.7); + padding-left: 1.25rem; + padding-right: 1.25rem; + transition: background-color 0.3s ease; + + &:focus { + transition: background-color 0.3s ease; + background-color: #f7f7f9; + } + } + } + } + + // Action + .kt-login__actions { + display: flex; + justify-content: space-between; + align-items: center; + margin: 3rem 0; + + .kt-login__link-forgot { + font-weight: 400; + @include kt-link-color(kt-base-color(label, 2), kt-brand-color()); + } + + .kt-login__btn-secondary, + .kt-login__btn-primary { + font-weight: 500; + font-size: 1rem; + height: 50px; + padding-left: 2.75rem; + padding-right: 2.75rem; + } + } + + // Divider + .kt-login__divider { + margin: 1rem 0 2rem 0; + + &:not(:first-child):not(:last-child) { + font-weight: 400; + color: #b5b2c3; + font-size: 1rem; + } + } + + // Options + .kt-login__options { + display: flex; + justify-content: center; + justify-content: space-between; + max-width: 100%; + + > a { + text-decoration: none; + flex: 1; + justify-content: center; + align-items: center; + display: flex; + + &:not(:last-child) { + margin: 0 1.5rem 0 0; + } + } + } + } + } + } + + @include kt-desktop { + // Aside + .kt-login__aside { + flex: 1; + } + } + + @include kt-tablet-and-mobile() { + // Aside + .kt-login__aside { + width: 100%; + height: auto; + padding: 2rem 1.5rem; + + .kt-login__logo { + margin-bottom: 2.5rem; + } + + .kt-login__info { + margin-top: 2rem; + } + + .kt-login__subtitle { + margin: 2rem 0; + } + } + + // Wrapper + .kt-login__wrapper { + padding: 3rem 1.5rem; + + .kt-login__head { + padding-left: 2rem; + right: 2rem; + } + + .kt-login__body { + display: flex; + justify-content: center; + align-items: center; + margin-top: 5rem; + + .kt-login__form { + .kt-login__options { + > a { + &:not(:first-child):not(:last-child) { + margin: 0 0.8rem; + } + } + } + } + } + } + } +} diff --git a/src/assets/sass/pages/login/login-2.scss b/src/assets/sass/pages/login/login-2.scss new file mode 100644 index 0000000..72861ec --- /dev/null +++ b/src/assets/sass/pages/login/login-2.scss @@ -0,0 +1,268 @@ +// +// User Login v2 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +// Login Base +.kt-login.kt-login--v2 { + background-size: cover; + background-repeat: no-repeat; + + // Login Area + .kt-login__wrapper { + padding: 6% 2rem 1rem 2rem; + margin: 0 auto 2rem auto; + overflow: hidden; + + .kt-login__container { + width: 430px; + margin: 0 auto; + + .kt-login__logo { + text-align: center; + margin: 0 auto 4rem auto; + } + + .kt-login__head { + margin-top: 1rem; + + .kt-login__title { + text-align: center; + font-size: 1.5rem; + font-weight: 500; + color: #fff; + } + + .kt-login__desc { + margin-top: 1.5rem; + text-align: center; + font-size: 1.1rem; + font-weight: 400; + color: rgba(#fff, 0.8); + } + } + + .kt-form { + margin: 4rem auto; + + .input-group { + padding: 0; + margin: 0 auto; + } + + .form-control { + height: 46px; + border-radius: 46px; + border: none; + padding-left: 1.5rem; + padding-right: 1.5rem; + margin-top: 1.5rem; + background: rgba(#4322A7, 0.4); + color: #fff; + @include kt-input-placeholder(rgba(#fff, 0.7)); + } + + .form-control.is-valid + .valid-feedback, + .form-control.is-invalid + .invalid-feedback { + font-weight: 500; + font-size: 0.9rem; + padding-left: 1.6rem; + } + + .kt-login__extra { + padding-left: 7px; + padding-right: 7px; + margin: 15px auto; + color: rgba(#fff, 0.6); + font-size: 1rem; + + .kt-checkbox { + font-size: 1rem; + + > span { + border: 1px solid rgba(#fff, 0.6); + } + + input:checked ~ span { + border: 1px solid #fff; + + &:after { + border: solid #fff; + } + } + } + + .kt-login__link { + font-size: 1rem; + color: rgba(#fff, 0.6); + + &:hover { + color: #fff; + } + } + } + + .kt-login__actions { + text-align: center; + margin-top: 7%; + + .kt-login__btn-primary, + .kt-login__btn-secondary { + height: 46px; + display: inline-block; + text-align: center; + padding-left: 4rem; + padding-right: 4rem; + margin-top: 0.8rem; + border-radius: 60px; + background: transparent; + color: rgba(#fff, 0.8); + border-color: rgba(#fff, 0.4); + + &.active, + &:active, + &:hover { + color: #fff; + border-color:#fff; + } + } + + .kt-login__btn-secondary { + color: rgba(#fff, 0.4); + border-color: rgba(#fff, 0.3); + + &.active, + &:active, + &:hover { + color: #fff; + border-color:#fff; + } + } + } + } + + .kt-login__account { + text-align: center; + margin-top: 2rem; + + .kt-login__account-msg { + font-size: 1.1rem; + font-weight: 500; + color: #bbabf1; + } + + .kt-login__account-link { + font-size: 1.1rem; + font-weight: 500; + } + } + } + } +} + +// Login Modes +.kt-login.kt-login--v2{ + &.kt-login--signin { + .kt-login__signup { + display: none; + } + + .kt-login__signin { + display: block; + } + + .kt-login__forgot { + display: none; + } + } + + &.kt-login--signup { + .kt-login__signup { + display: block; + } + + .kt-login__signin { + display: none; + } + + .kt-login__forgot { + display: none; + } + + .kt-login__account { + display: none; + } + } + + &.kt-login--forgot { + .kt-login__signup { + display: none; + } + + .kt-login__signin { + display: none; + } + + .kt-login__forgot { + display: block; + } + } +} + +@include kt-tablet-and-mobile { + .kt-login.kt-login--v2 { + .kt-login__wrapper { + padding-top: 5rem; + width: 100%; + + .kt-login__container { + margin: 0 auto; + + .kt-login__account { + margin-top: 10rem; + } + } + } + } +} + +@include kt-mobile() { + .kt-login.kt-login--v2{ + .kt-login__wrapper { + width: 100%; + + .kt-login__container { + width: 100%; + max-width: 400px; + margin: 0 auto; + + .kt-form { + width: 100%; + margin: 0 auto; + + .form-control { + background: rgba(#4322A7, 0.8); + } + } + + .kt-login__actions { + .kt-login__btn-submit { + padding: 0.8rem 3rem; + } + } + + .kt-login__account { + margin-top: 1.5rem; + } + } + } + } +} diff --git a/src/assets/sass/pages/login/login-3.scss b/src/assets/sass/pages/login/login-3.scss new file mode 100644 index 0000000..9d9ce60 --- /dev/null +++ b/src/assets/sass/pages/login/login-3.scss @@ -0,0 +1,227 @@ +// +// User Login v3 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +// Login Base +.kt-login.kt-login--v3 { + background-size: cover; + background-repeat: no-repeat; + + // Login Area + .kt-login__wrapper { + padding: 6% 2rem 1rem 2rem; + margin: 0 auto 2rem auto; + overflow: hidden; + + .kt-login__container { + width: 430px; + margin: 0 auto; + + .kt-login__logo { + text-align: center; + margin: 0 auto 4rem auto; + } + + .kt-login__head { + margin-top: 1rem; + margin-bottom: 3rem; + + .kt-login__title { + text-align: center; + font-size: 1.5rem; + font-weight: 500; + color: kt-base-color(label, 3); + } + + .kt-login__desc { + margin-top: 1.5rem; + text-align: center; + font-size: 1.1rem; + font-weight: 400; + color: kt-base-color(label, 2); + } + } + + .kt-form { + margin: 0 auto; + + .input-group { + padding: 0; + margin: 0 auto; + } + + .form-control { + height: 46px; + border: none; + padding-left: 1.5rem; + padding-right: 1.5rem; + margin-top: 1.5rem; + background: rgba(kt-base-color(grey, 2), 0.4); + + @include kt-input-placeholder(kt-base-color(label, 2)); + } + + .form-control.is-valid + .valid-feedback, + .form-control.is-invalid + .invalid-feedback { + font-weight: 500; + font-size: 0.9rem; + padding-left: 1.6rem; + } + + .kt-login__extra { + margin-top: 30px; + margin-bottom: 15px; + color: kt-base-color(label, 2); + font-size: 1rem; + + .kt-checkbox { + font-size: 1rem; + } + + .kt-login__link { + font-size: 1rem; + color: kt-base-color(label, 2); + transition: color 0.3s ease; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + } + + .kt-login__actions { + text-align: center; + margin-top: 7%; + + .kt-login__btn-secondary, + .kt-login__btn-primary { + height: 50px; + padding-left: 2.5rem; + padding-right: 2.5rem; + } + } + } + + .kt-login__account { + text-align: center; + margin-top: 2rem; + + .kt-login__account-msg { + font-size: 1rem; + font-weight: 400; + color:kt-base-color(label, 2); + } + + .kt-login__account-link { + font-size: 1rem; + font-weight: 500; + color: kt-base-color(label, 3); + transition: color 0.3s ease; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + } + } + } +} + +// Login Modes +.kt-login.kt-login--v3 { + &.kt-login--signin { + .kt-login__signup { + display: none; + } + + .kt-login__signin { + display: block; + } + + .kt-login__forgot { + display: none; + } + } + + &.kt-login--signup { + .kt-login__signup { + display: block; + } + + .kt-login__signin { + display: none; + } + + .kt-login__forgot { + display: none; + } + + .kt-login__account { + display: none; + } + } + + &.kt-login--forgot { + .kt-login__signup { + display: none; + } + + .kt-login__signin { + display: none; + } + + .kt-login__forgot { + display: block; + } + } +} + +@include kt-tablet-and-mobile { + .kt-login.kt-login--v3 { + .kt-login__wrapper { + padding-top: 5rem; + width: 100%; + + .kt-login__container { + margin: 0 auto; + + .kt-login__account { + margin-top: 1rem; + } + } + } + } +} + +@include kt-mobile() { + .kt-login.kt-login--v3 { + .kt-login__wrapper { + width: 100%; + + .kt-login__container { + width: 100%; + margin: 0 auto; + + .kt-form { + width: 100%; + margin: 0 auto; + } + + .kt-login__account { + margin-top: 1rem; + } + } + } + } +} diff --git a/src/assets/sass/pages/login/login-4.scss b/src/assets/sass/pages/login/login-4.scss new file mode 100644 index 0000000..cc1825d --- /dev/null +++ b/src/assets/sass/pages/login/login-4.scss @@ -0,0 +1,229 @@ +// +// User Login v3 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +// Login Base +.kt-login.kt-login--v4 { + background-size: cover; + background-repeat: no-repeat; + + // Login Area + .kt-login__wrapper { + padding: 6% 2rem 1rem 2rem; + margin: 0 auto 2rem auto; + overflow: hidden; + + .kt-login__container { + width: 430px; + margin: 0 auto; + + .kt-login__logo { + text-align: center; + margin: 0 auto 4rem auto; + } + + .kt-login__head { + margin-top: 1rem; + margin-bottom: 3rem; + + .kt-login__title { + text-align: center; + font-size: 1.5rem; + font-weight: 500; + color: kt-base-color(label, 3); + } + + .kt-login__desc { + margin-top: 1.5rem; + text-align: center; + font-size: 1.1rem; + font-weight: 400; + color: kt-base-color(label, 2); + } + } + + .kt-form { + margin: 0 auto; + + .input-group { + padding: 0; + margin: 0 auto; + } + + .form-control { + height: 46px; + border: none; + padding-left: 1.5rem; + padding-right: 1.5rem; + border-radius: 46px; + margin-top: 1.5rem; + background: rgba(#fff, 0.015); + color: kt-base-color(label, 2); + @include kt-input-placeholder(kt-base-color(label, 3)); + } + + .form-control.is-valid + .valid-feedback, + .form-control.is-invalid + .invalid-feedback { + font-weight: 500; + font-size: 0.9rem; + padding-left: 1.6rem; + } + + .kt-login__extra { + margin-top: 30px; + margin-bottom: 15px; + color: kt-base-color(label, 2); + font-size: 1rem; + padding: 0 1.5rem; + + .kt-checkbox { + font-size: 1rem; + } + + .kt-login__link { + font-size: 1rem; + color: kt-base-color(label, 2); + transition: color 0.3s ease; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + } + + .kt-login__actions { + text-align: center; + margin-top: 7%; + + .kt-login__btn-secondary, + .kt-login__btn-primary { + height: 50px; + padding-left: 2.5rem; + padding-right: 2.5rem; + } + } + } + + .kt-login__account { + text-align: center; + margin-top: 2rem; + + .kt-login__account-msg { + font-size: 1rem; + font-weight: 400; + color:kt-base-color(label, 2); + } + + .kt-login__account-link { + font-size: 1rem; + font-weight: 500; + color: kt-base-color(label, 3); + transition: color 0.3s ease; + + &:hover { + color: kt-brand-color(); + transition: color 0.3s ease; + } + } + } + } + } +} + +// Login Modes +.kt-login.kt-login--v4 { + &.kt-login--signin { + .kt-login__signup { + display: none; + } + + .kt-login__signin { + display: block; + } + + .kt-login__forgot { + display: none; + } + } + + &.kt-login--signup { + .kt-login__signup { + display: block; + } + + .kt-login__signin { + display: none; + } + + .kt-login__forgot { + display: none; + } + + .kt-login__account { + display: none; + } + } + + &.kt-login--forgot { + .kt-login__signup { + display: none; + } + + .kt-login__signin { + display: none; + } + + .kt-login__forgot { + display: block; + } + } +} + +@include kt-tablet-and-mobile { + .kt-login.kt-login--v4 { + .kt-login__wrapper { + padding-top: 5rem; + width: 100%; + + .kt-login__container { + margin: 0 auto; + + .kt-login__account { + margin-top: 1rem; + } + } + } + } +} + +@include kt-mobile() { + .kt-login.kt-login--v4 { + .kt-login__wrapper { + width: 100%; + + .kt-login__container { + width: 100%; + margin: 0 auto; + + .kt-form { + width: 100%; + margin: 0 auto; + } + + .kt-login__account { + margin-top: 1rem; + } + } + } + } +} diff --git a/src/assets/sass/pages/login/login-5.scss b/src/assets/sass/pages/login/login-5.scss new file mode 100644 index 0000000..cbcb0b0 --- /dev/null +++ b/src/assets/sass/pages/login/login-5.scss @@ -0,0 +1,277 @@ +// +// User Login v5 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +// Login Base +.kt-login.kt-login--v5 { + height: auto; + display: flex; + width: 100%; + background-size: cover; + background-repeat: no-repeat; + align-items: stretch; + + // Buttons + + .btn { + height: 46px; + text-align: center; + padding-left: 3rem; + padding-right: 3rem; + margin-right: 2rem; + + &:last-child { + margin-right: 0; + } + } + + // Left Panel + .kt-login__left { + display: flex; + flex: 1; + width: 50%; + align-items: center; + justify-content: center; + + .kt-login__wrapper { + display: flex; + width: 500px; + + .kt-login__content { + text-align: center; + padding: 1rem 1.5rem; + + .kt-login__title { + margin: 5rem 0 2rem 0; + color: kt-base-color(label, 3); + font-size: 1.4rem; + font-weight: 500; + } + + .kt-login__desc { + color: kt-base-color(label, 2); + font-size: 1rem; + } + + .kt-login__actions { + margin: 3.4rem 0 3rem 0; + text-align: center; + } + } + } + } + + .kt-login__divider { + display: flex; + align-items: center; + justify-content: center; + + > div { + height: 400px; + background: #ffffff; + width: 30px; + box-shadow: -19px 0 35px -7px #F5F5F5; + } + } + + // Right Panel + .kt-login__right { + display: flex; + flex: 1; + width: 50%; + justify-content: center; + align-items: center; + + .kt-login__wrapper { + width: 400px; + padding: 1rem 1.5rem; + + .kt-login__head { + text-align: center; + } + + .kt-login__logo { + text-align: center; + margin: 0 auto 4rem auto; + } + + .kt-login__title { + text-align: center; + font-size: 1.5rem; + font-weight: 500; + color: kt-base-color(label, 3); + } + + .kt-login__desc { + margin-top: 0.75rem; + font-size: 1rem; + font-weight: 400; + color: kt-base-color(label, 2); + } + + .kt-login__form { + margin-top: 4rem; + + .form-group { + margin: 0; + padding: 0; + } + + .form-control { + height: 46px; + border-radius: 0; + border: none; + border-bottom: 0.07rem solid #ebecf1 !important; + padding: 1rem 0; + margin-top: 0.1rem; + @include kt-input-placeholder(#93959e); + &:focus { + @include kt-input-placeholder(kt-brand-color()); + } + &.form-control-last { + border-bottom: 0 !important; + } + } + + .form-control.is-valid + .valid-feedback, + .form-control.is-invalid + .invalid-feedback { + font-weight: 500; + font-size: 0.9rem; + padding-left: 1.6rem; + } + } + + .kt-login__extra { + margin-top: 2rem; + color: #585a62; + .kt-checkbox { + font-size: 1rem; + } + .kt-link { + font-size: 1rem; + } + } + + .kt-login__actions { + margin: 3rem 0 3rem 0; + text-align: center; + } + + .kt-login__account { + text-align: center; + .kt-login__account-msg { + font-size: 1.1rem; + font-weight: 500; + } + .kt-login__account-link { + font-size: 1.1rem; + font-weight: 500; + } + } + } + } + + // Login Modes + &.kt-login--signin { + .kt-login__signin { + display: block; + } + .kt-login__forgot { + display: none; + } + } + + &.kt-login--forgot { + .kt-login__signin { + display: none; + } + .kt-login__forgot { + display: block; + } + } +} + +@include kt-tablet-and-mobile() { + .kt-login.kt-login--v5 { + flex-direction: column; + + .kt-login__left { + flex-grow: 1; + width: 100%; + margin: 0 auto; + padding-top: 2.5rem; + + .kt-login__wrapper { + padding-bottom: 0; + margin: 0 auto; + flex-direction: column; + + .kt-login__contanier { + padding: 1rem; + width: 100%; + margin-top: 3rem; + .kt-login__content { + width: 100%; + } + } + } + + .kt-login__actions { + margin: 1rem 0; + } + } + + .kt-login__right { + flex-grow: 1; + width: 100%; + padding-top: 1.5rem; + padding-bottom: 2.5rem; + + .kt-login__title { + + } + + .kt-login__contanier { + width: 100%; + margin: 0 auto; + padding: 1rem; + + .kt-login__actions { + .btn { + padding: 1rem 1.95rem; + margin-right: 0.5rem; + + &:last-child { + margin-right: 0; + } + } + } + } + } + + .kt-login__divider { + display: flex; + padding-top: 0; + width: 60%; + margin: 5px auto; + align-items: center; + justify-content: center; + + > div { + height: 30px; + background: #ffffff; + width: 100%; + box-shadow: 0 -15px 30px -10px #F5F5F5; + } + } + } +} diff --git a/src/assets/sass/pages/login/login-6.scss b/src/assets/sass/pages/login/login-6.scss new file mode 100644 index 0000000..2247a50 --- /dev/null +++ b/src/assets/sass/pages/login/login-6.scss @@ -0,0 +1,278 @@ +// +// User Login v6 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +// Login Base +.kt-login.kt-login--v6 { + background: #fff; + + // Page Aside + .kt-login__aside { + padding: 2rem; + background: #fff; + width: 600px; + + .kt-login__wrapper { + flex: 1; + display: flex; + flex-direction: column; + padding: 2rem; + + .kt-login__container { + flex: 1; + width: 400px; + margin: 0 auto; + display: flex; + align-items: center; + padding-bottom: 5rem; + + .kt-login__body { + width: 100%; + flex: 1; + } + + .kt-login__logo { + text-align: center; + margin: 1rem auto 4rem auto; + } + + .kt-login__head { + margin-top: 1rem; + text-align: center; + + .kt-login__title { + text-align: center; + font-size: 1.5rem; + color: kt-base-color(label, 3); + font-weight: 500; + } + + .kt-login__desc { + text-align: center; + font-size: 1rem; + color: kt-base-color(label, 2); + font-weight: 400; + margin-top: 1rem; + } + } + + .kt-login__form { + margin-top: 4rem; + + .form-group { + margin: 0; + padding: 0; + position: relative; + } + + .form-control { + height: 46px; + border-radius: 0; + border: 0; + border-bottom: 1px solid rgba(kt-base-color(grey, 2), 0.8); + padding: 1rem 0; + margin-top: 0.1rem; + color: kt-base-color(label, 3); + @include kt-input-placeholder(kt-base-color(label, 2)); + + &.form-control-last { + border: 0; + } + } + } + + .kt-login__actions { + margin: 3rem 0; + text-align: center; + } + + .kt-login__extra { + margin-top: 2rem; + display: flex; + justify-content: space-between; + + label { + margin: 0; + } + + a { + font-weight: 500; + color: kt-base-color(label, 3); + transition: color 0.3s ease; + display: inline-block; + + &:hover { + transition: color 0.3s ease; + color: kt-brand-color(); + } + } + } + } + + .kt-login__account { + text-align: center; + + .kt-login__account-msg { + font-size: 1rem; + font-weight: 500; + color: kt-base-color(label, 2); + } + + .kt-login__account-link { + font-size: 1rem; + font-weight: 500; + color: kt-base-color(label, 3); + transition: color 0.3s ease; + + &:hover { + transition: color 0.3s ease; + color: kt-brand-color(); + } + } + } + } + } + + // Button + .btn { + height: 46px; + padding-left: 3rem; + padding-right: 3rem; + + & ~ .btn { + margin-left: 0.5rem; + } + } + + // Page Content + .kt-login__content { + background-size: cover; + background-repeat: no-repeat; + + .kt-login__section { + display: flex; + align-items: center; + justify-content: center; + flex: 1; + + .kt-login__title { + color: #ffffff; + font-size: 3.5rem; + font-weight: 500; + margin-bottom: 2rem; + } + + .kt-login__desc { + color: rgba(#ffffff, 0.8); + font-size: 1.1rem; + font-weight: 400; + } + } + } +} + +// Login Modes +.kt-login.kt-login--v6 { + &.kt-login--signin { + .kt-login__signup { + display: none; + } + .kt-login__signin { + display: block; + } + .kt-login__forgot { + display: none; + } + } + &.kt-login--signup { + .kt-login__signup { + display: block; + } + .kt-login__signin { + display: none; + } + .kt-login__forgot { + display: none; + } + .kt-login__account { + display: none; + } + } + &.kt-login--forgot { + .kt-login__signup { + display: none; + } + .kt-login__signin { + display: none; + } + .kt-login__forgot { + display: block; + } + } +} + +@include kt-tablet-and-mobile() { + .kt-login.kt-login--v6 { + height: 100%; + + .kt-login__aside { + padding: 20px 15px; + width: 100%; + + .kt-login__wrapper { + width: 100%; + margin: 0 auto; + padding: 15px; + + .kt-login__container { + width: 100%; + padding-bottom: 20px; + + .kt-login__form { + margin-top: 20px; + } + + .kt-login__actions { + margin: 20px 0; + } + } + + .kt-login__logo { + margin: 20px auto; + } + } + + .kt-login__account { + margin-top: 1.5rem; + } + } + + .kt-login__content { + display: flex; + justify-content: center; + align-items: center; + padding: 20px 15px; + + .kt-login__section { + .kt-login__title { + font-size: 1.3rem; + margin-bottom: 1rem; + } + + .kt-login__desc { + font-size: 1rem; + margin: 0; + } + } + } + } +} diff --git a/src/assets/sass/pages/pricing/pricing-1.scss b/src/assets/sass/pages/pricing/pricing-1.scss new file mode 100644 index 0000000..3717b55 --- /dev/null +++ b/src/assets/sass/pages/pricing/pricing-1.scss @@ -0,0 +1,211 @@ +// +// Pricing Tables 1 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +.kt-pricing-1 { + overflow: hidden; + + &.kt-pricing-1--fixed { + width: 75%; + margin: 0 auto; + } + + .kt-pricing-1__items { + background-color: #fff; + position: relative; + z-index: 1; + text-align: center; + padding: 2.14rem 0 2.14rem 0; + + .kt-pricing-1__item { + border-right: 0.07rem solid kt-base-color(grey, 2); + padding: 0; + + &:last-child { + border-right: none; + } + + .kt-pricing-1__visual { + margin-top: 10rem; + position: relative; + left: 50%; + transform: translateX(-50%) translateY(-50%); + + .kt-pricing-1__hexagon1 { + left: 50%; + transform: translateX(-50%) translateY(-50%); + position: absolute; + + &:before { + left: 50%; + transform: translateX(-50%) translateY(-50%); + content: ""; + position: absolute; + top: -3.93rem; + width: 17.14rem; + height: 0; + border-left: 4.2rem solid transparent; + border-right: 4.2rem solid transparent; + border-bottom: 7.5rem solid #FCFCFE; + } + + &:after { + left: 50%; + transform: translateX(-50%) translateY(-50%); + content: ""; + position: absolute; + top: 3.5rem; + width: 17.14rem; + height: 0; + border-left: 4.2rem solid transparent; + border-right: 4.2rem solid transparent; + border-top: 7.5rem solid #FCFCFE; + } + } + + .kt-pricing-1__hexagon2 { + left: 50%; + margin-top: -1.43rem; + transform: translateX(-50%) translateY(-50%); + position: absolute; + + &:before { + left: 50%; + transform: translateX(-50%) translateY(-50%); + content: ""; + position: absolute; + top: -0.42rem; + width: 8.7rem; + height: 0; + border-left: 2.14rem solid transparent; + border-right: 2.14rem solid transparent; + border-bottom: 3.71rem solid #F8F7FD; + } + + &:after { + left: 50%; + transform: translateX(-50%) translateY(-50%); + content: ""; + position: absolute; + top: 3.3rem; + width: 8.7rem; + height: 0; + border-left: 2.14rem solid transparent; + border-right: 2.14rem solid transparent; + border-top: 3.71rem solid #F8F7FD; + } + } + + .kt-pricing-1__icon { + left: 50%; + transform: translateX(-50%) translateY(-50%); + position: absolute; + + > i { + font-size: 8.57rem; + } + } + } + + .kt-pricing-1__price { + font-size: 3rem; + font-weight: 700; + display: block; + margin-top: 20rem; + color: kt-base-color(label, 3); + + .kt-pricing-1__label { + margin-top: 0.64rem; + margin-left: 0.357rem; + position: absolute; + font-size: 1.64rem; + font-weight: 500; + color: kt-base-color(label, 2); + } + } + + &:nth-child(1) { + .kt-pricing-1__price { + font-size: 2.14rem; + margin-bottom: 0.571rem; + margin-top: 270px; + color: kt-base-color(label, 3); + } + } + + .kt-pricing-1__subtitle { + font-size: 1.1rem; + color: kt-base-color(label, 1); + font-weight: 500; + } + + .kt-pricing-1__description { + margin: 1.785rem auto; + font-size: 1rem; + padding: 0 0.5rem; + color: kt-base-color(label, 2); + font-weight: 400; + + > span { + display: block; + text-align: center; + } + } + + .kt-pricing-1__btn { + margin: 2.14rem 0 2.14rem 0; + + > .btn { + padding: 0.86rem 3.57rem 0.86rem 3.57rem; + } + } + } + } +} + +@include kt-minimal-desktop() { + .kt-pricing-1 { + &.kt-pricing-1--fixed { + width: 100%; + + .kt-pricing-1__items { + .kt-pricing-1__item { + border-right: 1px solid kt-base-color(grey, 2); + + &:last-child { + border-right: none; + } + } + } + } + } +} + + +@include kt-tablet-and-mobile() { + .kt-pricing-1 { + .kt-pricing-1__items { + .kt-pricing-1__item { + border-bottom: 1px solid kt-base-color(grey, 2); + border-right: none; + + &:last-child { + border-bottom: none; + } + + .kt-pricing-1__btn { + margin-bottom: 3.57rem; + } + } + } + } +} diff --git a/src/assets/sass/pages/pricing/pricing-2.scss b/src/assets/sass/pages/pricing/pricing-2.scss new file mode 100644 index 0000000..a892103 --- /dev/null +++ b/src/assets/sass/pages/pricing/pricing-2.scss @@ -0,0 +1,267 @@ +// +// Pricing Tables 2 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +.kt-pricing-2 { + padding: 0 0 2.86rem 0; + + .kt-pricing-2__head { + text-align: center; + background-color: #22B9FF; + padding: 8.57rem 0 25rem 0; + + .kt-pricing-2__title { + text-align:center; + margin-top: -3.57rem; + } + + .btn-group { + text-align:center; + display: inline-block; + margin: 2.5rem auto 0 auto; + + .btn { + margin-right: -0.21rem; + padding: 1rem 1.93rem 1rem 1.93rem; + background: #fff; + color: kt-base-color(label, 2); + + &.active { + background: kt-brand-color(); + color: kt-brand-color(inverse); + } + } + } + } + + .kt-pricing-2__content { + .kt-pricing-2__container { + margin: 0 auto; + max-width: 75%; + margin-top: -21.64rem; + + .kt-pricing-2__items { + background-color: #fff; + position: relative; + text-align: center; + padding: 2.14rem 0.71rem 2.14rem 0.71rem; + + .kt-pricing-2__item { + border-right: 1px solid #e1f1ff; + width: 100%; + + &:last-child { + border-right: none; + } + + .kt-pricing-2__visual { + position: relative; + margin-top: 6.8rem; + left: 50%; + transform: translateX(-50%) translateY(-50%); + + .kt-pricing-2__hexagon { + height: 0; + background: #F4FCFF; + left: 50%; + transform: translateX(-50%) translateY(-50%); + position: absolute; + + &:before { + content: ""; + position: absolute; + top: -2.14rem; + width: 13.2rem; + height: 0; + border-left: 3.35rem solid transparent; + border-right: 3.35rem solid transparent; + border-bottom: 5.71rem solid #F4FCFF; + left: 50%; + transform: translateX(-50%) translateY(-50%); + } + + &:after { + content: ""; + position: absolute; + top: 3.57rem; + width: 13.21rem; + height: 0; + border-left: 3.35rem solid transparent; + border-right: 3.35rem solid transparent; + border-top: 5.71rem solid #F4FCFF; + left: 50%; + transform: translateX(-50%) translateY(-50%); + } + } + + .kt-pricing-2__icon { + margin-top: 0.8rem; + left: 50%; + transform: translateX(-50%) translateY(-50%); + position: absolute; + + > i { + font-size: 6.43rem; + } + } + } + + .kt-pricing-2__subtitle { + margin-top: 17.1rem; + font-size: 1.64rem; + color: kt-base-color(label, 3); + } + + .kt-pricing-2__features { + margin: 2.14rem 0 1.8rem; + line-height: 2.2; + + > span { + display: block; + color: kt-base-color(label, 2); + font-weight: 500; + } + } + + .kt-pricing-2__price { + font-size: 3.21rem; + font-weight: 600; + color: kt-base-color(label, 3); + } + + .kt-pricing-2__label { + margin: 0.64rem 0 0 0.35rem; + font-size: 25px; + position: absolute; + color: kt-base-color(label, 2); + } + + .kt-pricing-2__btn { + margin: 2.14rem auto 2.14rem auto; + + > .btn { + padding: 0.86rem 3.6rem 0.86rem 3.6rem; + font-size: 0.86rem; + } + } + } + } + } + } +} + +@include kt-minimal-desktop() { + .kt-pricing-2 { + .kt-pricing-2__content { + padding: 0 2.14rem 0 2.14rem; + + .kt-pricing-2__container { + max-width: 90%; + + .kt-pricing-2__items { + .kt-pricing-2__item { + border-right: 1px solid #e1f1ff; + padding-left: 0.71rem; + padding-right: 0.71rem; + + &:last-child { + border-right: none; + } + + .kt-pricing-2__btn { + margin: 1.43rem auto 3.6rem auto; + } + } + } + } + } + } +} + +@include kt-tablet() { + .kt-pricing-2 { + .kt-pricing-2__content { + padding: 0 2.14rem 0 2.14rem; + + .kt-pricing-2__container { + max-width: 90%; + + .kt-pricing-2__items { + + .kt-pricing-2__item { + border-bottom: 1px solid #e1f1ff; + border-right: none; + padding-left: 0.71rem; + padding-right: 0.71rem; + margin-bottom: 2rem; + + &:last-child { + border-bottom: none; + margin-bottom: 0; + } + + .kt-pricing-2__btn { + margin: 1.43rem auto 3.6rem auto; + } + } + } + } + } + } +} + +@include kt-mobile() { + .kt-pricing-2 { + .kt-pricing-2__head { + .kt-pricing-2__title { + top: 4%; + + > h1 { + font-size: 1.8rem; + } + } + + .btn-group { + top: 8%; + + .btn { + padding: 0.71rem 0.71rem 0.71rem 0.71rem; + } + } + } + + .kt-pricing-2__content { + .kt-pricing-2__container { + width: 100%; + + .kt-pricing-2__items { + .kt-pricing-2__item { + border-bottom: 1px solid #e1f1ff; + border-right: none; + padding-left: 0.71rem; + padding-right: 0.71rem; + margin-bottom: 2rem; + + &:last-child { + border-bottom: none; + margin-bottom: 0; + } + + .kt-pricing-2__btn { + margin: 1.43rem auto 3.6rem auto; + } + } + } + } + } + } +} diff --git a/src/assets/sass/pages/pricing/pricing-3.scss b/src/assets/sass/pages/pricing/pricing-3.scss new file mode 100644 index 0000000..52cbb55 --- /dev/null +++ b/src/assets/sass/pages/pricing/pricing-3.scss @@ -0,0 +1,183 @@ +// +// Pricing Tables 3 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +// Base +.kt-pricing-3 { + padding: 5.71rem 0 5.71rem 0; + + &.kt-pricing-3--fixed { + width: 75%; + margin: 0 auto; + } + + .kt-pricing-3__items { + width: 100%; + text-align: center; + box-shadow: 0px 1px 15px 1px rgba(69,65,78,0.08); + + .kt-pricing-3__item { + @include kt-rounded { + border-radius: $kt-border-radius; + } + + .kt-pricing-3__wrapper { + padding: 4.2rem 1rem; + text-align: center; + + .kt-pricing-3__title { + font-size: 1.3rem; + color: kt-base-color(label, 2); + } + + .kt-pricing-3__price { + @include kt-rounded { + border-radius: 16px; + } + + margin-top: 2.83rem; + display: inline-block; + font-size: 1.8rem; + font-weight: 500; + padding: 0.83rem 1.43rem 0.83rem 1.43rem; + background-color: rgba(kt-state-color(brand, base), 0.05); + color: kt-base-color(label, 2); + + &.kt-pricing-3__price--padding { + padding: 1.4rem 1.43rem 1.4rem 1.43rem; + } + + .kt-pricing-3__label { + font-size: 1.5rem; + vertical-align: 33%; + color: kt-base-color(label, 2); + } + + .kt-pricing-3__number { + font-size: 2.64rem; + color: kt-base-color(label, 3); + } + + .kt-pricing-3__text { + font-size: 1.07rem; + vertical-align: 40%; + color: kt-base-color(label, 2); + } + } + + .kt-pricing-3__description { + text-align: center; + font-size: 0.96rem; + display: inline-block; + margin-top: 2.85rem; + color: kt-base-color(label, 2); + + > span { + display: block; + &:nth-child(1) { + letter-spacing: 0.01rem; + } + } + } + + .kt-pricing-3__btn { + margin: 2.83rem auto 0 auto; + + > .btn { + padding: 0.8rem 3.6rem 0.8rem 3.6rem; + } + } + } + + &.kt-pricing-3__item--focus { + background-color: kt-state-color(brand, base); + margin-top: -3rem; + margin-bottom: -3rem; + color: rgba(#fff, 0.1); + + .kt-pricing-3__wrapper { + padding: 7rem 1rem; + + .kt-pricing-3__btn { + > .btn { + color: kt-base-color(label, 3); + + &:hover { + color: kt-base-color(label, 3); + background-color: #fff; + border: 1px solid #fff; + } + } + } + + .kt-pricing-3__price { + background-color: rgba(#fff, 1); + + .kt-pricing-3__label { + color: rgba(#fff, 0.6); + } + + .kt-pricing-3__number { + font-size: 2.64rem; + color: rgba(#fff, 0.8); + } + + .kt-pricing-3__text { + color: rgba(#fff, 0.6); + } + } + + .kt-pricing-3__description { + color: rgba(#fff, 0.9); + } + } + } + } + } + } + + @include kt-minimal-desktop() { + .kt-pricing-3 { + &.kt-pricing-3--fixed { + width: 90%; + margin: 0 auto; + } + } +} + +@include kt-tablet-and-mobile() { + .kt-pricing-3 { + padding: 2.14rem 0 2.14rem 0; + + &.kt-pricing-3--fixed { + width: 100%; + margin: 0 auto; + + .kt-pricing-3__items { + .kt-pricing-3__item { + .kt-pricing-3__wrapper { + padding: 3rem 1rem; + } + + &.kt-pricing-3__item--focus { + margin-top: 0; + margin-bottom: 0; + + .kt-pricing-3__wrapper { + padding: 3rem 1rem; + } + } + } + } + } + } +} diff --git a/src/assets/sass/pages/pricing/pricing-4.scss b/src/assets/sass/pages/pricing/pricing-4.scss new file mode 100644 index 0000000..745aef0 --- /dev/null +++ b/src/assets/sass/pages/pricing/pricing-4.scss @@ -0,0 +1,348 @@ +// +// Pricing Tables 4 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +.kt-pricing-4 { + padding-bottom: 4rem; + + .kt-pricing-4__top { + background-color: #E0306E; + + .kt-pricing-4__top-container { + &.kt-pricing-4__top-container--fixed { + width: 80%; + margin: 0 auto; + + .kt-pricing-4__top-header { + .kt-pricing-4__top-title { + padding-top: 5rem; + margin-bottom: 5rem; + text-align: center; + + > h1 { + font-size: 2.3rem; + } + } + } + + .kt-pricing-4__top-body { + margin-left: 14.3rem; + + .kt-pricing-4__top-items { + display: table; + width: 100%; + table-layout: fixed; + box-shadow: 0 -1.3rem 1.07rem 0.71rem #D93371; + + .kt-pricing-4__top-item { + display: table-cell; + text-align: center; + border-right: 1px solid #e1f1ff; + background-color: white; + + &:last-child { + border-right: none; + } + + .kt-pricing-4__icon { + > i { + font-size: 5rem; + margin-top: 3.6rem; + } + } + + .kt-pricing-4__subtitle { + font-size: 1.64rem; + color: kt-base-color(label, 3); + margin-top: 2.14rem; + font-weight: 500; + } + + .kt-pricing-4__features { + font-size: 1rem; + margin-top: 2.14rem; + font-weight: 400; + margin-bottom: 1.43rem; + padding: 0 0.71rem 0 0.71rem; + color: kt-base-color(label, 2); + } + + .kt-pricing-4__price { + font-size: 3.2rem; + color: kt-base-color(label, 3); + font-weight: 700; + } + + .kt-pricing-4__label { + font-size: 1.64rem; + vertical-align: 43%; + color: kt-base-color(label, 2); + } + + .kt-pricing-4__btn { + margin-top: 1.43rem; + margin-bottom: 3.6rem; + + .btn { + padding: 0.8rem 3.6rem 0.8rem 3.6rem; + } + } + + .kt-pricing-4__top-items-mobile { + display: none; + + > span { + display: block; + } + + .kt-pricing-4__top-item-mobile { + color: kt-base-color(label, 2); + + > span { + &:first-child { + color: kt-base-color(label, 3); + } + } + + &:nth-child(odd) { + background-color: #FAFBFF; + } + } + } + } + } + } + } + } + } + + .kt-pricing-4__bottom { + .kt-pricing-4__bottok-container { + &.kt-pricing-4__bottok-container--fixed { + width: 80%; + margin: 0 auto; + + .kt-pricing-4__bottom-items { + display: table; + width: 100%; + text-align: center; + table-layout: fixed; + + .kt-pricing-4__bottom-item { + display: table-cell; + padding: 1.43rem 0; + font-weight: 700; + color: kt-base-color(label, 2); + + &:first-child { + width: 14.3rem; + text-align: left; + padding-left: 1.43rem; + font-weight: 700; + color: #696B84; + } + } + + &:nth-child(odd) { + background-color: #FAFBFF; + } + } + } + } + } +} + + +@include kt-minimal-desktop() { + .kt-pricing-4 { + .kt-pricing-4__top { + .kt-pricing-4__top-container { + &.kt-pricing-4__top-container--fixed { + width: 90%; + margin: 0 auto; + + .kt-pricing-4__top-body { + margin-left: 14.3rem; + } + } + } + } + + .kt-pricing-4__bottom { + .kt-pricing-4__bottok-container { + &.kt-pricing-4__bottok-container--fixed { + width: 90%; + margin: 0 auto; + } + } + } + } +} + +@include kt-tablet() { + .kt-pricing-4 { + .kt-pricing-4__top { + background: none; + + .kt-pricing-4__top-container { + &.kt-pricing-4__top-container--fixed { + width: 90%; + margin: 0 auto; + + .kt-pricing-4__top-header { + background-color: #E0306E; + padding-bottom: 21.43rem; + } + + .kt-pricing-4__top-body { + width: 80%; + margin: 0 auto; + margin-top: -21.4rem; + + .kt-pricing-4__top-items { + box-shadow: none; + + .kt-pricing-4__top-item { + display: block; + border-right: none; + padding-bottom: 3.6rem; + + .kt-pricing-4__features { + padding: 0 0.71rem 0 0.71rem; + } + + .kt-pricing-4__btn { + display: none; + } + + .kt-pricing-4__top-items-mobile { + display: block; + margin:0 auto; + + .kt-pricing-4__top-item-mobile { + padding: 0.71rem 0 0.71rem 0; + + > span { + &:first-child { + font-weight: 700; + } + } + } + } + + .kt-pricing-4__top-btn { + margin-top: 2.86rem; + + .btn { + padding: 0.8rem 3.6rem 0.8rem 3.6rem; + } + } + + border-bottom: 1px solid #e1f1ff; + } + } + } + } + } + } + + .kt-pricing-4__bottom { + .kt-pricing-4__bottok-container { + &.kt-pricing-4__bottok-container--fixed { + display: none; + } + } + } + } +} + +@include kt-mobile() { + .kt-pricing-4 { + .kt-pricing-4__top { + background: none; + + .kt-pricing-4__top-container { + &.kt-pricing-4__top-container--fixed { + width: 100%; + margin: 0 auto; + + .kt-pricing-4__top-header { + background-color: #E0306E; + padding-bottom: 21.43rem; + + .kt-pricing-4__top-title { + > h1 { + font-size: 1.8rem; + } + } + } + + .kt-pricing-4__top-body { + width: 80%; + margin: 0 auto; + margin-top: -21.43rem; + + .kt-pricing-4__top-items { + box-shadow: none; + + .kt-pricing-4__top-item { + display: block; + border-right: none; + padding-bottom: 1rem; + + .kt-pricing-4__btn { + display: none; + } + + .kt-pricing-4__features { + padding: 0 0.71rem 0 0.71rem; + } + + .kt-pricing-4__top-items-mobile { + display: block; + margin: 2.14rem auto; + + .kt-pricing-4__top-item-mobile { + padding: 0.71rem 0 0.71rem 0; + + > span { + &:first-child { + font-weight: 700; + } + } + } + + .kt-pricing-4__top-btn { + margin-top: 2.86rem; + .btn { + padding: 0.8rem 3.6rem 0.8rem 3.6rem; + } + } + } + + border-bottom: 1px solid #e1f1ff; + } + } + } + } + } + } + + .kt-pricing-4__bottom { + .kt-pricing-4__bottok-container { + &.kt-pricing-4__bottok-container--fixed { + display: none; + } + } + } + } +} diff --git a/src/assets/sass/pages/support-center/faq-1.scss b/src/assets/sass/pages/support-center/faq-1.scss new file mode 100644 index 0000000..93c04b0 --- /dev/null +++ b/src/assets/sass/pages/support-center/faq-1.scss @@ -0,0 +1,41 @@ +// +// Support Center/Faq 1 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +// Base +.kt-sc-faq { + background-position: center top; + background-size: cover; + background-repeat: no-repeat; + + .kt-sc__top{ + display: flex; + padding: 6rem 0 10rem; + align-items: center; + + .kt-sc__title { + margin-bottom: 0; + font-size: 1.85rem; + font-weight: 600; + color: kt-base-color(label, 4); + } + + .kt-sc__nav{ + margin: auto 0 auto auto; + + .kt-link{ + font-size: 1.3rem; + font-weight: 400; + } + } + } +} diff --git a/src/assets/sass/pages/support-center/faq-2.scss b/src/assets/sass/pages/support-center/faq-2.scss new file mode 100644 index 0000000..16a77be --- /dev/null +++ b/src/assets/sass/pages/support-center/faq-2.scss @@ -0,0 +1,134 @@ +// +// Support Center/Faq 2 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +// Base +.kt-sc-faq-2 { + display: flex; + flex-direction: column; + position: relative; + + .kt-sc__bg{ + $portlet-padding: 0; + position: absolute; + top:$portlet-padding; + left:$portlet-padding; + right: $portlet-padding; + bottom: $portlet-padding; + display: flex; + justify-content: flex-end; + align-items: flex-end; + z-index: 0; + padding-right: 70px; + overflow:hidden; + + .kt-svg-icon{ + height: 110%; + width: auto; + transform: translateY(50px); + } + + &--layer{ + top:0; + left:0; + right: 0; + bottom: 0; + padding-right: 0; + + .kt-svg-icon{ + height: auto; + width: 100%; + fill: rgba(103,112,153, 0.04); + transform: translateY(0); + } + } + } + + .kt-sc__top{ + position: relative; + z-index: 1; + + .kt-sc__content{ + margin-right: 50%; + display: flex; + align-items: center; + padding: 6rem 3rem; + + .kt-sc__title{ + color: kt-base-color(label, 4); + font-size: 2.15rem; + font-weight: 600; + margin-right: 3.5rem; + margin-bottom: 0; + } + + .kt-sc__form { + + .input-group{ + width: 380px; + box-shadow: 0px 0px 27px 0px rgba(160,160,191,0.2); + + .input-group-text{ + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border: none; + padding: 0.65rem 2rem; + background-color: kt-state-color(brand, inverse); + } + + .form-control{ + border: none; + padding: 2.5rem 0; + font-weight: 400; + font-size: 1.1rem; + } + } + } + } + } +} + +@include kt-tablet-and-mobile(){ + + .kt-sc-2{ + + .kt-sc__bg{ + opacity: 0.2; + + .kt-svg-icon{ + transform: translateY(0); + } + } + + .kt-sc__top{ + min-height: auto; + + .kt-sc__content{ + flex-direction: column; + padding: 4rem 0; + margin-right: 0; + min-height: auto; + + .kt-sc__title{ + margin-bottom: 2rem; + } + + .kt-sc__form { + + .input-group{ + width: 100%; + } + } + } + } + } +} diff --git a/src/assets/sass/pages/support-center/faq-3.scss b/src/assets/sass/pages/support-center/faq-3.scss new file mode 100644 index 0000000..9297c8a --- /dev/null +++ b/src/assets/sass/pages/support-center/faq-3.scss @@ -0,0 +1,95 @@ +// +// Support Center/Faq 3 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + + +// Base +.kt-sc-faq-3 { + text-align: center; + padding: 3rem 0 0; + + .kt-sc__title{ + color: kt-base-color(label, 4); + font-size: 2.2rem; + font-weight: 600; + margin-bottom: 1.2rem; + } + + .kt-sc__subtitle{ + font-size: 1.4rem; + color: #9392a0; + margin-bottom: 0.5rem; + font-weight: 400; + } + + .kt-sc__bg{ + + svg{ + width: 550px; + height: auto; + } + } + + &.kt-negative-spacing{ + margin-top: -15px; + padding-top: 0; + } + + &--accordion{ + padding-top: 0; + + .accordion.accordion-toggle-svg{ + margin-bottom: 3rem; + + .card{ + box-shadow: 0px 0px 13px 0px rgba(82, 63, 105, 0.05); + border-radius: 4px !important; + margin-bottom: 0.9rem; + + .card-header{ + + .card-title{ + padding: 3rem; + font-size: 1.45rem; + + svg{ + width: 30px; + height: 30px; + } + } + } + + .card-body{ + padding: 0 3rem 3rem; + border: none; + text-align: left; + font-size: 1.15rem; + line-height: 2rem; + font-weight: 400; + color: #9392a0; + } + } + } + } +} + +@include kt-tablet-and-mobile(){ + .kt-sc-faq-3 { + + .kt-sc__bg{ + + svg{ + width: 100%; + } + } + } +} diff --git a/src/assets/sass/pages/support-center/feedback.scss b/src/assets/sass/pages/support-center/feedback.scss new file mode 100644 index 0000000..399da6d --- /dev/null +++ b/src/assets/sass/pages/support-center/feedback.scss @@ -0,0 +1,23 @@ +// +// Support Center/Faq 3 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +// Base +.kt-sc-feedback { + + .kt-sc__bg{ + + svg{ + width: 650px; + } + } +} diff --git a/src/assets/sass/pages/support-center/home-1.scss b/src/assets/sass/pages/support-center/home-1.scss new file mode 100644 index 0000000..a3474ee --- /dev/null +++ b/src/assets/sass/pages/support-center/home-1.scss @@ -0,0 +1,113 @@ +// +// Support Center/Home 1 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + + +// Base +.kt-sc { + background-position: center top; + background-size: cover; + background-repeat: no-repeat; + margin-bottom: 2rem; + + .kt-sc__top { + display: flex; + align-items: center; + justify-content: space-between; + padding-top: 2rem; + padding-bottom: 2rem; + border-bottom: 1px solid kt-state-color(brand, inverse); + + .kt-sc__title { + margin-bottom: 0; + font-size: 1.45rem; + color: kt-base-color(label, 4); + } + + .kt-sc__nav { + + .kt-link{ + margin-left: 2rem; + font-size: 1.1rem; + font-weight: 400; + + &:first-child{ + margin-left: 0; + } + } + } + } + + .kt-sc__bottom{ + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding-top: 10rem; + padding-bottom: 10rem; + + .kt-sc__heading{ + margin-bottom: 4rem; + } + + .kt-sc__form { + .input-group{ + width: 630px; + box-shadow: 0px 0px 9px 0px rgba(122,104,181,0.09); + + .input-group-text{ + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border: none; + padding: 0.65rem 2rem; + background-color: kt-state-color(brand, inverse); + } + + .form-control{ + border: none; + padding: 2.5rem 0; + font-weight: 400; + font-size: 1.1rem; + } + } + } + } +} + + +@include kt-tablet-and-mobile(){ + .kt-sc { + .kt-content--fit-top & { + margin-top: -15px; + } + + .kt-sc__top{ + .kt-sc__nav { + .kt-link{ + margin-left: 1rem; + + &:first-child{ + margin-left: 0; + } + } + } + } + + .kt-sc__bottom{ + .kt-sc__form{ + .input-group{ + width:100%; + } + } + } + } +} diff --git a/src/assets/sass/pages/support-center/home-2.scss b/src/assets/sass/pages/support-center/home-2.scss new file mode 100644 index 0000000..c0f427f --- /dev/null +++ b/src/assets/sass/pages/support-center/home-2.scss @@ -0,0 +1,185 @@ +// +// Support Center/Home 2 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +// Base +.kt-sc-2 { + $top-height: 385px; + display: flex; + flex-direction: column; + position: relative; + + .kt-sc__bg{ + $portlet-padding: 4rem; + position: absolute; + top:$portlet-padding; + left:$portlet-padding; + right: $portlet-padding; + bottom: $portlet-padding; + display: flex; + justify-content: flex-end; + align-items: flex-end; + z-index: 0; + + .kt-svg-icon{ + height: 100%; + width: auto; + } + + &--layer{ + top:0; + left:0; + right: 0; + bottom: 0; + + .kt-svg-icon{ + height: auto; + width: 100%; + fill: kt-base-color(grey, 1); + } + } + } + + .kt-sc-bg-2{ + + .kt-svg-icon{ + position: absolute; + bottom:0; + left:0; + width: 100%; + height: auto; + + z-index:1; + } + + } + + .kt-sc__top{ + min-height: $top-height; + position: relative; + z-index: 1; + + .kt-sc__content{ + margin-right: 50%; + display: flex; + flex-direction: column; + justify-content: center; + min-height: $top-height; + padding: 0 3rem; + + .kt-sc__title{ + color: kt-base-color(label, 4); + font-size: 2rem; + font-weight: 600; + margin-bottom: 2.5rem; + } + + .kt-sc__form { + + .input-group{ + width: 450px; + box-shadow: 0px 0px 27px 0px rgba(160,160,191,0.2); + + .input-group-text{ + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border: none; + padding: 0.65rem 2rem; + background-color: kt-state-color(brand, inverse); + } + + .form-control{ + border: none; + padding: 2.5rem 0; + font-weight: 400; + font-size: 1.1rem; + } + } + } + } + } + + .kt-sc__bottom{ + padding: 25px 25px 0; + position: relative; + z-index: 1; + + .nav-tabs{ + margin-bottom: -25px; + + &.nav-tabs-line{ + border-bottom: 0; + padding: 0 3rem; + } + + .nav-item{ + margin-right: 50px; + + .nav-link, a.nav-link{ + font-size: 1.2rem; + padding: 0 0 1.5rem; + font-weight: 500; + color: kt-base-color(label, 4); + margin-bottom: 25px; + border-bottom: 2px solid transparent; + + &:hover{ + border-bottom: 2px solid kt-state-color(brand, base); + color: kt-base-color(label, 4); + } + + &.active{ + border-bottom: 2px solid kt-state-color(brand, base); + color: kt-state-color(brand, base); + } + } + } + } + } + + &--wave{ + @include wave(important); + + &:after{ + bottom:25%; + transform: rotate(45deg); + } + } +} + +@include kt-tablet-and-mobile(){ + + .kt-sc-2{ + min-height: auto; + + .kt-sc__bg{ + opacity: 0.2; + } + + .kt-sc__top{ + min-height: auto; + + .kt-sc__content{ + padding: 4rem 0; + margin-right: 0; + min-height: auto; + + .kt-sc__form { + + .input-group{ + width: 100%; + } + } + } + } + } +} diff --git a/src/assets/sass/pages/support-center/license.scss b/src/assets/sass/pages/support-center/license.scss new file mode 100644 index 0000000..5ead124 --- /dev/null +++ b/src/assets/sass/pages/support-center/license.scss @@ -0,0 +1,42 @@ +// +// Support Center/License +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + + +// Base +.kt-sc-license { + background-position: center top; + background-size: cover; + background-repeat: no-repeat; + + .kt-sc__top{ + display: flex; + padding: 6rem 0 10rem; + align-items: center; + + .kt-sc__title { + margin-bottom: 0; + font-size: 1.85rem; + font-weight: 600; + color: kt-state-color(brand, inverse); + } + + .kt-sc__nav{ + margin: auto 0 auto auto; + + .kt-link{ + font-size: 1.3rem; + font-weight: 400; + } + } + } +} diff --git a/src/assets/sass/pages/todo/tasks.scss b/src/assets/sass/pages/todo/tasks.scss new file mode 100644 index 0000000..4cff46d --- /dev/null +++ b/src/assets/sass/pages/todo/tasks.scss @@ -0,0 +1,1288 @@ +// +// Page - Inbox +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +// Config for aside +$kt-todo-aside-config: ( + offcanvas: ( + layout: ( + self: ( + zindex: 1001, + width: 300px + ), + close: ( + size: 25px, + font-size: 1.4rem + ) + ), + skin: ( + overlay: ( + bg-color: rgba(#000000, 0.05) + ), + close: ( + bg-color: ( + default: kt-base-color(grey, 1), + hover: transparent + ), + icon-color: ( + default: kt-base-color(label, 2), + hover: kt-brand-color() + ) + ) + ) + ) +); + +$kt-todo-icon-color: #8e96b8; +$kt-todo-hover-bg: #f2f3f7; + +// Base +.kt-todo { + // Content + .kt-todo__content { + width: 100%; + } + + // Aside + .kt-todo__aside { + padding: 20px; + width: 275px; + + @include kt-desktop { + margin-right: kt-get($kt-page-padding, desktop); + } + + .kt-todo__nav { + .kt-nav { + .kt-nav__item { + margin-bottom: 0.5rem; + + .kt-nav__link-title { + padding-left: 1.9rem; + font-weight: 600; + color: kt-base-color(label, 4); + font-size: 1.1rem; + padding-left: 1.9rem; + font-weight: 600; + color: kt-base-color(label, 4); + font-size: 1.1rem; + } + + .kt-nav__link { + padding: 0.6rem 20px; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + i { + color: $kt-todo-icon-color; + } + + @include kt-svg-icon-color($kt-todo-icon-color); + + .kt-nav__link-icon { + text-align: center; + margin: 0 0.7rem 0 -0.23rem; + + &.kt-nav__link-icon--size { + font-size: 0.9rem; + color: #93a2dd; + } + } + + svg { + width: 20px; + height: 20px; + } + + g [fill] { + fill: #93a2dd; + } + + .kt-nav__link-text { + font-weight: 500; + color: kt-base-color(label, 3); + } + } + + &:last-child { + margin-bottom: 0; + + .kt-nav__link { + .kt-nav__link-icon { + font-size: 0.9rem; + } + } + } + + &.hover, + &.kt-nav__item--selected, + &.kt-nav__item--active { + + .kt-nav__link { + background-color: kt-base-color(grey, 1); + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + i { + color: kt-brand-color(); + } + + @include kt-svg-icon-color(kt-brand-color()); + + .kt-nav__link-text { + color: kt-brand-color(); + } + } + } + } + } + } + } + + // Header + .kt-todo__header { + padding: 13px 25px; + display: flex; + flex-wrap: wrap; + align-items: center; + width: 100%; + + .kt-todo__title { + margin: 0; + font-size: 1.4rem; + padding-right: 2rem; + font-weight: 600; + color: kt-base-color(label, 3); + } + + // Nav + .kt-todo__nav { + padding: 0; + flex-grow: 1; + margin-top: 0.2rem; + + .btn { + margin-right: 1rem; + } + + .kt-todo__link { + padding: 0.5rem 1.2rem; + font-weight: 500; + color: kt-base-color(label, 2); + + &:not(:first-child):not(:last-child) { + margin: 0 0.2rem; + } + + &:hover, + &.kt-todo__link--selected, + &.kt-todo__link--active { + background-color: kt-base-color(grey, 1); + color: kt-brand-color(); + + @include kt-rounded { + border-radius: $kt-border-radius; + } + } + + @include kt-rounded { + border-radius: $kt-border-radius; + } + } + } + + // Users + .kt-todo__users { + line-height: 0; + display: flex; + align-items: center; + + .kt-media { + position: relative; + z-index: 0; + + &:not(:first-child):not(:last-child) { + margin-left: -0.1rem; + } + } + } + + @include kt-tablet-and-mobile { + padding: 10px 15px; + } + } + + // Icon + .kt-todo__icon { + @include kt-btn-reset(); + display: flex; + justify-content: center; + align-items: center; + height: 35px; + width: 35px; + background-color: kt-base-color(grey, 1); + transition: all 0.3s ease; + cursor: pointer; + margin: 0; + border-radius: 0; + + i { + font-size: 1.1rem; + } + + &.kt-todo__icon--sm { + height: 26px; + width: 26px; + + i { + font-size: 0.8rem; + } + } + + &.kt-todo__icon--md { + height: 30px; + width: 30px; + + i { + font-size: 1rem; + } + } + + &.kt-todo__icon--light { + background-color: transparent; + } + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + i { + color: $kt-todo-icon-color; + } + + @include kt-svg-icon-color($kt-todo-icon-color); + + &.kt-todo__icon--active, + &:hover { + transition: all 0.3s ease; + background-color: kt-base-color(grey, 2); + + &.kt-todo__icon--light { + background-color: transparent; + } + + i { + color: kt-brand-color(); + } + + @include kt-svg-icon-color(kt-brand-color()); + } + + // Back + &.kt-todo__icon--back { + background-color: transparent; + + i { + color: $kt-todo-icon-color; + font-size: 1.5rem; + } + + @include kt-svg-icon-color($kt-todo-icon-color); + + svg { + height: 32px; + width: 32px; + } + + &:hover { + background-color: transparent; + + i { + color: kt-brand-color(); + } + + @include kt-svg-icon-color(kt-brand-color()); + } + } + } + + // List + .kt-todo__list { + display: none; + padding: 0; + + // Toolbar + .kt-todo__toolbar { + position: relative; + display: flex; + flex-grow: 1; + align-items: center; + justify-content: space-between; + flex-wrap: wrap; + padding: 17px 0; + + .kt-todo__actions { + display: flex; + align-items: center; + margin-right: 1rem; + + .kt-todo__check { + display: flex; + align-items: center; + + .kt-checkbox { + margin: 0; + padding-left: 0; + } + + .kt-todo__icon { + margin-left: 0; + } + } + + .kt-todo__panel { + display: none; + flex-wrap: wrap; + } + + .btn { + padding: 0.6rem 1rem; + } + + &.kt-todo__actions--expanded { + .kt-todo__panel { + display: flex; + } + } + + .kt-todo__icon { + margin-right: 0.5rem; + + &.kt-todo__icon--back { + margin-right: 2.5rem; + } + } + } + + .kt-todo__controls { + display: flex; + align-items: center; + margin: 0.4rem 0; + + .kt-todo__icon { + margin-left: 0.5rem; + } + + + .kt-todo__sort { + margin-left: 0.5rem; + } + + .kt-todo__pages { + .kt-todo__perpage { + color: kt-base-color(label, 2); + font-size: 1rem; + font-weight: 500; + margin-right: 1rem; + cursor: pointer; + transition: all 0.3s ease; + padding: 0.5rem 0; + + &:hover { + transition: all 0.3s ease; + color: kt-brand-color(); + } + } + } + } + + .kt-todo__sep { + display: flex; + height: 1rem; + width: 1rem; + } + + //kt-media-breakpoint(lg), + @include kt-media-below(1450px) { + position: static; + padding: 15px 0; + + .kt-todo__controls { + margin-bottom: 10px; + } + + &.kt-todo__toolbar--extended { + .kt-todo__actions { + order: 2; + margin-bottom: 10px; + justify-content: flex-first; + } + + .kt-todo__controls { + order: 2; + margin-bottom: 3px; + justify-content: flex-end; + } + } + } + } + + &.kt-todo__list--shown { + display: flex; + } + + // Body + .kt-todo__body { + .kt-todo__items { + padding: 0; + + .kt-todo__item { + display: flex; + padding: 12px kt-get($kt-portlet, space, desktop); + transition: all 0.3s ease; + cursor: pointer; + + .kt-todo__info { + display: flex; + + @include kt-hack-ie { + padding: 8px 0; + } + + @include kt-hack-ie { + min-width: 210px; + } + + .kt-todo__actions { + display: flex; + margin: 0.3rem 10px 0 0; + align-items: center; + + @include kt-hack-ie { + min-width: 70px; + } + + .kt-checkbox { + margin: 0; + padding: 0; + margin-right: 10px; + } + + .kt-todo__icon { + height: 22px; + width: 22px; + + i { + font-size: 1rem; + color: kt-base-color(grey, 2); + } + + &:hover { + i { + color: rgba(kt-state-color(warning), 0.5) !important; + } + } + + &.kt-todo__icon--on { + i { + color: kt-state-color(warning) !important; + } + } + } + } + + .kt-todo__sender { + display: flex; + align-items: center; + margin-right: 30px; + width: 175px; + + @include kt-hack-ie { + min-width: 175px; + } + + .kt-media { + margin-right: 10px; + min-width: 30px !important; + + span { + min-width: 30px !important; + } + } + + .kt-todo__author { + font-size: 1rem; + color: kt-base-color(label, 3); + font-weight: 500; + } + + @include kt-media-below(1400px) { + display: block; + width: 70px; + margin-right: 10px; + + .kt-todo__author { + display: block; + } + + .kt-media { + margin-bottom: 5px; + } + } + } + } + + .kt-todo__details { + flex-grow: 1; + margin-top: 5px; + + @include kt-hack-ie { + width: 0; + height: 0; + } + + .kt-todo__message { + .kt-todo__subject { + font-size: 1rem; + color: kt-base-color(label, 3); + font-weight: 600; + } + + .kt-todo__summary { + font-size: 1rem; + color: kt-base-color(label, 1); + font-weight: 400; + text-overflow: ellipsis; + } + } + + .kt-todo__labels { + display: flex; + margin-top: 5px; + + .kt-todo__label { + margin-right: 5px; + } + } + } + + .kt-todo__datetime { + font-size: 1rem; + color: kt-base-color(label, 1); + font-weight: 400; + margin-right: 1rem; + margin-top: 5px; + width: 85px; + text-align: right; + + @include kt-media-below(1400px) { + width: 70px; + } + } + + &:hover, + &.kt-todo__item--selected { + transition: all 0.3s ease; + background-color: $kt-todo-hover-bg; + + .kt-todo__info { + .kt-todo__actions { + .kt-todo__icon { + i { + font-size: 1rem; + color: kt-base-color(grey, 3); + } + } + } + } + } + + &.kt-todo__item--unread { + .kt-todo__sender { + .kt-todo__author { + color: kt-base-color(label, 4); + font-weight: 600; + } + } + + .kt-todo__details { + .kt-todo__message { + .kt-todo__subject { + color: kt-base-color(label, 3); + font-weight: 600; + } + } + } + + .kt-todo__datetime { + color: kt-base-color(label, 4); + font-weight: 600; + } + } + } + + // Item types + &[data-type="inbox"] { + .kt-todo__item[data-type="inbox"] { + display: flex; + } + } + + &[data-type="marked"] { + .kt-todo__item[data-type="marked"] { + display: flex; + } + } + + &[data-type="draft"] { + .kt-todo__item[data-type="draft"] { + display: flex; + } + } + + &[data-type="sent"] { + .kt-todo__item[data-type="sent"] { + display: flex; + } + } + + &[data-type="trash"] { + .kt-todo__item[data-type="trash"] { + display: flex; + } + } + } + } + + // Foot + .kt-todo__foot { + .kt-todo__toolbar { + float: right; + } + + padding: 0 kt-get($kt-portlet, space, desktop); + } + } + + // View + .kt-todo__view { + padding: 0; + + // Head + .kt-todo__head { + padding: 15px 0 0 0; + width: 100%; + + // toolbar + .kt-todo__toolbar { + cursor: pointer; + padding: 0; + width: 100%; + display: flex; + flex-wrap: wrap; + + .kt-todo__info { + display: flex; + align-items: center; + flex-grow: 1; + + .kt-media { + margin-right: 0.7rem; + } + + .kt-todo__name { + color: kt-base-color(label, 4); + font-weight: 600; + font-size: 1.1rem; + padding-right: 0.5rem; + + &:hover { + color: kt-brand-color(); + transition: all 0.3s ease; + } + } + } + + .kt-todo__details { + display: flex; + align-items: center; + flex-wrap: wrap; + padding: 0.5rem 0; + + .kt-todo__icon { + margin-right: 0.5rem; + font-size: 0.7rem; + color: kt-brand-color(); + } + + .kt-todo__desc { + color: kt-base-color(label, 2); + font-weight: 400; + font-size: 1rem; + } + + .btn { + padding: 0.6rem 1rem; + + &:last-child { + margin-left: 0.5rem; + } + } + } + + .kt-todo__actions { + display: flex; + align-items: center; + + .kt-todo__datetime { + color: kt-base-color(label, 1); + font-weight: 500; + font-size: 1rem; + margin-right: 1.5rem; + } + } + } + } + + // Shown + &.kt-todo__view--shown { + display: flex; + } + + // Body + .kt-todo__body { + .kt-todo__title { + color: kt-base-color(label, 4); + font-size: 1.5rem; + font-weight: 600; + margin-top: 1rem; + display: block; + + &:hover { + color: kt-brand-color(); + transition: all 0.3s ease; + } + } + + .kt-todo__actions { + display: flex; + align-items: center; + padding: 0.8rem 0 2rem 0; + + .kt-todo__section { + display: flex; + align-items: center; + + .kt-todo__cricle { + padding-right: 0.5rem; + font-size: 1.1rem; + } + + .kt-todo__text{ + color: kt-base-color(label, 1); + font-weight: 500; + } + + &:last-child { + padding-left: 1.5rem; + } + } + } + + .kt-todo__desc{ + padding-bottom: 1.5rem; + display: block; + color: kt-base-color(label, 1); + font-weight: 500; + } + + .kt-todo__leble { + display: block; + padding-top: 0.7rem; + + i { + padding-right: 0.5rem; + } + + a { + color: kt-base-color(label, 2); + font-weight: 500; + + &:hover { + color: kt-brand-color(); + transition: all 0.3s ease; + } + } + } + + .kt-todo__item { + padding-top: 3rem; + + &:last-child { + padding-top: 2rem; + } + + .kt-todo__box { + display: flex; + align-items: center; + + .kt-media { + margin-right: 1rem; + } + + .kt-todo__username { + flex-grow: 1; + color: kt-base-color(label, 3); + font-weight: 500; + + &:hover { + color: kt-brand-color(); + transition: all 0.3s ease; + } + } + + .kt-todo__date { + color: kt-base-color(label, 1); + font-weight: 500; + } + } + + .kt-todo__text { + padding-left: 3.3rem; + display: block; + color: kt-base-color(label, 1); + font-weight: 500; + } + } + } + } + + // Form + .kt-todo__form { + display: flex; + flex-direction: column; + box-shadow: 0px 0px 7px 0px rgba(0,0,0,0.1); + + .kt-todo__head { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding: 20px kt-get($kt-portlet, space, desktop) - 10px 20px kt-get($kt-portlet, space, desktop); + border-bottom: 1px solid kt-base-color(grey, 2); + + .kt-todo__title { + margin-right: 10px; + font-size: 1.2rem; + font-weight: 500; + color: kt-base-color(label, 3); + } + + .kt-todo__actions { + display: flex; + + .kt-todo__icon { + margin-left: 5px; + } + } + } + + .kt-todo__body { + padding: 0 0 10px 0; + + .kt-todo__to { + display: flex; + min-height: 50px; + align-items: center; + padding: 10px kt-get($kt-portlet, space, desktop); + + .kt-todo__wrapper { + display: flex; + flex-direction: column; + flex-grow: 1; + } + + .tagify { + border: 0 !important; + + .tagify__input { + border: 0 !important; + } + } + + .kt-todo__field { + display: flex; + align-items: center; + width: 100%; + padding: 0; + + &.kt-todo__field--cc, + &.kt-todo__field--bcc { + display: none; + margin-top: 5px; + } + + .kt-todo__label { + font-weight:400; + font-size: 1rem; + width: 40px; + min-width: 40px; + color: kt-base-color(label, 2); + } + + .kt-todo__input { + flex-grow: 1; + + input { + border: 0 !important; + box-shadow: none !important; + -moz-appearance: none !important; + -webkit-appearance: none !important; + } + + .form-control { + border: 0; + border-radius: 0; + padding-left: 0; + padding-right: 0; + + @include kt-input-placeholder(kt-base-color(label, 2)); + color: kt-base-color(label, 2); + } + } + + .kt-todo__tools { + display: flex; + align-items: center; + margin-left: 1rem; + + .kt-todo__tool { + font-size: 1rem; + color: kt-base-color(label, 1); + font-weight: 500; + margin-left: 10px; + cursor: pointer; + } + } + } + + &.kt-todo__to--cc { + .kt-todo__tools { + .kt-todo__tool:nth-child(1) { + display: none; + } + } + + .kt-todo__field.kt-todo__field--cc { + display: flex; + } + } + + &.kt-todo__to--bcc { + .kt-todo__tools { + .kt-todo__tool:nth-child(2) { + display: none; + } + } + + .kt-todo__field.kt-todo__field--bcc { + display: flex; + } + } + } + + .kt-todo__subject { + display: flex; + min-height: 50px; + align-items: center; + padding: 0 kt-get($kt-portlet, space, desktop); + border-top: 1px solid kt-base-color(grey, 2); + + .form-control { + border: 0; + border-radius: 0; + padding-left: 0; + padding-right: 0; + font-weight:400; + font-size: 1rem; + + @include kt-input-placeholder(kt-base-color(label, 2)); + color: kt-base-color(label, 2); + } + } + + .kt-todo__text { + padding: 10px kt-get($kt-portlet, space, desktop); + padding-bottom: 0; + font-weight: 400; + font-size: 1rem; + color: kt-base-color(label, 2); + } + + .ql-container.ql-snow { + border: 0; + padding: 0; + border-radius: 0; + + .ql-editor { + font-weight:400; + font-size: 1rem; + color: kt-base-color(label, 2); + padding: 15px kt-get($kt-portlet, space, desktop); + font-family: kt-get($kt-font-families, regular); + + &.ql-blank { + &:before { + left: kt-get($kt-portlet, space, desktop); + color: kt-base-color(label, 1); + font-weight: 400; + font-style: normal; + } + } + } + } + + .ql-toolbar.ql-snow { + display: flex; + height: 50px; + align-items: center; + border-radius: 0; + border: 0; + border-top: 1px solid kt-base-color(grey, 2); + border-bottom: 1px solid kt-base-color(grey, 2); + padding-left: 18px; + + .ql-picker-label { + &, + &:before { + font-weight:400; + font-size: 1rem; + color: kt-base-color(label, 2); + font-family: kt-get($kt-font-families, regular); + } + } + } + + .kt-todo__attachments { + min-width: 500px; + display: inline-block; + padding: 0 kt-get($kt-portlet, space, desktop); + } + } + + .kt-todo__foot { + display: flex; + flex-wrap: wrap; + align-items: center; + width: 100%; + padding: 20px kt-get($kt-portlet, space, desktop) - 10px 20px kt-get($kt-portlet, space, desktop); + border-top: 1px solid kt-base-color(grey, 2); + + .kt-todo__primary { + display: flex; + flex-grow: 1; + align-items: center; + + .btn-group { + .btn { + &:nth-child(1) { + padding-left: 20px; + padding-right: 20px; + } + + &:nth-child(2) { + padding-left: 6px; + padding-right: 9px; + } + } + } + + .kt-todo__panel { + display: flex; + align-items: center; + margin-left: 1rem; + } + } + + .kt-todo__secondary { + display: flex; + align-items: center; + margin: 0; + } + } + } + + // Portlet head + .kt-portlet__head { + min-height: 80px !important; + padding: 10px kt-get($kt-portlet, space, desktop); + } +} + +// Tablet and mobile mode +@include kt-tablet-and-mobile { + // Inbox + .kt-todo { + display: flex; + flex-wrap: wrap; + padding: 0; + + // Aside + .kt-todo__aside { + background: #fff; + margin: 0; + + .kt-todo__nav { + .kt-nav { + .kt-nav__item { + .kt-nav__link-title { + padding-left: 1.2rem; + } + + .kt-nav__link { + padding: 0.75rem 10px; + } + } + } + } + } + + // List + .kt-todo__list { + .kt-todo__items { + overflow: auto; + + .kt-todo__item { + min-width: 500px; + //flex-wrap: wrap; + padding: 10px kt-get($kt-portlet, space, mobile); + margin-bottom: 15px; + } + } + + // Portlet head + .kt-portlet__head { + min-height: 60px !important; + padding: 10px kt-get($kt-portlet, space, mobile); + } + + // Foot + .kt-todo__foot { + padding: 0 kt-get($kt-portlet, space, mobile); + } + } + + // View + .kt-todo__view { + .kt-todo__subject { + padding: 10px kt-get($kt-portlet, space, mobile); + + .kt-todo__title { + display: block; + + .kt-todo__text { + display: inline; + } + } + } + + .kt-todo__messages { + padding: 10px kt-get($kt-portlet, space, mobile); + + .kt-todo__message { + padding: 0 10px 5px 10px; + margin-bottom: 15px; + + .kt-todo__head { + .kt-media { + span { + width: 26px; + height: 26px; + } + } + + .kt-todo__info { + .kt-todo__details { + .kt-todo__desc { + display: none; + } + } + } + } + } + } + + .kt-todo__reply { + padding: 10px kt-get($kt-portlet, space, mobile); + overflow: auto; + } + } + + // Portlet head + .kt-portlet__head { + min-height: 60px !important; + padding: 10px kt-get($kt-portlet, space, mobile); + } + } +} + +// Mobile mode +@include kt-mobile { + // Inbox + .kt-todo { + // Toolbar + .kt-todo__head { + padding: 13px; + + // Nav + .kt-todo__nav { + .btn { + margin-right: 0.2rem; + } + } + } + + // View + .kt-todo__view { + .kt-todo__messages { + .kt-todo__message { + .kt-todo__head { + flex-wrap: wrap; + + .kt-media { + + } + + .kt-todo__info { + + } + + .kt-todo__actions { + flex-grow: 1; + justify-content: space-between; + } + } + } + } + + .kt-todo__reply { + padding: 10px kt-get($kt-portlet, space, mobile); + } + } + } +} +// Aside offcanvas +@include kt-offcanvas-build(kt-todo__aside, tablet-and-mobile, kt-get($kt-todo-aside-config, offcanvas) ); diff --git a/src/assets/sass/pages/todo/todo.scss b/src/assets/sass/pages/todo/todo.scss new file mode 100644 index 0000000..b71bed5 --- /dev/null +++ b/src/assets/sass/pages/todo/todo.scss @@ -0,0 +1,1146 @@ +// +// Page - Inbox +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +// Config for aside +$kt-todo-aside-config: ( + offcanvas: ( + layout: ( + self: ( + zindex: 1001, + width: 300px + ), + close: ( + size: 25px, + font-size: 1.4rem + ) + ), + skin: ( + overlay: ( + bg-color: rgba(#000000, 0.05) + ), + close: ( + bg-color: ( + default: kt-base-color(grey, 1), + hover: transparent + ), + icon-color: ( + default: kt-base-color(label, 2), + hover: kt-brand-color() + ) + ) + ) + ) +); + +$kt-todo-icon-color: #8e96b8; +$kt-todo-hover-bg: #f2f3f7; + +// Base +.kt-todo { + // Content + .kt-todo__content { + width: 100%; + } + + // Aside + .kt-todo__aside { + padding: 20px; + width: 275px; + + @include kt-desktop { + margin-right: kt-get($kt-page-padding, desktop); + } + + .kt-todo__nav { + .kt-nav { + .kt-nav__item { + margin-bottom: 0.5rem; + + .kt-nav__link-title { + padding-left: 1.9rem; + font-weight: 600; + color: kt-base-color(label, 4); + font-size: 1.1rem; + padding-left: 1.9rem; + font-weight: 600; + color: kt-base-color(label, 4); + font-size: 1.1rem; + } + + .kt-nav__link { + padding: 0.6rem 20px; + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + i { + color: $kt-todo-icon-color; + } + + @include kt-svg-icon-color($kt-todo-icon-color); + + .kt-nav__link-icon { + text-align: center; + margin: 0 0.7rem 0 -0.23rem; + + &.kt-nav__link-icon--size { + font-size: 0.9rem; + color: #93a2dd; + } + + svg { + width: 20px; + height: 20px; + } + + g [fill] { + fill: #93a2dd; + } + } + + .kt-nav__link-text { + font-weight: 500; + color: kt-base-color(label, 3); + } + } + + &:last-child { + margin-bottom: 0; + + .kt-nav__link { + .kt-nav__link-icon { + font-size: 0.9rem; + } + } + } + + &.hover, + &.kt-nav__item--selected, + &.kt-nav__item--active { + + .kt-nav__link { + background-color: kt-base-color(grey, 1); + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + i { + color: kt-brand-color(); + } + + @include kt-svg-icon-color(kt-brand-color()); + + .kt-nav__link-text { + color: kt-brand-color(); + } + } + } + } + } + } + } + + // Header + .kt-todo__header { + padding: 13px 25px; + display: flex; + flex-wrap: wrap; + align-items: center; + width: 100%; + + .kt-todo__title { + margin: 0; + font-size: 1.4rem; + padding-right: 2rem; + font-weight: 600; + color: kt-base-color(label, 3); + } + + // Nav + .kt-todo__nav { + padding: 0; + flex-grow: 1; + margin-top: 0.2rem; + + .btn { + margin-right: 1rem; + } + + .kt-todo__link { + padding: 0.5rem 1.2rem; + font-weight: 500; + color: kt-base-color(label, 2); + + &:not(:first-child):not(:last-child) { + margin: 0 0.2rem; + } + + &:hover, + &.kt-todo__link--selected, + &.kt-todo__link--active { + background-color: kt-base-color(grey, 1); + color: kt-brand-color(); + + @include kt-rounded { + border-radius: $kt-border-radius; + } + } + + @include kt-rounded { + border-radius: $kt-border-radius; + } + } + } + + // Users + .kt-todo__users { + line-height: 0; + display: flex; + align-items: center; + + .kt-media { + position: relative; + z-index: 0; + + &:not(:first-child):not(:last-child) { + margin-left: -0.1rem; + } + } + } + + @include kt-tablet-and-mobile { + padding: 10px 15px; + } + } + + // Icon + .kt-todo__icon { + @include kt-btn-reset(); + display: flex; + justify-content: center; + align-items: center; + height: 35px; + width: 35px; + background-color: kt-base-color(grey, 1); + transition: all 0.3s ease; + cursor: pointer; + margin: 0; + border-radius: 0; + + i { + font-size: 1.1rem; + } + + &.kt-todo__icon--sm { + height: 26px; + width: 26px; + + i { + font-size: 0.8rem; + } + } + + &.kt-todo__icon--md { + height: 30px; + width: 30px; + + i { + font-size: 1rem; + } + } + + &.kt-todo__icon--light { + background-color: transparent; + } + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + i { + color: $kt-todo-icon-color; + } + + @include kt-svg-icon-color($kt-todo-icon-color); + + &.kt-todo__icon--active, + &:hover { + transition: all 0.3s ease; + background-color: kt-base-color(grey, 2); + + &.kt-todo__icon--light { + background-color: transparent; + } + + i { + color: kt-brand-color(); + } + + @include kt-svg-icon-color(kt-brand-color()); + } + + // Back + &.kt-todo__icon--back { + background-color: transparent; + + i { + color: $kt-todo-icon-color; + font-size: 1.5rem; + } + + @include kt-svg-icon-color($kt-todo-icon-color); + + svg { + height: 32px; + width: 32px; + } + + &:hover { + background-color: transparent; + + i { + color: kt-brand-color(); + } + + @include kt-svg-icon-color(kt-brand-color()); + } + } + } + + // List + .kt-todo__list { + display: flex !important; + padding: 0; + + // Head + .kt-todo__head { + // Toolbar + .kt-todo__toolbar { + position: relative; + display: flex; + flex-grow: 1; + align-items: center; + justify-content: space-between; + flex-wrap: wrap; + padding: 0 kt-get($kt-portlet, space, desktop); + + .kt-todo__actions { + display: flex; + align-items: center; + margin-right: 1rem; + + .kt-todo__check { + display: flex; + align-items: center; + + .kt-checkbox { + margin: 0; + padding-left: 0; + } + + .kt-todo__icon { + margin-left: 0; + } + } + + .kt-todo__panel { + display: none; + flex-wrap: wrap; + } + + .btn { + padding: 0.6rem 1rem; + } + + &.kt-todo__actions--expanded { + .kt-todo__panel { + display: flex; + } + } + + .kt-todo__icon { + margin-right: 0.5rem; + + &.kt-todo__icon--back { + margin-right: 2.5rem; + } + } + } + + .kt-todo__controls { + display: flex; + align-items: center; + margin: 0.4rem 0; + + .kt-todo__icon { + margin-left: 0.5rem; + } + + + .kt-todo__sort { + margin-left: 0.5rem; + } + + .kt-todo__pages { + .kt-todo__perpage { + color: kt-base-color(label, 2); + font-size: 1rem; + font-weight: 500; + margin-right: 1rem; + cursor: pointer; + transition: all 0.3s ease; + padding: 0.5rem 0; + + &:hover { + transition: all 0.3s ease; + color: kt-brand-color(); + } + } + } + } + + .kt-todo__sep { + display: flex; + height: 1rem; + width: 1rem; + } + } + } + + // Body + .kt-todo__body { + padding: 20px 0 0 0 ; + + .kt-todo__items { + padding: 0; + margin-bottom: 15px; + + .kt-todo__item { + display: flex; + align-items: flex-start; + padding: 12px kt-get($kt-portlet, space, desktop); + transition: all 0.3s ease; + cursor: pointer; + + .kt-todo__info { + display: flex; + + @include kt-hack-ie { + padding: 8px 0; + } + + @include kt-hack-ie { + min-width: 210px; + } + + .kt-todo__actions { + display: flex; + margin: 0.3rem 10px 0 0; + align-items: center; + + @include kt-hack-ie { + min-width: 70px; + } + + .kt-checkbox { + margin: 0; + padding: 0; + margin-right: 10px; + } + + .kt-todo__icon { + height: 22px; + width: 22px; + + i { + font-size: 1rem; + color: kt-base-color(grey, 2); + } + + &:hover { + i { + color: rgba(kt-state-color(warning), 0.5) !important; + } + } + + &.kt-todo__icon--on { + i { + color: kt-state-color(warning) !important; + } + } + } + } + + .kt-todo__sender { + display: flex; + align-items: center; + margin-right: 30px; + width: 175px; + + @include kt-hack-ie { + min-width: 175px; + } + + .kt-media { + margin-right: 10px; + min-width: 30px !important; + + span { + min-width: 30px !important; + } + } + + .kt-todo__author { + font-size: 1rem; + color: kt-base-color(label, 3); + font-weight: 500; + } + + @include kt-media-below(1400px) { + display: block; + width: 70px; + margin-right: 10px; + + .kt-todo__author { + display: block; + } + + .kt-media { + margin-bottom: 5px; + } + } + } + } + + .kt-todo__details { + flex-grow: 1; + margin-top: 5px; + + @include kt-hack-ie { + width: 0; + height: 0; + } + + .kt-todo__message { + .kt-todo__subject { + font-size: 1rem; + color: kt-base-color(label, 3); + font-weight: 500; + } + + .kt-todo__summary { + font-size: 1rem; + color: kt-base-color(label, 1); + font-weight: 400; + text-overflow: ellipsis; + } + } + + .kt-todo__labels { + display: flex; + margin-top: 5px; + + .kt-todo__label { + margin-right: 5px; + } + } + } + + .kt-todo__datetime { + font-size: 1rem; + color: kt-base-color(label, 1); + font-weight: 400; + margin-right: 1rem; + margin-top: 5px; + width: 85px; + text-align: right; + + @include kt-media-below(1400px) { + width: 70px; + } + } + + &:hover, + &.kt-todo__item--selected { + transition: all 0.3s ease; + background-color: kt-base-color(grey, 1); + + .kt-todo__info { + .kt-todo__actions { + .kt-todo__icon { + i { + font-size: 1rem; + color: kt-base-color(grey, 3); + } + } + } + } + } + + &.kt-todo__item--unread { + .kt-todo__sender { + .kt-todo__author { + color: kt-base-color(label, 4); + font-weight: 600; + } + } + + .kt-todo__details { + .kt-todo__message { + .kt-todo__subject { + color: kt-base-color(label, 3); + font-weight: 600; + } + } + } + + .kt-todo__datetime { + color: kt-base-color(label, 4); + font-weight: 600; + } + } + } + } + } + + // Foot + .kt-todo__foot { + margin-top: 10px; + + .kt-todo__toolbar { + float: right; + + .kt-todo__controls { + display: flex; + align-items: center; + margin-left: 1rem; + + .kt-todo__icon { + margin-left: 0.5rem; + } + + .kt-todo__sort { + margin-left: 0.5rem; + } + + .kt-todo__pages { + margin-left: 0.5rem; + + .kt-todo__perpage { + color: kt-base-color(label, 2); + font-size: 1rem; + font-weight: 500; + margin-right: 1rem; + cursor: pointer; + transition: all 0.3s ease; + padding: 0.5rem 0; + + &:hover { + transition: all 0.3s ease; + color: kt-brand-color(); + } + } + } + } + } + + padding: 0 kt-get($kt-portlet, space, desktop); + } + } + + // View + .kt-todo__view { + padding: 0; + display: flex !important; + + // Wrapper + .kt-todo__wrapper { + display: flex; + justify-content: space-between; + flex-direction: column; + height: 100%; + padding-bottom: kt-get($kt-portlet, space, desktop); + + @include kt-tablet-and-mobile { + padding-bottom: kt-get($kt-portlet, space, mobile); + } + + // Head + .kt-todo__head { + width: 100%; + + // toolbar + .kt-todo__toolbar { + cursor: pointer; + padding-top: 0.9rem; + width: 100%; + display: flex; + flex-wrap: wrap; + + // hide the back button on desktop + .kt-todo__icon.kt-todo__icon--back { + display: none; + } + + .kt-todo__info { + display: flex; + align-items: center; + flex-grow: 1; + + .kt-media { + margin-right: 0.7rem; + } + + .kt-todo__name { + color: kt-base-color(label, 4); + font-weight: 600; + font-size: 1.1rem; + padding-right: 0.5rem; + + &:hover { + color: kt-brand-color(); + transition: all 0.3s ease; + } + } + } + + .kt-todo__details { + display: flex; + align-items: center; + flex-wrap: wrap; + padding: 0.5rem 0; + + .kt-todo__icon { + margin: 0.4rem 0.5rem 0.4rem 0; + font-size: 0.7rem; + color: kt-brand-color(); + } + + .kt-todo__desc { + color: kt-base-color(label, 2); + font-weight: 400; + font-size: 1rem; + } + + .btn { + padding: 8px 1rem; + + &:last-child { + margin-left: 0.5rem; + } + } + } + + .kt-todo__actions { + display: flex; + align-items: center; + + .kt-todo__datetime { + color: kt-base-color(label, 1); + font-weight: 500; + font-size: 1rem; + margin-right: 1.5rem; + } + } + } + } + + // Body + .kt-todo__body { + padding-bottom: kt-get($kt-portlet, space, desktop); + flex-grow: 1; + + .kt-todo__title { + padding-top: 1rem; + + .kt-todo__text { + color: kt-base-color(label, 4); + font-size: 1.5rem; + font-weight: 600; + margin-top: 1rem; + display: block; + } + + .kt-todo__labels { + display: flex; + align-items: center; + padding: 0.8rem 0 2rem 0; + + .kt-todo__label { + display: flex; + align-items: center; + + .kt-todo__dot { + padding-right: 0.5rem; + font-size: 1.2rem; + } + + .kt-todo__text{ + color: kt-base-color(label, 1); + font-weight: 500; + font-size: 1rem; + margin: 0; + } + + &:last-child { + padding-left: 1.5rem; + } + } + } + + &:hover { + color: kt-brand-color(); + transition: all 0.3s ease; + } + } + + .kt-todo__desc{ + padding-bottom: 10px; + display: block; + color: kt-base-color(label, 1); + font-weight: 500; + } + + .kt-todo__files { + padding-top: 10px; + + .kt-todo__file { + display: block; + padding-top: 0.7rem; + + i { + padding-right: 0.5rem; + } + + a { + color: kt-base-color(label, 2); + font-weight: 500; + + &:hover { + color: kt-brand-color(); + transition: all 0.3s ease; + } + } + } + } + + .kt-todo__comments { + padding-bottom: 20px; + + .kt-todo__comment { + padding-top: 3rem; + + &:last-child { + padding-top: 2rem; + } + + .kt-todo__box { + display: flex; + align-items: center; + + .kt-media { + margin-right: 1rem; + } + + .kt-todo__username { + flex-grow: 1; + color: kt-base-color(label, 3); + font-weight: 500; + + &:hover { + color: kt-brand-color(); + transition: all 0.3s ease; + } + } + + .kt-todo__date { + color: kt-base-color(label, 1); + font-weight: 500; + } + } + + .kt-todo__text { + padding-left: 3.3rem; + display: block; + color: kt-base-color(label, 1); + font-weight: 500; + } + } + } + } + + // Foot + .kt-todo__foot { + .kt-todo__form { + margin-top: 20px; + display: flex; + flex-direction: column; + border: 1px solid kt-base-color(grey, 2); + + @include kt-rounded { + border-radius: $kt-border-radius; + } + + .kt-todo__head { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding: 20px kt-get($kt-portlet, space, desktop) - 10px 20px kt-get($kt-portlet, space, desktop); + border-bottom: 1px solid kt-base-color(grey, 2); + + .kt-todo__title { + margin-right: 10px; + font-size: 1.2rem; + font-weight: 500; + color: kt-base-color(label, 3); + } + + .kt-todo__actions { + display: flex; + + .kt-todo__icon { + margin-left: 5px; + } + } + } + + .kt-todo__body { + padding: 0 0 10px 0; + + .ql-container.ql-snow { + border: 0; + padding: 0; + border-radius: 0; + + .ql-editor { + font-weight:400; + font-size: 1rem; + color: kt-base-color(label, 2); + padding: 15px kt-get($kt-portlet, space, desktop); + font-family: kt-get($kt-font-families, regular); + + &.ql-blank { + &:before { + left: kt-get($kt-portlet, space, desktop); + color: kt-base-color(label, 1); + font-weight: 400; + font-style: normal; + } + } + } + } + + .ql-toolbar.ql-snow { + display: flex; + height: 50px; + align-items: center; + border-radius: 0; + border: 0; + border-top: 0; + border-bottom: 1px solid kt-base-color(grey, 2); + padding-left: 18px; + + .ql-picker-label { + &, + &:before { + font-weight:400; + font-size: 1rem; + color: kt-base-color(label, 2); + font-family: kt-get($kt-font-families, regular); + } + } + } + + .kt-todo__attachments { + + @include kt-tablet-and-mobile { + width: 100%; + } + + display: inline-block; + padding: 0 kt-get($kt-portlet, space, desktop); + } + } + + .kt-todo__foot { + display: flex; + flex-wrap: wrap; + align-items: center; + width: 100%; + padding: 20px kt-get($kt-portlet, space, desktop) - 10px 20px kt-get($kt-portlet, space, desktop); + //border-top: 1px solid kt-base-color(grey, 2); + + .kt-todo__primary { + display: flex; + flex-grow: 1; + align-items: center; + + .btn-group { + .btn { + &:nth-child(1) { + padding-left: 20px; + padding-right: 20px; + } + + &:nth-child(2) { + padding-left: 6px; + padding-right: 9px; + } + } + } + + .kt-todo__panel { + display: flex; + align-items: center; + margin-left: 1rem; + } + } + + .kt-todo__secondary { + display: flex; + align-items: center; + margin: 0; + } + } + } + } + } + } + + // Portlet head + .kt-portlet__head { + min-height: 80px !important; + padding: 10px kt-get($kt-portlet, space, desktop); + } +} + +// Tablet and mobile mode +@include kt-tablet-and-mobile { + // Inbox + .kt-todo { + display: flex; + flex-wrap: wrap; + padding: 0; + + // Aside + .kt-todo__aside { + background: #fff; + margin: 0; + + .kt-todo__nav { + .kt-nav { + .kt-nav__item { + .kt-nav__link-title { + padding-left: 1.2rem; + } + + .kt-nav__link { + padding: 0.75rem 10px; + } + } + } + } + } + + // List + .kt-todo__list { + display: flex; + + &.kt-todo__list--hidden { + display: none; + } + + // Portlet head + .kt-portlet__head { + min-height: 60px !important; + padding: 10px kt-get($kt-portlet, space, mobile); + } + + // Head + .kt-todo__head { + padding: 0; + + // Toolbar + .kt-todo__toolbar { + padding: 10px kt-get($kt-portlet, space, mobile); + } + } + + // Body + .kt-todo__body { + .kt-todo__items { + overflow: auto; + margin-bottom: 15px; + + .kt-todo__item { + min-width: 500px; + padding: 10px kt-get($kt-portlet, space, mobile); + } + } + } + + // Foot + .kt-todo__foot { + padding: 0 kt-get($kt-portlet, space, mobile); + } + } + + // View + .kt-todo__view { + display: none; + + // Head + .kt-todo__head { + // toolbar + .kt-todo__toolbar { + // show the back button on desktop + .kt-todo__icon.kt-todo__icon--back { + display: flex; + } + } + } + + // Shown + &.kt-todo__view--shown { + display: flex; + } + } + + // Portlet head + .kt-portlet__head { + min-height: 60px !important; + padding: 10px kt-get($kt-portlet, space, mobile); + } + } +} + +// Mobile mode +@include kt-mobile { + // Inbox + .kt-todo { + // Toolbar + .kt-todo__head { + // Nav + .kt-todo__nav { + .btn { + margin-right: 0.2rem; + } + } + } + } +} +// Aside offcanvas +@include kt-offcanvas-build(kt-todo__aside, tablet-and-mobile, kt-get($kt-todo-aside-config, offcanvas) ); diff --git a/src/assets/sass/pages/wizard/wizard-1.scss b/src/assets/sass/pages/wizard/wizard-1.scss new file mode 100644 index 0000000..d6d87aa --- /dev/null +++ b/src/assets/sass/pages/wizard/wizard-1.scss @@ -0,0 +1,338 @@ +// +// Wizard v1 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +// Variables +$kt-wizard-v1-step-label: kt-base-color(label, 2); +$kt-wizard-v1-step-icon: kt-base-color(label, 1); +$kt-wizard-v1-step-highlight: kt-brand-color(); +$kt-wizard-v1-step-border: #eeeef4; +$kt-wizard-v1-form-bg: #f9fafc; +$kt-wizard-v1-form-inner-bg: #ffffff; + +// General mode +.kt-wizard-v1 { + flex-direction: column; + // Nav + .kt-wizard-v1__nav { + border-bottom: 1px solid $kt-wizard-v1-step-border; + + .kt-wizard-v1__nav-items{ + display: flex; + align-items: center; + justify-content: center; + width: 70%; + margin: 0 auto; + + .kt-wizard-v1__nav-item { + display: flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; + flex: 1; + + &:after { + @include kt-flaticon2-icon(kt-get($kt-action-bold-icons, right)); + font-size: 1.25rem; + color: $kt-wizard-v1-step-icon; + margin-left: 0.5rem; + margin-right: 0.5rem; + } + + &:last-child{ + &:after{ + content: none; + } + } + + .kt-wizard-v1__nav-body { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 2rem 1rem; + text-align: center; + + .kt-wizard-v1__nav-icon{ + font-size: 3.7rem; + color: $kt-wizard-v1-step-icon; + margin-bottom: 0.5rem; + + @include kt-svg-icon-color($kt-wizard-v1-step-icon); + } + + .kt-wizard-v1__nav-label{ + font-size: 1.1rem; + font-weight: 500; + color: $kt-wizard-v1-step-label; + } + } + + &[data-ktwizard-state="done"], + &[data-ktwizard-state="current"] { + &:after{ + color: $kt-wizard-v1-step-highlight; + } + + .kt-wizard-v1__nav-body{ + .kt-wizard-v1__nav-icon{ + color: $kt-wizard-v1-step-highlight; + + @include kt-svg-icon-color($kt-wizard-v1-step-highlight); + } + + .kt-wizard-v1__nav-label{ + color: $kt-wizard-v1-step-highlight; + } + } + } + } + + &.kt-wizard-v1__nav-items--clickable { + .kt-wizard-v1__nav-item { + cursor: pointer; + } + } + + @include kt-minimal-desktop-and-below{ + width: 100%; + } + + @include kt-mobile{ + flex-direction: column; + align-items: flex-start; + padding: 2rem 0; + + .kt-wizard-v1__nav-item{ + flex: 0 0 100%; + position: relative; + width: 100%; + + &:after{ + position: absolute; + right: 2rem; + } + + &:last-child{ + + &:after{ + content: "\f105"; + font-family: "Font Awesome 5 Free"; + font-weight: 900; + font-size: 2rem; + color: $kt-wizard-v1-step-icon; + } + } + + .kt-wizard-v1__nav-body{ + flex-direction: row; + justify-content: flex-start; + flex: 0 0 100%; + padding: 0.5rem 2rem; + + .kt-wizard-v1__nav-icon{ + font-size: 1.5rem; + margin-right: 1rem; + margin-bottom: 0; + } + } + } + } + } + } + + .kt-wizard-v1__wrapper{ + display: flex; + justify-content: center; + background-color: $kt-wizard-v1-form-bg; + + .kt-form { + width: 60%; + padding: 4rem 0 5rem; + + .kt-wizard-v1__content{ + padding-bottom: 2rem; + margin-bottom: 2rem; + border-bottom: 1px solid $kt-wizard-v1-step-border; + + .kt-wizard-v1__form{ + margin-top: 3rem; + } + + .kt-wizard-v1__review{ + + .kt-wizard-v1__review-item{ + padding-bottom: 1rem; + margin-bottom: 1rem; + border-bottom: 1px solid $kt-wizard-v1-step-border; + + .kt-wizard-v1__review-title{ + font-weight: 600; + font-size: 1.1rem; + margin-bottom: 0.7rem; + } + + .kt-wizard-v1__review-content{ + line-height: 1.8rem; + } + + &:last-child{ + border-bottom: none; + margin-bottom: 0; + padding-bottom: 0; + } + } + } + } + + .kt-form__actions{ + display: flex; + flex-direction: row; + justify-content: space-between; + + @include kt-mobile-sm{ + flex-wrap: wrap; + justify-content: center; + } + + .btn{ + @include kt-mobile-sm{ + margin: 0 0.5rem 1rem; + } + } + + [data-ktwizard-type="action-prev"]{ + margin-right:auto; + + @include kt-mobile-sm{ + margin-right:0.5rem; + } + } + + [data-ktwizard-type="action-next"]{ + margin: auto 0 auto auto; + + @include kt-mobile-sm{ + margin: 0 0 1rem; + } + } + } + } + + @include kt-mobile{ + padding: 2rem; + + .kt-form{ + width: 100%; + padding: 2rem 1rem 4rem; + } + } + } + + &.kt-wizard-v1--white { + .kt-wizard-v1__wrapper{ + background-color: $kt-wizard-v1-form-inner-bg; + } + } + + // Step + [data-ktwizard-type="step"] { + &[data-ktwizard-state="current"] { + + } + + &[data-ktwizard-state="done"] { + + } + + &[data-ktwizard-state="pending"] { + + } + } + + // Step info + [data-ktwizard-type="step-info"] { + display: none; + + &[data-ktwizard-state="current"] { + display: block; + } + } + + // Content states + [data-ktwizard-type="step-content"] { + display: none; + + &[data-ktwizard-state="current"] { + display: block; + } + } + + + // Action buttons states + & { + [data-ktwizard-type="action-prev"]{ + display: none; + } + + [data-ktwizard-type="action-next"]{ + display: inline-block; + } + + [data-ktwizard-type="action-submit"]{ + display: none; + } + } + + &[data-ktwizard-state="first"] { + [data-ktwizard-type="action-prev"]{ + display: none; + } + + [data-ktwizard-type="action-next"]{ + display: inline-block; + } + + [data-ktwizard-type="action-submit"]{ + display: none; + } + } + + &[data-ktwizard-state="between"] { + [data-ktwizard-type="action-prev"]{ + display: inline-block; + } + + [data-ktwizard-type="action-next"]{ + display: inline-block; + } + + [data-ktwizard-type="action-submit"]{ + display: none; + } + } + + &[data-ktwizard-state="last"] { + [data-ktwizard-type="action-prev"]{ + display: inline-block; + } + + [data-ktwizard-type="action-next"]{ + display: none; + } + + [data-ktwizard-type="action-submit"]{ + display: inline-block; + } + } +} diff --git a/src/assets/sass/pages/wizard/wizard-2.scss b/src/assets/sass/pages/wizard/wizard-2.scss new file mode 100644 index 0000000..820f1ab --- /dev/null +++ b/src/assets/sass/pages/wizard/wizard-2.scss @@ -0,0 +1,332 @@ +// +// Wizard v2 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +// Variables +$kt-wizard-v2-step-label: #50566a; +$kt-wizard-v2-step-icon: #959cb6; +$kt-wizard-v2-step-highlight: kt-brand-color(); +$kt-wizard-v2-step-border: #eeeef4; +$kt-wizard-v2-nav-bg: #f4f6f9; +$kt-wizard-v2-form-inner-bg: #ffffff; + +// General mode +.kt-wizard-v2 { + display: flex; + + @include kt-mobile{ + flex-direction: column; + } + // Nav + .kt-wizard-v2__aside{ + flex: 0 0 400px; + display: flex; + width: 400px; + border-right: 1px solid #eeeef4; + padding: 4.5rem 2.5rem 4.5rem 1.5rem; + + .kt-wizard-v2__nav { + width: 100%; + + .kt-wizard-v2__nav-items{ + display: flex; + flex-direction: column; + justify-content: center; + + .kt-wizard-v2__nav-item{ + padding: 0.75rem 1.5rem; + position: relative; + border-radius: 0.5rem; + + .kt-wizard-v2__nav-body{ + display: flex; + + .kt-wizard-v2__nav-icon{ + font-size: 2.5rem; + margin-right: 1.1rem; + color: $kt-wizard-v2-step-icon; + } + + .kt-wizard-v2__nav-label{ + display: flex; + flex-direction: column; + justify-content: center; + + .kt-wizard-v2__nav-label-title{ + color: $kt-wizard-v2-step-label; + font-weight: 500; + font-size: 1.1rem; + } + + .kt-wizard-v2__nav-label-desc{ + color: $kt-wizard-v2-step-icon; + } + } + } + + &[data-ktwizard-state="current"]{ + background-color: $kt-wizard-v2-nav-bg; + + .kt-wizard-v2__nav-icon{ + color: $kt-wizard-v2-step-highlight; + } + + &:after{ + left: 100%; + top: 50%; + transform: translateY(-50%); + content: " "; + height: 0; + width: 0; + border: solid transparent; + position: absolute; + border-left-color: $kt-wizard-v2-nav-bg; + border-width: 1rem; + } + } + } + + &.kt-wizard-v2__nav-items--clickable { + .kt-wizard-v2__nav-item { + cursor: pointer; + } + } + } + } + + @include kt-mobile{ + padding: 1rem; + flex: 0 0 100%; + width: 100%; + + .kt-wizard-v2__nav { + + .kt-wizard-v2__nav-items{ + + .kt-wizard-v2__nav-item{ + + &[data-ktwizard-state="current"]{ + + &:after{ + content: none; + } + } + } + } + } + } + } + + // forms + .kt-wizard-v2__wrapper{ + background-color: $kt-wizard-v2-nav-bg; + width: 100%; + + .kt-form { + width: 80%; + padding: 4rem 6rem 6rem; + + @include kt-minimal-desktop-and-below{ + width: 100%; + } + + @include kt-mobile{ + padding: 2rem 2.5rem 4rem; + } + + .kt-wizard-v2__content{ + padding-bottom: 1.3rem; + border-bottom: 1px solid #eeeef4; + margin-bottom: 2rem; + + .kt-wizard-v2__review{ + + .kt-wizard-v2__review-item{ + padding-bottom: 1rem; + margin-bottom: 1rem; + border-bottom: 1px solid $kt-wizard-v2-step-border; + + .kt-wizard-v2__review-title{ + font-weight: 600; + font-size: 1.1rem; + margin-bottom: 0.7rem; + } + + .kt-wizard-v2__review-content{ + line-height: 1.8rem; + } + + &:last-child{ + border-bottom: none; + margin-bottom: 0; + padding-bottom: 0; + } + } + } + } + + .kt-form__actions{ + display: flex; + flex-direction: row; + justify-content: space-between; + + @include kt-mobile-sm{ + flex-wrap: wrap; + justify-content: center; + } + + .btn{ + @include kt-mobile-sm{ + margin: 0 0.5rem 1rem; + } + } + + [data-ktwizard-type="action-prev"]{ + margin-right:auto; + + @include kt-mobile-sm{ + margin-right:0.5rem; + } + } + + [data-ktwizard-type="action-next"]{ + margin: auto 0 auto auto; + + @include kt-mobile-sm{ + margin: 0 0 1rem; + } + } + } + } + } + + &.kt-wizard-v2--white{ + + .kt-wizard-v2__wrapper{ + background-color: $kt-wizard-v2-form-inner-bg; + } + } + + // Step + [data-ktwizard-type="step"] { + + &[data-ktwizard-state="current"] { + + } + + &[data-ktwizard-state="done"] { + + } + + &[data-ktwizard-state="pending"] { + + } + } + + // Step info + [data-ktwizard-type="step-info"] { + display: none; + + &[data-ktwizard-state="current"] { + display: block; + } + } + + // Content states + [data-ktwizard-type="step-content"] { + display: none; + + &[data-ktwizard-state="current"] { + display: block; + } + } + + + // Action buttons states + & { + [data-ktwizard-type="action-prev"]{ + display: none; + } + + [data-ktwizard-type="action-next"]{ + display: inline-block; + } + + [data-ktwizard-type="action-submit"]{ + display: none; + } + } + + &[data-ktwizard-state="first"] { + [data-ktwizard-type="action-prev"]{ + display: none; + } + + [data-ktwizard-type="action-next"]{ + display: inline-block; + } + + [data-ktwizard-type="action-submit"]{ + display: none; + } + } + + &[data-ktwizard-state="between"] { + [data-ktwizard-type="action-prev"]{ + display: inline-block; + } + + [data-ktwizard-type="action-next"]{ + display: inline-block; + } + + [data-ktwizard-type="action-submit"]{ + display: none; + } + } + + &[data-ktwizard-state="last"] { + [data-ktwizard-type="action-prev"]{ + display: inline-block; + } + + [data-ktwizard-type="action-next"]{ + display: none; + } + + [data-ktwizard-type="action-submit"]{ + display: inline-block; + } + } +} + +// Responsive mode(ref $kt-media-breakpoints in framework\_config.scss) +// Above 1200px +/* @include kt-media-above(xl) { + .kt-wizard-v2 { + + } +} + +// Above 1024px and below 1200px +@include kt-media-range(lg, xl) { + .kt-wizard-v2 { + + } +} + +// Below 1024px +@include kt-media-below(lg) { + .kt-wizard-v2 { + + } +} */ diff --git a/src/assets/sass/pages/wizard/wizard-3.scss b/src/assets/sass/pages/wizard/wizard-3.scss new file mode 100644 index 0000000..207fa95 --- /dev/null +++ b/src/assets/sass/pages/wizard/wizard-3.scss @@ -0,0 +1,326 @@ +// +// Wizard v3 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +// Variables +$kt-wizard-v3-step-label: #959cb6; +$kt-wizard-v3-step-icon: #dee1eb; +$kt-wizard-v3-step-highlight: kt-brand-color(); +$kt-wizard-v3-step-border: #eeeef4; +$kt-wizard-v3-form-bg: #f9fafc; +$kt-wizard-v3-form-inner-bg: #ffffff; + +// General mode +.kt-wizard-v3 { + flex-direction: column; + // Nav + .kt-wizard-v3__nav { + border-bottom: 1px solid $kt-wizard-v3-step-border; + + .kt-wizard-v3__nav-items{ + display: flex; + align-items: flex-end; + padding: 0 4rem; + + .kt-wizard-v3__nav-item{ + display: flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; + flex: 0 0 20%; + + .kt-wizard-v3__nav-body{ + flex: 1; + display: flex; + flex-direction: column; + color: $kt-wizard-v3-step-label; + padding: 2rem 0.5rem; + + .kt-wizard-v3__nav-label{ + font-size: 1.1rem; + font-weight: 600; + margin-bottom: 0.5rem; + + span{ + font-size: 2rem; + margin-right: 0.5rem; + } + } + + .kt-wizard-v3__nav-bar{ + height: 4px; + width: 100%; + background-color: $kt-wizard-v3-step-icon; + position: relative; + + &:after{ + content: ' '; + position: absolute; + top:0; + left:0; + height: 4px; + width: 0; + background-color: transparent; + transition: $kt-transition; + } + } + } + + &[data-ktwizard-state="current"] { + + &:after{ + color: $kt-wizard-v3-step-highlight; + } + + .kt-wizard-v3__nav-body{ + color: $kt-wizard-v3-step-highlight; + + .kt-wizard-v3__nav-bar{ + + &:after{ + width: 100%; + background-color: $kt-wizard-v3-step-highlight; + } + } + } + } + } + + cursor: pointer; + + @include kt-mobile{ + flex-direction: column; + align-items: flex-start; + padding: 2rem 0; + + .kt-wizard-v3__nav-item{ + flex: 0 0 100%; + position: relative; + width: 100%; + + &:after{ + position: absolute; + right: 2rem; + } + + &:last-child{ + + &:after{ + content: "\f105"; + font-family: "Font Awesome 5 Free"; + font-weight: 900; + font-size: 2rem; + color: $kt-wizard-v3-step-icon; + } + } + + .kt-wizard-v3__nav-body{ + justify-content: flex-start; + flex: 0 0 100%; + padding: 0.5rem 2rem; + } + } + } + } + + &.kt-wizard-v3__nav-items--clickable { + .kt-wizard-v3__nav-item { + cursor: pointer; + } + } + } + + .kt-wizard-v3__wrapper{ + display: flex; + justify-content: center; + background-color: $kt-wizard-v3-form-bg; + + .kt-form { + width: 60%; + padding: 4rem 0 5rem; + + .kt-wizard-v3__content{ + padding-bottom: 2rem; + margin-bottom: 2rem; + border-bottom: 1px solid $kt-wizard-v3-step-border; + + .kt-wizard-v3__form{ + margin-top: 3rem; + } + + .kt-wizard-v3__review{ + + .kt-wizard-v3__review-item{ + padding-bottom: 1rem; + margin-bottom: 1rem; + border-bottom: 1px solid $kt-wizard-v3-step-border; + + .kt-wizard-v3__review-title{ + font-weight: 600; + font-size: 1.1rem; + margin-bottom: 0.7rem; + } + + .kt-wizard-v3__review-content{ + line-height: 1.8rem; + } + + &:last-child{ + border-bottom: none; + margin-bottom: 0; + padding-bottom: 0; + } + } + } + } + + .kt-form__actions{ + display: flex; + flex-direction: row; + justify-content: space-between; + + @include kt-mobile-sm{ + flex-wrap: wrap; + justify-content: center; + } + + .btn{ + @include kt-mobile-sm{ + margin: 0 0.5rem 1rem; + } + } + + [data-ktwizard-type="action-prev"]{ + margin-right:auto; + + @include kt-mobile-sm{ + margin-right:0.5rem; + } + } + + [data-ktwizard-type="action-next"]{ + margin: auto 0 auto auto; + + @include kt-mobile-sm{ + margin: 0 0 1rem; + } + } + } + } + + @include kt-mobile{ + padding: 2rem; + + .kt-form{ + width: 100%; + padding: 2rem 1rem 4rem; + } + } + } + + &.kt-wizard-v3--white{ + .kt-wizard-v3__wrapper{ + background-color: $kt-wizard-v3-form-inner-bg; + } + } + + // Step + [data-ktwizard-type="step"] { + &[data-ktwizard-state="current"] { + + } + + &[data-ktwizard-state="done"] { + + } + + &[data-ktwizard-state="pending"] { + + } + } + + // Step info + [data-ktwizard-type="step-info"] { + display: none; + + &[data-ktwizard-state="current"] { + display: block; + } + } + + // Content states + [data-ktwizard-type="step-content"] { + display: none; + + &[data-ktwizard-state="current"] { + display: block; + } + } + + + // Action buttons states + & { + [data-ktwizard-type="action-prev"]{ + display: none; + } + + [data-ktwizard-type="action-next"]{ + display: inline-block; + } + + [data-ktwizard-type="action-submit"]{ + display: none; + } + } + + &[data-ktwizard-state="first"] { + [data-ktwizard-type="action-prev"]{ + display: none; + } + + [data-ktwizard-type="action-next"]{ + display: inline-block; + } + + [data-ktwizard-type="action-submit"]{ + display: none; + } + } + + &[data-ktwizard-state="between"] { + [data-ktwizard-type="action-prev"]{ + display: inline-block; + } + + [data-ktwizard-type="action-next"]{ + display: inline-block; + } + + [data-ktwizard-type="action-submit"]{ + display: none; + } + } + + &[data-ktwizard-state="last"] { + [data-ktwizard-type="action-prev"]{ + display: inline-block; + } + + [data-ktwizard-type="action-next"]{ + display: none; + } + + [data-ktwizard-type="action-submit"]{ + display: inline-block; + } + } +} diff --git a/src/assets/sass/pages/wizard/wizard-4.scss b/src/assets/sass/pages/wizard/wizard-4.scss new file mode 100644 index 0000000..e2e8327 --- /dev/null +++ b/src/assets/sass/pages/wizard/wizard-4.scss @@ -0,0 +1,309 @@ +// +// Wizard v3 +// Pages SASS files are compiled into separate css files +// + + + +// Global config +@import "../../config"; + +// Layout config +@import "../../global/layout/config.scss"; + +// Variables +$kt-wizard-v4-step-label: #959cb6; +$kt-wizard-v4-step-icon: #dee1eb; +$kt-wizard-v4-step-highlight: kt-brand-color(); +$kt-wizard-v4-step-bg: #f7f8fb; +$kt-wizard-v4-step-bg-highlight: #ffffff; +$kt-wizard-v4-step-border: #eeeef4; +$kt-wizard-v4-form-bg: #f9fafc; + +// General mode +.kt-wizard-v4 { + flex-direction: column; + // Nav + .kt-wizard-v4__nav { + + .kt-wizard-v4__nav-items{ + display: flex; + align-items: flex-end; + justify-content: space-between; + flex-wrap: wrap; + + .kt-wizard-v4__nav-item{ + display: flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; + flex: 0 0 calc(25% - 0.25rem); + width: calc(25% - 0.25rem); + background-color: $kt-wizard-v4-step-bg; + border-top-left-radius: 0.5rem; + border-top-right-radius: 0.5rem; + + @include kt-minimal-desktop-and-below{ + flex: 0 0 calc(50% - 0.25rem); + width: calc(50% - 0.25rem); + border-bottom-left-radius: 0.5rem; + border-bottom-right-radius: 0.5rem; + margin-bottom: 0.5rem; + } + + .kt-wizard-v4__nav-body{ + flex: 1; + display: flex; + align-items: center; + flex-wrap: wrap; + color: $kt-wizard-v4-step-label; + padding: 2rem 2.5rem; + + .kt-wizard-v4__nav-number{ + font-size: 1.3rem; + font-weight: 600; + flex: 0 0 2.75rem; + height: 2.75rem; + width: 2.75rem; + display: flex; + align-items: center; + justify-content: center; + background-color: rgba($kt-wizard-v4-step-highlight, 0.08); + color: $kt-wizard-v4-step-highlight; + margin-right: 1rem; + border-radius: 0.5rem; + } + + .kt-wizard-v4__nav-label{ + display: flex; + flex-direction: column; + + .kt-wizard-v4__nav-label-title{ + font-size: 1.1rem; + font-weight: 600; + } + } + } + + &[data-ktwizard-state="current"] { + background-color: $kt-wizard-v4-step-bg-highlight; + + .kt-wizard-v4__nav-body{ + + .kt-wizard-v4__nav-number{ + color: $kt-wizard-v4-step-bg-highlight; + background-color: $kt-wizard-v4-step-highlight; + } + + .kt-wizard-v4__nav-label{ + + .kt-wizard-v4__nav-label-title{ + color: $kt-wizard-v4-step-highlight; + } + } + } + } + } + + &.kt-wizard-v4__nav-items--clickable { + .kt-wizard-v4__nav-item { + cursor: pointer; + } + } + + @include kt-mobile{ + flex-direction: column; + align-items: flex-start; + + .kt-wizard-v4__nav-item{ + flex: 0 0 100%; + position: relative; + width: 100%; + + .kt-wizard-v4__nav-body{ + justify-content: flex-start; + flex: 0 0 100%; + padding: 0.5rem 2rem; + } + } + } + } + } + + .kt-wizard-v4__wrapper{ + display: flex; + justify-content: center; + + .kt-form { + width: 60%; + padding: 4rem 0 5rem; + + .kt-wizard-v4__content{ + padding-bottom: 2rem; + margin-bottom: 2rem; + border-bottom: 1px solid $kt-wizard-v4-step-border; + + .kt-wizard-v4__form{ + margin-top: 3rem; + } + + .kt-wizard-v4__review{ + + .kt-wizard-v4__review-item{ + padding-bottom: 1rem; + margin-bottom: 1rem; + border-bottom: 1px solid $kt-wizard-v4-step-border; + + .kt-wizard-v4__review-title{ + font-weight: 600; + font-size: 1.1rem; + margin-bottom: 0.7rem; + } + + .kt-wizard-v4__review-content{ + line-height: 1.8rem; + } + + &:last-child{ + border-bottom: none; + margin-bottom: 0; + padding-bottom: 0; + } + } + } + } + + .kt-form__actions{ + display: flex; + flex-direction: row; + justify-content: space-between; + + @include kt-mobile-sm{ + flex-wrap: wrap; + justify-content: center; + } + + .btn{ + @include kt-mobile-sm{ + margin: 0 0.5rem 1rem; + } + } + + [data-ktwizard-type="action-prev"]{ + margin-right:auto; + + @include kt-mobile-sm{ + margin-right:0.5rem; + } + } + + [data-ktwizard-type="action-next"]{ + margin: auto 0 auto auto; + + @include kt-mobile-sm{ + margin: 0 0 1rem; + } + } + } + } + + @include kt-mobile{ + padding: 2rem; + + .kt-form{ + width: 100%; + padding: 2rem 1rem 4rem; + } + } + } + + // Step + [data-ktwizard-type="step"] { + &[data-ktwizard-state="current"] { + + } + + &[data-ktwizard-state="done"] { + + } + + &[data-ktwizard-state="pending"] { + + } + } + + // Step info + [data-ktwizard-type="step-info"] { + display: none; + + &[data-ktwizard-state="current"] { + display: block; + } + } + + // Content states + [data-ktwizard-type="step-content"] { + display: none; + + &[data-ktwizard-state="current"] { + display: block; + } + } + + // Action buttons states + & { + [data-ktwizard-type="action-prev"]{ + display: none; + } + + [data-ktwizard-type="action-next"]{ + display: inline-block; + } + + [data-ktwizard-type="action-submit"]{ + display: none; + } + } + + &[data-ktwizard-state="first"] { + [data-ktwizard-type="action-prev"]{ + display: none; + } + + [data-ktwizard-type="action-next"]{ + display: inline-block; + } + + [data-ktwizard-type="action-submit"]{ + display: none; + } + } + + &[data-ktwizard-state="between"] { + [data-ktwizard-type="action-prev"]{ + display: inline-block; + } + + [data-ktwizard-type="action-next"]{ + display: inline-block; + } + + [data-ktwizard-type="action-submit"]{ + display: none; + } + } + + &[data-ktwizard-state="last"] { + [data-ktwizard-type="action-prev"]{ + display: inline-block; + } + + [data-ktwizard-type="action-next"]{ + display: none; + } + + [data-ktwizard-type="action-submit"]{ + display: inline-block; + } + } +} diff --git a/src/assets/sass/style.angular.scss b/src/assets/sass/style.angular.scss new file mode 100644 index 0000000..8657b5e --- /dev/null +++ b/src/assets/sass/style.angular.scss @@ -0,0 +1,58 @@ +// +// Main Stylesheet +// + + + + +//////////////////////////////////////////////////////////////// +///////////// DO NOT MODIFY BELOW INCLUDE ORDER //////////////// +//////////////////////////////////////////////////////////////// + +// 1: Include global config +@import "config"; + +// 2: Include demo config (that overrides the above global config) +@import "global/layout/config"; + +// 3: Bootstrap Include +@import "global/integration/frameworks/bootstrap/variables"; +@import "~bootstrap/scss/bootstrap"; +@import "global/integration/frameworks/bootstrap/bootstrap.scss"; + +// Material Angular +@import "~@angular/material/theming"; +@import "global/integration/frameworks/angular/material/angular-material"; +@import "global/integration/frameworks/angular/material/include"; + +// 3: Components include +@import "global/include.angular"; +//////////////////////////////////////////////////////////////// +///////////// DO NOT MODIFY ABOVE INCLUDE ORDER //////////////// +//////////////////////////////////////////////////////////////// + +// 5: Demo Configs +@import "global/layout/header/config"; +@import "global/layout/brand/config"; +@import "global/layout/aside/config"; +@import "global/layout/footer/config"; + + +// 6: Demo Includes +// Layout +@import "global/layout/base/base"; + +@import "global/layout/header/header"; +@import "global/layout/header/base-mobile"; +@import "global/layout/header/menu"; +@import "global/layout/header/topbar"; + +@import "global/layout/subheader/subheader"; + +@import "global/layout/brand/brand"; + +@import "global/layout/aside/aside"; + +@import "global/layout/content/content"; + +@import "global/layout/footer/footer"; diff --git a/src/browserslist b/src/browserslist new file mode 100644 index 0000000..37371cb --- /dev/null +++ b/src/browserslist @@ -0,0 +1,11 @@ +# This file is currently used by autoprefixer to adjust CSS to support the below specified browsers +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries +# +# For IE 9-11 support, please remove 'not' from the last line of the file and adjust as needed + +> 0.5% +last 2 versions +Firefox ESR +not dead +not IE 9-11 \ No newline at end of file diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts new file mode 100644 index 0000000..7450c22 --- /dev/null +++ b/src/environments/environment.prod.ts @@ -0,0 +1,8 @@ +export const environment = { + production: true, + isMockEnabled: false, // You have to switch this, when your real back-end is done + authTokenKey: 'drence9d66b410c149d5992a30073637e4L5', + + API : "http://64.23.240.99/v1/api/", + STORAGE: 'http://64.23.240.99/storage/' +}; diff --git a/src/environments/environment.ts b/src/environments/environment.ts new file mode 100644 index 0000000..1364621 --- /dev/null +++ b/src/environments/environment.ts @@ -0,0 +1,12 @@ +// This file can be replaced during build by using the `fileReplacements` array. +// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. +// The list of file replacements can be found in `angular.json`. + +export const environment = { + production: false, + isMockEnabled: true, // You have to switch this, when your real back-end is done + authTokenKey: 'drence9d66b410c149d5992a30073637e4d5', + + API : "http://64.23.240.99/v1/api/", + STORAGE: 'http://64.23.240.99/storage/' +}; diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..458f7c1 --- /dev/null +++ b/src/index.html @@ -0,0 +1,43 @@ + + + + + + Drenax + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/karma.conf.js b/src/karma.conf.js new file mode 100644 index 0000000..3eab3f5 --- /dev/null +++ b/src/karma.conf.js @@ -0,0 +1,32 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, '../coverage/my-app'), + reports: ['html', 'lcovonly', 'text-summary'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false + }); + }; + \ No newline at end of file diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..c7b673c --- /dev/null +++ b/src/main.ts @@ -0,0 +1,12 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule) + .catch(err => console.error(err)); diff --git a/src/polyfills.ts b/src/polyfills.ts new file mode 100644 index 0000000..75d6393 --- /dev/null +++ b/src/polyfills.ts @@ -0,0 +1,63 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/guide/browser-support + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** + * Web Animations `@angular/platform-browser/animations` + * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. + * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). + */ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + * because those flags need to be set before `zone.js` being loaded, and webpack + * will put import in the top of bundle, so user need to create a separate file + * in this directory (for example: zone-flags.ts), and put the following flags + * into that file, and then add the following code before importing zone.js. + * import './zone-flags.ts'; + * + * The flags allowed in zone-flags.ts are listed here. + * + * The following flags will work for all browsers. + * + * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + * (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + * + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + * + * (window as any).__Zone_enable_cross_context_check = true; + * + */ + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/src/styles.scss b/src/styles.scss new file mode 100644 index 0000000..f975c04 --- /dev/null +++ b/src/styles.scss @@ -0,0 +1,105 @@ +/* You can add global styles to this file, and also import other style files */ +@import "~@angular/material/prebuilt-themes/indigo-pink.css"; +@import "~material-design-icons/iconfont/material-icons.css"; +@import "~highlight.js/styles/googlecode.css"; +@import "~angular-calendar/css/angular-calendar.css"; + +// hide bootstrap dropdown arrow globally +.dropdown-toggle::after { + display: none !important; +} + +.mat-table__wrapper--dashboard .mat-table { + min-width: 600px !important; + width: 100% !important; +} + +.position-static { + position: static; +} + +.login-box{ + background-color: white; + padding: 30px; + border-radius: 7px; +} + +.mat-tab-body.mat-tab-body-active { + overflow-y: hidden !important; +} + +.dropdown-menu{ + min-width: 8rem !important; +} + +.btn-primary.disabled, .btn-primary:disabled { + color: black !important; + background-color: #efefef !important; +} + +.mat-row{ + align-items: start !important; + padding-top: 10px; +} + +.mat-hint{ + font-size: 9pt !important; +} + +.mat-error{ + font-size: 9pt !important; +} + +.mat-header-cell{ + font-size: 12pt !important; +} + +.mat-cell{ + font-size: 14pt !important; +} + +.kt-portlet__head-title{ + font-size: 17pt !important; +} + +.btn{ + font-size: 12pt !important; +} + +.mat-tooltip{ + font-size: 9pt !important; +} + +.mat-paginator{ + font-size: 11pt !important; +} + +.kt-header__topbar .kt-header__topbar-item { + display: flex !important; +} + +.cursor-pointer { + cursor: pointer; +} + +.btn-disable-list:disabled i { + color: #919090 !important; +} + +.div-group-show-hide-list { + display: flex; + flex-direction: row; +} + +.div-show-hide-list { + display: flex; + align-self: center +} + +.file-input { + display: none !important; +} + +.cal-event-title { + color: black!important; +} diff --git a/src/test.ts b/src/test.ts new file mode 100644 index 0000000..1631789 --- /dev/null +++ b/src/test.ts @@ -0,0 +1,20 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: any; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/src/tsconfig.app.json b/src/tsconfig.app.json new file mode 100644 index 0000000..9231c6e --- /dev/null +++ b/src/tsconfig.app.json @@ -0,0 +1,12 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "baseUrl": "./", + "types": [] + }, + "exclude": [ + "test.ts", + "**/*.spec.ts" + ] +} diff --git a/src/tsconfig.spec.json b/src/tsconfig.spec.json new file mode 100644 index 0000000..1a18e6d --- /dev/null +++ b/src/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/spec", + "baseUrl": "./", + "module": "commonjs", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "test.ts", + "polyfills.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/src/tslint.json b/src/tslint.json new file mode 100644 index 0000000..f93fbf9 --- /dev/null +++ b/src/tslint.json @@ -0,0 +1,17 @@ +{ + "extends": "../tslint.json", + "rules": { + "directive-selector": [ + true, + "attribute", + "kt", + "camelCase" + ], + "component-selector": [ + true, + "element", + "kt", + "kebab-case" + ] + } +} diff --git a/src/typings.d.ts b/src/typings.d.ts new file mode 100644 index 0000000..f947e55 --- /dev/null +++ b/src/typings.d.ts @@ -0,0 +1,16 @@ +/* SystemJS module definition */ +declare var module: NodeModule; +interface NodeModule { + id: string; +} + +declare var KTMenu: any; +declare var KTOffcanvas: any; +declare var KTScrolltop: any; +declare var KTHeader: any; +declare var KTToggle: any; +declare var KTUtil: any; +declare var KTPortlet: any; +declare var KTDialog: any; +declare var KTWizard: any; +declare var Chart: any; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..8bd24b7 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "module": "esnext", + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "importHelpers": true, + "skipLibCheck": true, + "target": "es5", + "types": [ + "node" + ], + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2018", + "dom" + ], + "allowSyntheticDefaultImports": true + } +} diff --git a/tslint.json b/tslint.json new file mode 100644 index 0000000..4548db8 --- /dev/null +++ b/tslint.json @@ -0,0 +1,71 @@ +{ + "extends": "tslint:recommended", + "rulesDirectory": [ + "codelyzer" + ], + "rules": { + "array-type": false, + "arrow-parens": false, + "deprecation": { + "severity": "warn" + }, + "import-blacklist": [ + true, + "rxjs/Rx" + ], + "interface-name": false, + "max-classes-per-file": false, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-consecutive-blank-lines": false, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-empty": false, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-non-null-assertion": true, + "no-redundant-jsdoc": true, + "no-switch-case-fall-through": true, + "no-var-requires": false, + "object-literal-key-quotes": [ + true, + "as-needed" + ], + "object-literal-sort-keys": false, + "ordered-imports": false, + "quotemark": [ + true, + "single" + ], + "trailing-comma": false, + "no-output-on-prefix": true, + "no-input-rename": true, + "no-output-rename": true, + "use-life-cycle-interface": true, + "use-pipe-transform-interface": true, + "component-class-suffix": true, + "directive-class-suffix": true + } +} diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..24e54c9 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,87 @@ +/** + * Main file of webpack config. + * Please do not modified unless you know what to do + */ +const path = require("path"); +const MiniCssExtractPlugin = require("mini-css-extract-plugin"); +const WebpackRTLPlugin = require("webpack-rtl-plugin"); +const WebpackMessages = require("webpack-messages"); +const del = require("del"); + +// theme name +const themeName = "metronic"; +// global variables +const rootPath = path.resolve(__dirname); +const distPath = rootPath + "/src/assets"; + +const entries = { + "css/style.angular": "./src/assets/sass/style.angular.scss" +}; + +// remove older folders and files +(async () => { + await del.sync(distPath + "/css", {force: true}); +})(); + +const mainConfig = function () { + return { + mode: "development", + stats: "errors-only", + performance: { + hints: false + }, + entry: entries, + output: { + // main output path in assets folder + path: distPath, + // output path based on the entries' filename + filename: "[name].js" + }, + resolve: {extensions: ['.scss']}, + plugins: [ + // webpack log message + new WebpackMessages({ + name: themeName, + logger: str => console.log(`>> ${str}`) + }), + // create css file + new MiniCssExtractPlugin({ + filename: "[name].css", + }), + new WebpackRTLPlugin({ + filename: "[name].rtl.css", + }), + { + apply: (compiler) => { + // hook name + compiler.hooks.afterEmit.tap('AfterEmitPlugin', (compilation) => { + (async () => { + await del.sync(distPath + "/css/*.js", {force: true}); + })(); + }); + } + }, + ], + module: { + rules: [ + { + test: /\.scss$/, + use: [ + MiniCssExtractPlugin.loader, + "css-loader", + { + loader: "sass-loader", + options: { + sourceMap: true, + } + }, + ] + }, + ] + }, + } +}; + +module.exports = function () { + return [mainConfig()]; +};