initial commit

This commit is contained in:
Stefania Martziou 2019-11-13 10:22:40 +00:00
commit 1fea921067
95 changed files with 44940 additions and 0 deletions

13
.editorconfig Normal file
View File

@ -0,0 +1,13 @@
# Editor configuration, see http://editorconfig.org
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
max_line_length = off
trim_trailing_whitespace = false

27
README.md Normal file
View File

@ -0,0 +1,27 @@
# OpenScienceObservatoryUi
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.4.
## 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).

140
angular.json Normal file
View File

@ -0,0 +1,140 @@
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1,
"newProjectRoot": "projects",
"projects": {
"open-science-observatory-ui": {
"root": "",
"sourceRoot": "src",
"projectType": "application",
"prefix": "app",
"schematics": {},
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/open-science-observatory-ui",
"index": "src/index.html",
"main": "src/main.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "src/tsconfig.app.json",
"assets": [
"src/favicon.ico",
"src/assets"
],
"styles": [
"src/styles.css",
"node_modules/font-awesome/css/font-awesome.css"
],
"scripts": [
"node_modules/jquery/dist/jquery.min.js",
"node_modules/uikit/dist/js/uikit.min.js",
"node_modules/uikit/dist/js/uikit-icons.min.js"
]
},
"configurations": {
"production": {
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true,
"budgets": [
{
"type": "initial",
"maximumWarning": "2mb",
"maximumError": "5mb"
}
]
}
}
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "open-science-observatory-ui:build"
},
"configurations": {
"production": {
"browserTarget": "open-science-observatory-ui:build:production"
}
}
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "open-science-observatory-ui: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.css"
],
"scripts": [],
"assets": [
"src/favicon.ico",
"src/assets"
]
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": [
"src/tsconfig.app.json",
"src/tsconfig.spec.json"
],
"exclude": [
"**/node_modules/**"
]
}
}
}
},
"open-science-observatory-ui-e2e": {
"root": "e2e/",
"projectType": "application",
"prefix": "",
"architect": {
"e2e": {
"builder": "@angular-devkit/build-angular:protractor",
"options": {
"protractorConfig": "e2e/protractor.conf.js",
"devServerTarget": "open-science-observatory-ui:serve"
},
"configurations": {
"production": {
"devServerTarget": "open-science-observatory-ui:serve:production"
}
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": "e2e/tsconfig.e2e.json",
"exclude": [
"**/node_modules/**"
]
}
}
}
}
},
"defaultProject": "open-science-observatory-ui"
}

28
e2e/protractor.conf.js Normal file
View File

@ -0,0 +1,28 @@
// Protractor configuration file, see link for more information
// https://github.com/angular/protractor/blob/master/lib/config.ts
const { SpecReporter } = require('jasmine-spec-reporter');
exports.config = {
allScriptsTimeout: 11000,
specs: [
'./src/**/*.e2e-spec.ts'
],
capabilities: {
'browserName': 'chrome'
},
directConnect: true,
baseUrl: 'http://localhost:4200/',
framework: 'jasmine',
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 30000,
print: function() {}
},
onPrepare() {
require('ts-node').register({
project: require('path').join(__dirname, './tsconfig.e2e.json')
});
jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
}
};

14
e2e/src/app.e2e-spec.ts Normal file
View File

@ -0,0 +1,14 @@
import { AppPage } from './app.po';
describe('workspace-project App', () => {
let page: AppPage;
beforeEach(() => {
page = new AppPage();
});
it('should display welcome message', () => {
page.navigateTo();
expect(page.getParagraphText()).toEqual('Welcome to open-science-observatory-ui!');
});
});

11
e2e/src/app.po.ts Normal file
View File

@ -0,0 +1,11 @@
import { browser, by, element } from 'protractor';
export class AppPage {
navigateTo() {
return browser.get('/');
}
getParagraphText() {
return element(by.css('app-root h1')).getText();
}
}

13
e2e/tsconfig.e2e.json Normal file
View File

@ -0,0 +1,13 @@
{
"extends": "../tsconfig.json",
"compilerOptions": {
"outDir": "../out-tsc/app",
"module": "commonjs",
"target": "es5",
"types": [
"jasmine",
"jasminewd2",
"node"
]
}
}

11222
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

56
package.json Normal file
View File

@ -0,0 +1,56 @@
{
"name": "open-science-observatory-ui",
"version": "0.0.0",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
"private": true,
"dependencies": {
"@angular/animations": "~7.0.0",
"@angular/common": "~7.0.0",
"@angular/compiler": "~7.0.0",
"@angular/core": "~7.0.0",
"@angular/forms": "~7.0.0",
"@angular/http": "~7.0.0",
"@angular/platform-browser": "~7.0.0",
"@angular/platform-browser-dynamic": "~7.0.0",
"@angular/router": "~7.0.0",
"@highcharts/map-collection": "^1.1.2",
"core-js": "^2.5.4",
"dom-to-image": "^2.6.0",
"font-awesome": "^4.7.0",
"highcharts": "^7.2.0",
"highcharts-angular": "^2.4.0",
"jquery": "^3.4.1",
"jspdf": "^1.5.3",
"proj4": "^2.5.0",
"rxjs": "~6.3.3",
"uikit": "^3.2.1",
"zone.js": "~0.8.26"
},
"devDependencies": {
"@angular-devkit/build-angular": "~0.10.0",
"@angular/cli": "~7.0.4",
"@angular/compiler-cli": "~7.0.0",
"@angular/language-service": "~7.0.0",
"@types/jasmine": "~2.8.8",
"@types/jasminewd2": "~2.0.3",
"codelyzer": "~4.5.0",
"jasmine-core": "~2.99.1",
"jasmine-spec-reporter": "~4.2.1",
"karma": "~3.0.0",
"karma-chrome-launcher": "~2.2.0",
"karma-coverage-istanbul-reporter": "~2.0.1",
"karma-jasmine": "~1.1.2",
"karma-jasmine-html-reporter": "^0.2.2",
"protractor": "~5.4.0",
"ts-node": "~7.0.0",
"tslint": "~5.11.0",
"typescript": "~3.1.1"
}
}

View File

@ -0,0 +1,26 @@
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { HomeComponent } from './pages/home/home.component';
import { CountriesMapOverviewComponent } from './pages/home/countries-map-overview.component';
const routes: Routes = [
{
path: '',
redirectTo: '/home',
pathMatch: 'full'
},
{
path: 'home',
component: HomeComponent
},
{
path: 'overview-map-embed',
component: CountriesMapOverviewComponent
},
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }

View File

View File

@ -0,0 +1,12 @@
<div *ngIf="!isEmbedRoute() ; else embed" class="">
<!--<div *ngIf="!isHomeRoute() ; else landing" class="sidebar_main_open sidebar_main_swipe uk-height-1-1">-->
<app-top-menu></app-top-menu>
<router-outlet></router-outlet>
<app-footer></app-footer>
</div>
<ng-template #embed>
<div uk-height-viewport="offset-bottom: 20">
<router-outlet></router-outlet>
</div>
</ng-template>

View File

@ -0,0 +1,35 @@
import { TestBed, async } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { AppComponent } from './app.component';
describe('AppComponent', () => {
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
RouterTestingModule
],
declarations: [
AppComponent
],
}).compileComponents();
}));
it('should create the app', () => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.debugElement.componentInstance;
expect(app).toBeTruthy();
});
it(`should have as title 'open-science-observatory-ui'`, () => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.debugElement.componentInstance;
expect(app.title).toEqual('open-science-observatory-ui');
});
it('should render title in a h1 tag', () => {
const fixture = TestBed.createComponent(AppComponent);
fixture.detectChanges();
const compiled = fixture.debugElement.nativeElement;
expect(compiled.querySelector('h1').textContent).toContain('Welcome to open-science-observatory-ui!');
});
});

20
src/app/app.component.ts Normal file
View File

@ -0,0 +1,20 @@
import { Component } from '@angular/core';
import {Router} from '@angular/router';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'open-science-observatory-ui';
constructor(private router: Router) {
}
isEmbedRoute() {
// console.log('Is embed route? Route is: ' + this.router.url);
return (this.router.url === '/overview-map-embed');
}
}

33
src/app/app.module.ts Normal file
View File

@ -0,0 +1,33 @@
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { ReusableComponentsModule } from './shared/reusablecomponents/reusable-components.module';
import { HomeComponent } from './pages/home/home.component';
import { DataService } from './services/data.service';
import { CountriesTableComponent } from './pages/home/countries-table.component';
import { DataViewComponent } from './pages/home/data-view.component';
import { HighchartsChartModule } from 'highcharts-angular';
import { CountriesMapOverviewComponent } from './pages/home/countries-map-overview.component';
@NgModule({
declarations: [
AppComponent,
HomeComponent,
CountriesTableComponent,
DataViewComponent,
CountriesMapOverviewComponent
],
imports: [
BrowserModule,
AppRoutingModule,
ReusableComponentsModule,
HighchartsChartModule
],
providers: [
DataService
],
bootstrap: [AppComponent]
})
export class AppModule { }

View File

@ -0,0 +1,5 @@
export class MapCountryData {
id: string;
country: string;
z: number;
}

View File

@ -0,0 +1,29 @@
export class OverviewData {
overview: OverviewIndicators;
countries: CountryOverview[];
}
export class OverviewIndicators {
publications: Indicator;
datasets: Indicator;
repositories: Indicator;
journals: Indicator;
policies: Indicator;
}
export class CountryOverview {
country: string;
repositories: Indicator;
journals: Indicator;
policies: Indicator;
publications: Indicator;
datasets: Indicator;
software: Indicator;
otherProducts: Indicator;
}
export class Indicator {
oa: number;
total: number;
percentage: number;
}

37
src/app/domain/page-content.ts Executable file
View File

@ -0,0 +1,37 @@
/**
* Created by stefania on 7/17/17.
*/
export class PageContent {
content: PositionContents;
route: string;
_id: string;
name: string;
}
export interface PositionContents {
top: Content[];
right: Content[];
bottom: Content[];
left: Content[];
}
export interface Content {
_id: string;
page: Page | string;
placement: string;
order: number;
content: string;
isActive: boolean;
}
export interface Page {
_id: string;
route: string;
name: string;
}

View File

@ -0,0 +1,56 @@
<div class="{{isEmbedRoute()? 'mapContainerEmbed' : 'mapContainer'}}">
<!--Map-->
<div class="map">
<!--<chart type="Map" [options]="serviceMapOptions"></chart>-->
<ng-container *ngIf="countries">
<highcharts-chart
[Highcharts]="Highcharts"
[constructorType]="'mapChart'"
[options]="chartMapOptions"
style="width: 100%; height: 100%; display: block;"
></highcharts-chart>
</ng-container>
<!--<img src="../../../assets/img/mapExample.png">-->
</div>
<!--Map Controls-->
<div class="uk-width-large-1-1 uk-container-center uk-text-center uk-margin-top mapControls">
<ul class="uk-nav uk-nav-side uk-nav-horizontal uk-nav-parent-icon" data-uk-nav="{multiple:true}">
<li>
<a (click)="changeView('publications')">
<span class="uk-nav-label" style="background-color: #5086BA !important;"></span>
<span class="text {{activeView=='publications' ? 'active' : ''}}">OA publications</span>
</a>
</li>
<li>
<a (click)="changeView('datasets')">
<span class="uk-nav-label" style="background-color: #44653D !important;"></span>
<span class="text {{activeView=='datasets' ? 'active' : ''}}">OA datasets</span>
</a>
</li>
<li>
<a (click)="changeView('repositories')">
<span class="uk-nav-label" style="background-color: #A33C3C !important;"></span>
<span class="text {{activeView=='repositories' ? 'active' : ''}}">OA repositories</span>
</a>
</li>
<li>
<a (click)="changeView('journals')">
<span class="uk-nav-label" style="background-color: #7056AF !important;"></span>
<span class="text {{activeView=='journals' ? 'active' : ''}}">OA journals</span>
</a>
</li>
<li>
<a (click)="changeView('policies')">
<span class="uk-nav-label" style="background-color: #A26C0A !important;"></span>
<span class="text {{activeView=='policies' ? 'active' : ''}}">OA policies</span>
</a>
</li>
</ul>
<!--<h2 class="heading_b">-->
<!--Our Team-->
<!--<span class="sub-heading">Lorem ipsum dolor sit amet, consectetur adipisicing elit.</span>-->
<!--</h2>-->
</div>
</div>

View File

@ -0,0 +1,261 @@
import { MapCountryData } from '../../domain/map-country-data';
declare var require: any;
import { Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation } from '@angular/core';
import { CountryOverview, OverviewData } from '../../domain/overview-data';
import * as Highcharts from 'highcharts';
import MapModule from 'highcharts/modules/map';
import { DataService } from '../../services/data.service';
import { Router } from '@angular/router';
const mapWorld = require('@highcharts/map-collection/custom/world.geo.json');
const mapEurope = require('@highcharts/map-collection/custom/europe.geo.json');
MapModule(Highcharts);
@Component({
selector: 'app-map-overview',
templateUrl: './countries-map-overview.component.html',
// styleUrls: ['./top-menu.component.css'],
encapsulation: ViewEncapsulation.None
})
export class CountriesMapOverviewComponent implements OnInit {
// @Input() countries: CountryOverview[];
countries: CountryOverview[];
@Output() emitSelectedCountry: EventEmitter<any> = new EventEmitter();
activeView: string = 'publications';
Highcharts: typeof Highcharts = Highcharts;
chartMapOptions: Highcharts.Options;
mapCountryData: MapCountryData[] = [];
seriesColor: string = '#ff9800';
seriesName: string = 'OA publications';
europe: string[] = [];
constructor(private dataService: DataService,
private router: Router) {}
ngOnInit(): void {
if (this.isEmbedRoute()) {
const body = document.getElementsByTagName('body')[0];
body.classList.remove('header_sticky');
}
this.dataService.getOverviewData().subscribe(
overviewData => {
this.countries = overviewData.countries;
this.europe = ['al', 'at', 'ba', 'be', 'by', 'bg', 'hr', 'cz', 'dk', 'ee', 'fi', 'fr', 'de', 'gr', 'hu', 'is', 'ie', 'it',
'lv', 'lt', 'lu', 'mk', 'mt', 'md', 'me', 'nl', 'no', 'pl', 'pt', 'ro', 'rs', 'si', 'sk', 'es', 'se', 'ch', 'tr', 'ua', 'gb'];
Highcharts.setOptions({
lang: {
// printChart: 'Aaaa',
thousandsSep: ','
}
});
this.loadMapCountryData();
this.loadMap(this.mapCountryData, this.seriesColor, this.seriesName, this.europe);
},
error => {
console.log(error);
}
);
// this.Highcharts.chart.get('DE').zoomTo();
// this.Highcharts.chart.mapZoom(0.2);
// this.Highcharts.get('DE').zoomTo();
}
changeView(view: string) {
this.activeView = view;
this.loadMapCountryData();
this.loadMap(this.mapCountryData, this.seriesColor, this.seriesName, this.europe);
// this.updateMapData();
}
loadMapCountryData() {
this.mapCountryData = [];
for(let index in this.countries) {
this.mapCountryData.push(this.overviewToMapData(this.countries[index]));
}
console.log(this.mapCountryData);
}
overviewToMapData(countryOverview: CountryOverview): MapCountryData {
if (this.activeView === 'publications') {
this.seriesColor = '#5086BA';
this.seriesName = 'OA publications';
return {
id: countryOverview.country,
country: countryOverview.country,
z: countryOverview.publications.oa
};
} else if (this.activeView === 'datasets') {
this.seriesColor = '#44653D';
this.seriesName = 'OA datasets';
return {
id: countryOverview.country,
country: countryOverview.country,
z: countryOverview.datasets.oa
};
} else if (this.activeView === 'repositories') {
this.seriesColor = '#A33C3C';
this.seriesName = 'OA repositories';
return {
id: countryOverview.country,
country: countryOverview.country,
z: countryOverview.repositories.oa
};
} else if (this.activeView === 'journals') {
this.seriesColor = '#7056AF';
this.seriesName = 'OA journals';
return {
id: countryOverview.country,
country: countryOverview.country,
z: countryOverview.journals.oa
};
} else {
this.seriesColor = '#A26C0A';
this.seriesName = 'OA policies';
return {
id: countryOverview.country,
country: countryOverview.country,
z: countryOverview.policies.oa
};
}
}
loadMap(mapCountryData: MapCountryData[], seriesColor: string, seriesName: string, countryCodes: string[]) {
this.chartMapOptions = {
chart: {
map: mapWorld,
// map: mapEurope,
events: {
load: function() {
this.series[0].data = this.series[0].data.map((el) => {
if (countryCodes.includes(el['hc-key'])) {
el.color = 'rgba(139,151,167,0.6)';
return el;
}
return el;
});
this.update({
series: [{
data: this.series[0].data as Highcharts.SeriesMapbubbleDataOptions,
} as Highcharts.SeriesMapbubbleOptions]
});
// this.mapZoom(0.24, 4518.24, -8188.36);
this.mapZoom(0.24, this.get('Germany')['x'], this.get('Germany')['y']);
},
click: event => {
if (event.target.hasOwnProperty('point')) {
console.log(event.target['point']['name']);
// this.countrySelected(event.target['point']['name']);
}
}
}
},
lang: {
thousandsSep: ',',
decimalPoint: '.'
},
title: {
text: ''
},
plotOptions: {
series: {
cursor: 'pointer',
events: {
click: event => {
this.countrySelected(event.point.name);
}
}
}
},
// subtitle: {
// text: 'Source map: <a href="http://code.highcharts.com/mapdata/custom/world.js">World, Miller projection, medium resolution</a>'
// },
// mapNavigation: {
// enabled: true,
// buttonOptions: {
// alignTo: 'spacingBox'
// }
// },
legend: {
enabled: false
},
// colorAxis: {
// min: 0
// },
series: [{
name: 'Countries',
borderColor: '#fff',
negativeColor: 'rgba(139,151,167,0.2)',
enableMouseTracking: false,
type: 'map'
}, {
name: seriesName,
type: 'mapbubble',
color: seriesColor,
marker: {
fillOpacity: 0.6,
// states: {
// hover: {
// fillOpacity: 0.9
// }
// }
},
joinBy: ['name', 'country'],
states: {
hover: {
brightness: 0.7,
borderWidth: 7
// color: '#a4edba',
// borderColor: 'gray'
}
},
data : mapCountryData as Highcharts.SeriesMapbubbleDataOptions,
dataLabels: {
enabled: true,
style: {
color: '#fff',
fontSize: '13px',
fontWeight: 'bold',
// textOutline: '1px #a1a1a1'
textOutline: '1px #000'
},
allowOverlap: true,
formatter: function() {
// return this.point.z.toFixed(1) + '%';
return this.point['z'].toLocaleString();
}
},
// minSize: 4,
// maxSize: '12%',
tooltip: {
headerFormat: '<span style="font-size: 120%; font-weight: bold; margin-bottom: 15px">{point.key}</span><br>',
// pointFormat: '{point.properties.name}: {point.z:.1f}%'
pointFormat: '{point.z} {series.name}',
}
} as Highcharts.SeriesMapbubbleOptions]
};
}
countrySelected(countryName: string) {
this.emitSelectedCountry.emit(countryName);
}
isEmbedRoute() {
return (this.router.url === '/overview-map-embed');
}
}

View File

@ -0,0 +1,114 @@
<table *ngIf="countries" class="uk-table uk-table-hover">
<thead>
<tr>
<th width="12,5%" class="" (click)="sortBy('country')">
Country
<span *ngIf="isSortedBy && isSortedBy=='country' && isDescending"><i class="fas fa-caret-down uk-margin-small-left"></i></span>
<span *ngIf="isSortedBy && isSortedBy=='country' && !isDescending"><i class="fas fa-caret-up uk-margin-small-left"></i></span>
</th>
<th *ngIf="type=='overview'" class="uk-text-center" width="12,5%" (click)="sortBy('repositories')">
<i class="fa fa-sort-numeric-desc m-r-10 uk-margin-right"></i>OA repositories
<span *ngIf="isSortedBy && isSortedBy=='repositories' && isDescending"><i class="fas fa-caret-down uk-margin-small-left"></i></span>
<span *ngIf="isSortedBy && isSortedBy=='repositories' && !isDescending"><i class="fas fa-caret-up uk-margin-small-left"></i></span>
</th>
<th *ngIf="type=='overview'" class="uk-text-center" width="12,5%" (click)="sortBy('journals')">
<i class="fa fa-sort-numeric-desc m-r-10 uk-margin-right"></i>OA journals
<span *ngIf="isSortedBy && isSortedBy=='journals' && isDescending"><i class="fas fa-caret-down uk-margin-small-left"></i></span>
<span *ngIf="isSortedBy && isSortedBy=='journals' && !isDescending"><i class="fas fa-caret-up uk-margin-small-left"></i></span>
</th>
<th *ngIf="type=='overview'" class="uk-text-center" width="12,5%" (click)="sortBy('policies')">
<i class="fa fa-sort-numeric-desc m-r-10 uk-margin-right"></i>OA policies
<span *ngIf="isSortedBy && isSortedBy=='policies' && isDescending"><i class="fas fa-caret-down uk-margin-small-left"></i></span>
<span *ngIf="isSortedBy && isSortedBy=='policies' && !isDescending"><i class="fas fa-caret-up uk-margin-small-left"></i></span>
</th>
<th *ngIf="type=='overview' || type=='openScience'" class="uk-text-center" width="12,5%" (click)="sortBy('publications')">
<i class="fa fa-sort-numeric-desc m-r-10 uk-margin-right"></i>OA publications
<span *ngIf="isSortedBy && isSortedBy=='publications' && isDescending"><i class="fas fa-caret-down uk-margin-small-left"></i></span>
<span *ngIf="isSortedBy && isSortedBy=='publications' && !isDescending"><i class="fas fa-caret-up uk-margin-small-left"></i></span>
</th>
<th *ngIf="type=='overview' || type=='openScience'" class="uk-text-center" width="12,5%" (click)="sortBy('datasets')">
<i class="fa fa-sort-numeric-desc m-r-10 uk-margin-right"></i>OA data
<span *ngIf="isSortedBy && isSortedBy=='datasets' && isDescending"><i class="fas fa-caret-down uk-margin-small-left"></i></span>
<span *ngIf="isSortedBy && isSortedBy=='datasets' && !isDescending"><i class="fas fa-caret-up uk-margin-small-left"></i></span>
</th>
<th *ngIf="type=='overview' || type=='openScience'" class="uk-text-center" width="12,5%" (click)="sortBy('software')">
<i class="fa fa-sort-numeric-desc m-r-10 uk-margin-right"></i>OA software
<span *ngIf="isSortedBy && isSortedBy=='software' && isDescending"><i class="fas fa-caret-down uk-margin-small-left"></i></span>
<span *ngIf="isSortedBy && isSortedBy=='software' && !isDescending"><i class="fas fa-caret-up uk-margin-small-left"></i></span>
</th>
<th *ngIf="type=='overview' || type=='openScience'" class="uk-text-center" width="12,5%" (click)="sortBy('otherProducts')">
<i class="fa fa-sort-numeric-desc m-r-10 uk-margin-right"></i>OA other research products
<span *ngIf="isSortedBy && isSortedBy=='otherProducts' && isDescending"><i class="fas fa-caret-down uk-margin-small-left"></i></span>
<span *ngIf="isSortedBy && isSortedBy=='otherProducts' && !isDescending"><i class="fas fa-caret-up uk-margin-small-left"></i></span>
</th>
</tr>
</thead>
<tbody>
<ng-container *ngIf="isPercentage">
<tr *ngFor="let countryOverview of countries">
<td class=""><a>{{countryOverview.country}}</a></td>
<td *ngIf="type=='overview'" class="uk-text-center">
<ng-container *ngIf="countryOverview.repositories?.percentage !=null">{{countryOverview.repositories.percentage | number}}%</ng-container>
<ng-container *ngIf="countryOverview.repositories===null || countryOverview.repositories.percentage===null">--</ng-container>
</td>
<td *ngIf="type=='overview'" class="uk-text-center">
<ng-container *ngIf="countryOverview.journals?.percentage !=null">{{countryOverview.journals.percentage | number}}%</ng-container>
<ng-container *ngIf="countryOverview.journals===null || countryOverview.journals.percentage===null">--</ng-container>
</td>
<td *ngIf="type=='overview'" class="uk-text-center">
<ng-container *ngIf="countryOverview.policies?.percentage !=null">{{countryOverview.policies.percentage | number}}%</ng-container>
<ng-container *ngIf="countryOverview.policies===null || countryOverview.policies.percentage===null">--</ng-container>
</td>
<td *ngIf="type=='overview' || type=='openScience'" class="uk-text-center">
<ng-container *ngIf="countryOverview.publications?.percentage !=null">{{countryOverview.publications.percentage | number}}%</ng-container>
<ng-container *ngIf="countryOverview.publications===null || countryOverview.publications.percentage===null">--</ng-container>
</td>
<td *ngIf="type=='overview' || type=='openScience'" class="uk-text-center">
<ng-container *ngIf="countryOverview.datasets?.percentage !=null">{{countryOverview.datasets.percentage | number}}%</ng-container>
<ng-container *ngIf="countryOverview.datasets===null || countryOverview.datasets.percentage===null">--</ng-container>
</td>
<td *ngIf="type=='overview' || type=='openScience'" class="uk-text-center">
<ng-container *ngIf="countryOverview.software?.percentage !=null">{{countryOverview.software.percentage | number}}%</ng-container>
<ng-container *ngIf="countryOverview.software===null || countryOverview.software.percentage===null">--</ng-container>
</td>
<td *ngIf="type=='overview' || type=='openScience'" class="uk-text-center">
<ng-container *ngIf="countryOverview.otherProducts?.percentage !=null">{{countryOverview.otherProducts.percentage | number}}%</ng-container>
<ng-container *ngIf="countryOverview.otherProducts===null || countryOverview.otherProducts.percentage===null">--</ng-container>
</td>
</tr>
</ng-container>
<ng-container *ngIf="!isPercentage">
<tr *ngFor="let countryOverview of countries">
<td class=""><a>{{countryOverview.country}}</a></td>
<td *ngIf="type=='overview'" class="uk-text-center">
<ng-container *ngIf="countryOverview.repositories?.oa !=null">{{countryOverview.repositories.oa | number}}</ng-container>
<ng-container *ngIf="countryOverview.repositories===null || countryOverview.repositories.oa===null">--</ng-container>
</td>
<td *ngIf="type=='overview'" class="uk-text-center">
<ng-container *ngIf="countryOverview.journals?.oa !=null">{{countryOverview.journals.oa | number}}</ng-container>
<ng-container *ngIf="countryOverview.journals===null || countryOverview.journals.oa===null">--</ng-container>
</td>
<td *ngIf="type=='overview'" class="uk-text-center">
<ng-container *ngIf="countryOverview.policies?.oa !=null">{{countryOverview.policies.oa | number}}</ng-container>
<ng-container *ngIf="countryOverview.policies===null || countryOverview.policies.oa===null">--</ng-container>
</td>
<td *ngIf="type=='overview' || type=='openScience'" class="uk-text-center">
<ng-container *ngIf="countryOverview.publications?.oa !=null">{{countryOverview.publications.oa | number}}</ng-container>
<ng-container *ngIf="countryOverview.publications===null || countryOverview.publications.oa===null">--</ng-container>
</td>
<td *ngIf="type=='overview' || type=='openScience'" class="uk-text-center">
<ng-container *ngIf="countryOverview.datasets?.oa !=null">{{countryOverview.datasets.oa | number}}</ng-container>
<ng-container *ngIf="countryOverview.datasets===null || countryOverview.datasets.oa===null">--</ng-container>
</td>
<td *ngIf="type=='overview' || type=='openScience'" class="uk-text-center">
<ng-container *ngIf="countryOverview.software?.oa !=null">{{countryOverview.software.oa | number}}</ng-container>
<ng-container *ngIf="countryOverview.software===null || countryOverview.software.oa===null">--</ng-container>
</td>
<td *ngIf="type=='overview' || type=='openScience'" class="uk-text-center">
<ng-container *ngIf="countryOverview.otherProducts?.oa !=null">{{countryOverview.otherProducts.oa | number}}</ng-container>
<ng-container *ngIf="countryOverview.otherProducts===null || countryOverview.otherProducts.oa===null">--</ng-container>
</td>
</tr>
</ng-container>
</tbody>
</table>

View File

@ -0,0 +1,55 @@
import { Component, Input, ViewEncapsulation } from '@angular/core';
import {CountryOverview} from '../../domain/overview-data';
@Component({
selector: 'app-countries-table',
templateUrl: './countries-table.component.html',
// styleUrls: ['./top-menu.component.css'],
encapsulation: ViewEncapsulation.None
})
export class CountriesTableComponent {
@Input() isPercentage: boolean;
@Input() type: string;
@Input() countries: CountryOverview[];
isSortedBy: string;
isDescending: boolean = true;
constructor() {}
sortBy(field: string) {
if (field === this.isSortedBy) {
this.isDescending = !this.isDescending;
} else {
this.isDescending = true;
}
this.isSortedBy = field;
if (field !== 'country') {
if (this.isPercentage) {
if (this.isDescending) {
this.countries.sort((a, b) => b[field].percentage - a[field].percentage);
} else {
this.countries.sort((a, b) => a[field].percentage - b[field].percentage);
}
} else {
if (this.isDescending) {
this.countries.sort((a, b) => b[field].oa - a[field].oa);
} else {
this.countries.sort((a, b) => a[field].oa - b[field].oa);
}
}
} else {
if (this.isDescending) {
this.countries.sort((a, b) => (a[field] < b[field]) ? 1 : -1);
} else {
this.countries.sort((a, b) => (a[field] > b[field]) ? 1 : -1);
}
}
}
}

View File

@ -0,0 +1,105 @@
<!--<ul class="uk-subnav uk-subnav-pill uk-text-center" data-uk-switcher="{connect:'#switcher-content-a-fade', animation: 'fade'}">-->
<!--<li aria-expanded="true" class="{{activeView=='absolute' ? 'uk-active' : ''}}"><a (click)="changeView('absolute')">Absolute</a></li>-->
<!--<li aria-expanded="false" class="{{activeView=='percentage' ? 'uk-active' : ''}}"><a (click)="changeView('percentage')">Percentage</a></li>-->
<!--<li aria-expanded="false" class="{{activeView=='graph' ? 'uk-active' : ''}}"><a (click)="changeView('graph')">Graph</a></li>-->
<!--</ul>-->
<!--<hr>-->
<!--<ul id="switcher-content-a-fade" class="uk-switcher uk-margin">-->
<!--<li aria-hidden="false" class="uk-active" style="animation-duration: 200ms;">Hello!</li>-->
<!--<li aria-hidden="true" style="animation-duration: 200ms;" class="">Hello again!</li>-->
<!--<li aria-hidden="true" style="animation-duration: 200ms;" class="">Bazinga!</li>-->
<!--</ul>-->
<!--<div *ngIf="activeView=='absolute'" class="">-->
<!--<app-countries-table [isPercentage]="false" [type]="type" [countries]="countries"></app-countries-table>-->
<!--</div>-->
<!--<div *ngIf="activeView=='percentage'" class="">-->
<!--<app-countries-table [isPercentage]="true" [type]="type" [countries]="countries"></app-countries-table>-->
<!--</div>-->
<!--<div *ngIf="activeView=='graph'" class="">-->
<!--Graphs here....-->
<!--</div>-->
<ul class="uk-subnav uk-subnav-pill dataView uk-flex uk-flex-center" data-uk-switcher="{connect:'#switcher-content-a-fade', animation: 'fade'}">
<li aria-expanded="true" class="uk-active">
<a href="#" (click)="changeView('absolute')">
<i class="fas fa-hashtag"></i>
</a>
</li>
<li aria-expanded="false" class="">
<a href="#" (click)="changeView('percentage')">
<i class="fas fa-percentage"></i>
</a>
</li>
<li aria-expanded="false" class="">
<a href="#" (click)="changeView('graph')">
<i class="fas fa-chart-line"></i>
</a>
</li>
</ul>
<hr>
<ul id="switcher-content-a-fade" class="uk-switcher uk-margin">
<li aria-hidden="false" class="uk-active" style="animation-duration: 200ms;">
<div class="dataContent">
<div class="actionButtons uk-text-right">
<button class="md-btn md-btn-secondary" (click)="printOverviewData()"><i class="fas fa-print uk-margin-small-right"></i>Print report in PDF</button>
<button class="md-btn md-btn-secondary uk-margin-left"><i class="fas fa-download uk-margin-small-right"></i>Download report</button>
</div>
</div>
<div id="printable-section" class="dataContent">
<app-countries-table [isPercentage]="false" [type]="type" [countries]="countries"></app-countries-table>
</div>
</li>
<li aria-hidden="true" style="animation-duration: 200ms;" class="">
<div class="dataContent">
<div class="actionButtons uk-text-right">
<button class="md-btn md-btn-secondary"><i class="fas fa-print uk-margin-small-right"></i>Print report in PDF</button>
<button class="md-btn md-btn-secondary uk-margin-left"><i class="fas fa-download uk-margin-small-right"></i>Download report</button>
</div>
</div>
<div class="dataContent">
<app-countries-table [isPercentage]="true" [type]="type" [countries]="countries"></app-countries-table>
</div>
</li>
<li aria-hidden="true" style="animation-duration: 200ms;" class="">
<div class="dataContent">
<div class="actionButtons uk-text-right">
<button class="md-btn md-btn-secondary"><i class="fas fa-print uk-margin-small-right"></i>Print report in PDF</button>
<!--<button class="md-btn md-btn-secondary uk-margin-left"><i class="fas fa-download uk-margin-small-right"></i>Download report</button>-->
</div>
<div class="uk-grid uk-margin-top">
<div class="uk-width-1-2">
<!--<iframe style="width: 100%; height:400px" src="http://88.197.53.71:8080/stats-api/chart?json=%7B%22library%22%3A%22HighCharts%22%2C%22chartDescription%22%3A%7B%22queries%22%3A%5B%7B%22name%22%3A%22Publications%22%2C%22type%22%3A%22bar%22%2C%22query%22%3A%7B%22name%22%3A%22oso.oajournals%22%7D%7D%5D%2C%22chart%22%3A%7B%22backgroundColor%22%3A%22%23FFFFFFFF%22%2C%22borderColor%22%3A%22%23335cadff%22%2C%22borderRadius%22%3A0%2C%22borderWidth%22%3A0%2C%22plotBorderColor%22%3A%22%23ccccccff%22%2C%22plotBorderWidth%22%3A0%7D%2C%22title%22%3A%7B%22text%22%3A%22Open%2520Access%2520Journals%22%7D%2C%22subtitle%22%3A%7B%7D%2C%22yAxis%22%3A%7B%22title%22%3A%7B%22text%22%3A%22Publications%22%7D%7D%2C%22xAxis%22%3A%7B%22title%22%3A%7B%22text%22%3A%22year%22%7D%7D%2C%22lang%22%3A%7B%22noData%22%3A%22No%2520Data%2520available%2520for%2520the%2520Query%22%7D%2C%22exporting%22%3A%7B%22enabled%22%3Atrue%7D%2C%22plotOptions%22%3A%7B%22series%22%3A%7B%22dataLabels%22%3A%7B%22enabled%22%3Afalse%7D%7D%7D%2C%22legend%22%3A%7B%22enabled%22%3Atrue%2C%22align%22%3A%22center%22%2C%22verticalAlign%22%3A%22bottom%22%2C%22layout%22%3A%22horizontal%22%7D%2C%22credits%22%3A%7B%22href%22%3Anull%2C%22enabled%22%3Atrue%2C%22text%22%3A%22Created%2520by%2520OpenAIRE%2520via%2520HighCharts%22%7D%7D%7D"></iframe>-->
<iframe *ngIf="oaPublicationsURL" width="100%" height="440" [src]="oaPublicationsURL"></iframe>
</div>
<div class="uk-width-1-2">
<iframe *ngIf="oaRepositoriesURL" width="100%" height="440" [src]="oaRepositoriesURL"></iframe>
</div>
</div>
<div class="uk-grid uk-margin-top">
<div class="uk-width-1-2">
<iframe *ngIf="oaJournalsURL" width="100%" height="440" [src]="oaJournalsURL"></iframe>
</div>
<div class="uk-width-1-2">
<iframe *ngIf="oaDatasetsURL" width="100%" height="440" [src]="oaDatasetsURL"></iframe>
</div>
</div>
<div class="uk-grid uk-margin-top">
<div class="uk-width-1-2">
<iframe *ngIf="oaSoftwareURL" width="100%" height="440" [src]="oaSoftwareURL"></iframe>
</div>
<div class="uk-width-1-2">
<iframe *ngIf="oaOtherURL" width="100%" height="440" [src]="oaOtherURL"></iframe>
</div>
</div>
<!--Graphs here....-->
</div>
</li>
</ul>

View File

@ -0,0 +1,59 @@
import {Component, Input, OnInit, ViewEncapsulation} from '@angular/core';
import { CountryOverview } from '../../domain/overview-data';
import { printPage } from '../../shared/reusablecomponents/print-function';
import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';
@Component({
selector: 'app-data-view',
templateUrl: './data-view.component.html',
// styleUrls: ['./top-menu.component.css'],
encapsulation: ViewEncapsulation.None
})
export class DataViewComponent implements OnInit {
@Input() type: string;
@Input() countries: CountryOverview[];
activeView: string = 'absolute';
oaPublicationsURL: SafeResourceUrl;
oaRepositoriesURL: SafeResourceUrl;
oaJournalsURL: SafeResourceUrl;
oaDatasetsURL: SafeResourceUrl;
oaSoftwareURL: SafeResourceUrl;
oaOtherURL: SafeResourceUrl;
constructor(private sanitizer: DomSanitizer) {}
changeView(view: string) {
this.activeView = view;
if (view === 'graph') {
if (!this.oaPublicationsURL) {
this.oaPublicationsURL = this.sanitizer.bypassSecurityTrustResourceUrl(`http://88.197.53.71:8080/stats-api/chart?json=%7B%22library%22%3A%22HighCharts%22%2C%22chartDescription%22%3A%7B%22queries%22%3A%5B%7B%22name%22%3A%22Publications%22%2C%22type%22%3A%22bar%22%2C%22query%22%3A%7B%22name%22%3A%22oso.oajournals%22%7D%7D%5D%2C%22chart%22%3A%7B%22backgroundColor%22%3A%22%23FFFFFFFF%22%2C%22borderColor%22%3A%22%23335cadff%22%2C%22borderRadius%22%3A0%2C%22borderWidth%22%3A0%2C%22plotBorderColor%22%3A%22%23ccccccff%22%2C%22plotBorderWidth%22%3A0%7D%2C%22title%22%3A%7B%22text%22%3A%22Open%20Access%20Journals%22%7D%2C%22subtitle%22%3A%7B%7D%2C%22yAxis%22%3A%7B%22title%22%3A%7B%22text%22%3A%22Publications%22%7D%7D%2C%22xAxis%22%3A%7B%22title%22%3A%7B%22text%22%3A%22year%22%7D%7D%2C%22lang%22%3A%7B%22noData%22%3A%22No%20Data%20available%20for%20the%20Query%22%7D%2C%22exporting%22%3A%7B%22enabled%22%3Atrue%7D%2C%22plotOptions%22%3A%7B%22series%22%3A%7B%22dataLabels%22%3A%7B%22enabled%22%3Afalse%7D%7D%7D%2C%22legend%22%3A%7B%22enabled%22%3Atrue%2C%22align%22%3A%22center%22%2C%22verticalAlign%22%3A%22bottom%22%2C%22layout%22%3A%22horizontal%22%7D%2C%22credits%22%3A%7B%22href%22%3Anull%2C%22enabled%22%3Atrue%2C%22text%22%3A%22Created%20by%20OpenAIRE%20via%20HighCharts%22%7D%7D%7D`);
}
if (!this.oaRepositoriesURL) {
this.oaRepositoriesURL = this.sanitizer.bypassSecurityTrustResourceUrl(`http://88.197.53.71:8080/stats-api/chart?json=%7B%22library%22%3A%22HighCharts%22%2C%22chartDescription%22%3A%7B%22queries%22%3A%5B%7B%22name%22%3A%22Repositories%22%2C%22type%22%3A%22bar%22%2C%22query%22%3A%7B%22name%22%3A%22oso.oarepositories%22%7D%7D%5D%2C%22chart%22%3A%7B%22backgroundColor%22%3A%22%23FFFFFFFF%22%2C%22borderColor%22%3A%22%23335cadff%22%2C%22borderRadius%22%3A0%2C%22borderWidth%22%3A0%2C%22plotBorderColor%22%3A%22%23ccccccff%22%2C%22plotBorderWidth%22%3A0%7D%2C%22title%22%3A%7B%22text%22%3A%22Open%20Access%20Repositories%22%7D%2C%22subtitle%22%3A%7B%7D%2C%22yAxis%22%3A%7B%22title%22%3A%7B%22text%22%3A%22Repositories%22%7D%7D%2C%22xAxis%22%3A%7B%22title%22%3A%7B%22text%22%3A%22year%22%7D%7D%2C%22lang%22%3A%7B%22noData%22%3A%22No%20Data%20available%20for%20the%20Query%22%7D%2C%22exporting%22%3A%7B%22enabled%22%3Atrue%7D%2C%22plotOptions%22%3A%7B%22series%22%3A%7B%22dataLabels%22%3A%7B%22enabled%22%3Afalse%7D%7D%7D%2C%22legend%22%3A%7B%22enabled%22%3Atrue%2C%22align%22%3A%22center%22%2C%22verticalAlign%22%3A%22bottom%22%2C%22layout%22%3A%22horizontal%22%7D%2C%22credits%22%3A%7B%22href%22%3Anull%2C%22enabled%22%3Atrue%2C%22text%22%3A%22Created%20by%20OpenAIRE%20via%20HighCharts%22%7D%7D%7D`);
}
if (!this.oaJournalsURL) {
this.oaJournalsURL = this.sanitizer.bypassSecurityTrustResourceUrl(`http://88.197.53.71:8080/stats-api/chart?json=%7B%22library%22%3A%22HighCharts%22%2C%22chartDescription%22%3A%7B%22queries%22%3A%5B%7B%22name%22%3A%22Publications%22%2C%22type%22%3A%22bar%22%2C%22query%22%3A%7B%22name%22%3A%22oso.oapublications%22%7D%7D%5D%2C%22chart%22%3A%7B%22backgroundColor%22%3A%22%23FFFFFFFF%22%2C%22borderColor%22%3A%22%23335cadff%22%2C%22borderRadius%22%3A0%2C%22borderWidth%22%3A0%2C%22plotBorderColor%22%3A%22%23ccccccff%22%2C%22plotBorderWidth%22%3A0%7D%2C%22title%22%3A%7B%22text%22%3A%22Open%20Access%20Publications%22%7D%2C%22subtitle%22%3A%7B%7D%2C%22yAxis%22%3A%7B%22title%22%3A%7B%22text%22%3A%22Publications%22%7D%7D%2C%22xAxis%22%3A%7B%22title%22%3A%7B%22text%22%3A%22year%22%7D%7D%2C%22lang%22%3A%7B%22noData%22%3A%22No%20Data%20available%20for%20the%20Query%22%7D%2C%22exporting%22%3A%7B%22enabled%22%3Atrue%7D%2C%22plotOptions%22%3A%7B%22series%22%3A%7B%22dataLabels%22%3A%7B%22enabled%22%3Afalse%7D%7D%7D%2C%22legend%22%3A%7B%22enabled%22%3Atrue%2C%22align%22%3A%22center%22%2C%22verticalAlign%22%3A%22bottom%22%2C%22layout%22%3A%22horizontal%22%7D%2C%22credits%22%3A%7B%22href%22%3Anull%2C%22enabled%22%3Atrue%2C%22text%22%3A%22Created%20by%20OpenAIRE%20via%20HighCharts%22%7D%7D%7D`);
}
if (!this.oaDatasetsURL) {
this.oaDatasetsURL = this.sanitizer.bypassSecurityTrustResourceUrl(`http://88.197.53.71:8080/stats-api/chart?json=%7B%22library%22%3A%22HighCharts%22%2C%22chartDescription%22%3A%7B%22queries%22%3A%5B%7B%22name%22%3A%22Datasets%22%2C%22type%22%3A%22bar%22%2C%22query%22%3A%7B%22name%22%3A%22oso.oadatasets%22%7D%7D%5D%2C%22chart%22%3A%7B%22backgroundColor%22%3A%22%23FFFFFFFF%22%2C%22borderColor%22%3A%22%23335cadff%22%2C%22borderRadius%22%3A0%2C%22borderWidth%22%3A0%2C%22plotBorderColor%22%3A%22%23ccccccff%22%2C%22plotBorderWidth%22%3A0%7D%2C%22title%22%3A%7B%22text%22%3A%22Open%20Access%20Datasets%22%7D%2C%22subtitle%22%3A%7B%7D%2C%22yAxis%22%3A%7B%22title%22%3A%7B%22text%22%3A%22Datasets%22%7D%7D%2C%22xAxis%22%3A%7B%22title%22%3A%7B%22text%22%3A%22country%22%7D%7D%2C%22lang%22%3A%7B%22noData%22%3A%22No%20Data%20available%20for%20the%20Query%22%7D%2C%22exporting%22%3A%7B%22enabled%22%3Atrue%7D%2C%22plotOptions%22%3A%7B%22series%22%3A%7B%22dataLabels%22%3A%7B%22enabled%22%3Afalse%7D%7D%7D%2C%22legend%22%3A%7B%22enabled%22%3Atrue%2C%22align%22%3A%22center%22%2C%22verticalAlign%22%3A%22bottom%22%2C%22layout%22%3A%22horizontal%22%7D%2C%22credits%22%3A%7B%22href%22%3Anull%2C%22enabled%22%3Atrue%2C%22text%22%3A%22Created%20by%20OpenAIRE%20via%20HighCharts%22%7D%7D%7D`);
}
if (!this.oaSoftwareURL) {
this.oaSoftwareURL = this.sanitizer.bypassSecurityTrustResourceUrl(`http://88.197.53.71:8080/stats-api/chart?json=%7B%22library%22%3A%22HighCharts%22%2C%22chartDescription%22%3A%7B%22queries%22%3A%5B%7B%22name%22%3A%22Software%22%2C%22type%22%3A%22bar%22%2C%22query%22%3A%7B%22name%22%3A%22oso.oasoftware%22%7D%7D%5D%2C%22chart%22%3A%7B%22backgroundColor%22%3A%22%23FFFFFFFF%22%2C%22borderColor%22%3A%22%23335cadff%22%2C%22borderRadius%22%3A0%2C%22borderWidth%22%3A0%2C%22plotBorderColor%22%3A%22%23ccccccff%22%2C%22plotBorderWidth%22%3A0%7D%2C%22title%22%3A%7B%22text%22%3A%22Open%20Access%20Software%22%7D%2C%22subtitle%22%3A%7B%7D%2C%22yAxis%22%3A%7B%22title%22%3A%7B%22text%22%3A%22Software%22%7D%7D%2C%22xAxis%22%3A%7B%22title%22%3A%7B%22text%22%3A%22country%22%7D%7D%2C%22lang%22%3A%7B%22noData%22%3A%22No%20Data%20available%20for%20the%20Query%22%7D%2C%22exporting%22%3A%7B%22enabled%22%3Atrue%7D%2C%22plotOptions%22%3A%7B%22series%22%3A%7B%22dataLabels%22%3A%7B%22enabled%22%3Afalse%7D%7D%7D%2C%22legend%22%3A%7B%22enabled%22%3Atrue%2C%22align%22%3A%22center%22%2C%22verticalAlign%22%3A%22bottom%22%2C%22layout%22%3A%22horizontal%22%7D%2C%22credits%22%3A%7B%22href%22%3Anull%2C%22enabled%22%3Atrue%2C%22text%22%3A%22Created%20by%20OpenAIRE%20via%20HighCharts%22%7D%7D%7D`);
}
if (!this.oaOtherURL) {
this.oaOtherURL = this.sanitizer.bypassSecurityTrustResourceUrl(`http://88.197.53.71:8080/stats-api/chart?json=%7B%22library%22%3A%22HighCharts%22%2C%22chartDescription%22%3A%7B%22queries%22%3A%5B%7B%22name%22%3A%22Other%20Research%20Products%22%2C%22type%22%3A%22bar%22%2C%22query%22%3A%7B%22name%22%3A%22oso.oaother%22%7D%7D%5D%2C%22chart%22%3A%7B%22backgroundColor%22%3A%22%23FFFFFFFF%22%2C%22borderColor%22%3A%22%23335cadff%22%2C%22borderRadius%22%3A0%2C%22borderWidth%22%3A0%2C%22plotBorderColor%22%3A%22%23ccccccff%22%2C%22plotBorderWidth%22%3A0%7D%2C%22title%22%3A%7B%22text%22%3A%22Open%20Access%20Other%20Research%20Products%22%7D%2C%22subtitle%22%3A%7B%7D%2C%22yAxis%22%3A%7B%22title%22%3A%7B%22text%22%3A%22Other%20Research%20Products%22%7D%7D%2C%22xAxis%22%3A%7B%22title%22%3A%7B%22text%22%3A%22country%22%7D%7D%2C%22lang%22%3A%7B%22noData%22%3A%22No%20Data%20available%20for%20the%20Query%22%7D%2C%22exporting%22%3A%7B%22enabled%22%3Atrue%7D%2C%22plotOptions%22%3A%7B%22series%22%3A%7B%22dataLabels%22%3A%7B%22enabled%22%3Afalse%7D%7D%7D%2C%22legend%22%3A%7B%22enabled%22%3Atrue%2C%22align%22%3A%22center%22%2C%22verticalAlign%22%3A%22bottom%22%2C%22layout%22%3A%22horizontal%22%7D%2C%22credits%22%3A%7B%22href%22%3Anull%2C%22enabled%22%3Atrue%2C%22text%22%3A%22Created%20by%20OpenAIRE%20via%20HighCharts%22%7D%7D%7D`);
}
}
}
printOverviewData() {
printPage();
}
ngOnInit(): void {
}
}

View File

@ -0,0 +1,259 @@
<!--MAP AND OVERVIEW NUMBERS SECTION-->
<section class="section greySection" id="sect-overview">
<div class="uk-container uk-container-expand uk-container-center uk-scrollspy-init-inview uk-scrollspy-inview uk-animation-scale-up" data-uk-scrollspy="{cls:'uk-animation-scale-up uk-invisible',delay:300,topoffset:-100}">
<div class="uk-grid uk-grid-small uk-margin-bottom uk-grid-match" uk-height-viewport="offset-bottom: 20">
<div class="uk-width-large-4-5 uk-width-medium-3-4">
<!--Map Container-->
<app-map-overview *ngIf="overviewData?.countries" (emitSelectedCountry)="countrySelected($event)"></app-map-overview>
</div>
<div class="uk-width-large-1-5 uk-width-medium-1-4">
<div class="md-card dark-blue-box infoBox">
<div *ngIf="!countrySelectedName" class="md-card-content">
<h3 class="uk-text-center">OPENAIRE MONITOR OBSERVATORY</h3>
<div>This tool allows you to:</div>
<ul>
<li>
better understand the European Open Data landscape
</li>
<li>
find data catalogues and datasets analyse and visualise available metadata
</li>
<li>
find data catalogues and datasets analyse and visualise available metadata
</li>
<li>
access the raw data
</li>
</ul>
<div class="uk-text-center uk-margin-medium-top">
<button class="md-btn md-btn-primary">Learn More</button>
</div>
</div>
<div *ngIf="countrySelectedName" class="md-card-content">
<h3 class="uk-text-center"><a class="backToOriginalInfoBox uk-float-left" (click)="deselectCountry()"><i class="fas fa-angle-left"></i></a>{{countrySelectedName | uppercase}}</h3>
<div class="numbers">
<div class="uk-margin-medium-top">
<div class="number">18,165</div>
<div class="uk-margin-top">number of OA journals</div>
</div>
<div class="uk-margin-medium-top">
<div class="number">327</div>
<div class="uk-margin-top">number of providers</div>
</div>
</div>
<hr class="greyBoldDivider uk-margin-medium-top uk-margin-medium-bottom">
<div class="graphs">
<div class="uk-grid">
<div class="uk-width-1-2">
<div class="epc_chart" data-percent="65" data-bar-color="#009688">
<span class="epc_chart_text"><span class="countUpMe">65</span>%</span>
<canvas height="220" width="220" style="height: 110px; width: 110px;"></canvas>
</div>
<div class="uk-text-center">Open Licences</div>
</div>
<div class="uk-width-1-2">
<div class="epc_chart" data-percent="43" data-bar-color="#009688">
<span class="epc_chart_text"><span class="countUpMe">43</span>%</span>
<canvas height="220" width="220" style="height: 110px; width: 110px;"></canvas>
</div>
<div class="uk-text-center">Restricted</div>
</div>
</div>
</div>
<hr class="greyBoldDivider uk-margin-medium-top uk-margin-medium-bottom">
<div class="uk-text-center uk-margin-medium-top">
<button class="md-btn md-btn-primary">Visit Country Page <i class="fas fa-arrow-right uk-margin-small-left"></i></button>
</div>
</div>
</div>
</div>
<!--<div class="uk-width-large-3-5 uk-container-center uk-text-center">-->
<!--<h2 class="heading_b">-->
<!--Our Team-->
<!--<span class="sub-heading">Lorem ipsum dolor sit amet, consectetur adipisicing elit.</span>-->
<!--</h2>-->
<!--</div>-->
</div>
<div class="">
<!--Overview cards-->
<div *ngIf="overviewData?.overview" class="uk-width-1-1 indicatorCards">
<div class="uk-grid uk-grid-small uk-grid-width-small-1-2 uk-grid-width-medium-1-3 uk-grid-width-large-1-5 uk-margin-top uk-grid-match" data-uk-grid-margin="">
<div class="uk-row-first">
<div class="md-card">
<div class="md-card-content">
<div class="uk-margin-top">
<div class="uk-float-right uk-margin-small-right">
<span class="peity_visitors peity_data" style="display: none;">5,3,9,6,5,9,7</span>
<svg class="peity" height="28" width="48"><rect data-value="5" fill="#5086BA" x="1.3714285714285717" y="12.444444444444443" width="4.114285714285715" height="15.555555555555557"></rect><rect data-value="3" fill="#5086BA" x="8.228571428571428" y="18.666666666666668" width="4.114285714285716" height="9.333333333333332"></rect><rect data-value="9" fill="#5086BA" x="15.085714285714287" y="0" width="4.1142857142857086" height="28"></rect><rect data-value="6" fill="#5086BA" x="21.942857142857147" y="9.333333333333336" width="4.114285714285707" height="18.666666666666664"></rect><rect data-value="5" fill="#5086BA" x="28.800000000000004" y="12.444444444444443" width="4.114285714285707" height="15.555555555555557"></rect><rect data-value="9" fill="#5086BA" x="35.65714285714286" y="0" width="4.114285714285707" height="28"></rect><rect data-value="7" fill="#5086BA" x="42.51428571428572" y="6.222222222222221" width="4.114285714285707" height="21.77777777777778"></rect></svg>
</div>
<h2 class="uk-margin-remove">
<span *ngIf="overviewData.overview.publications?.oa" class="number">{{overviewData.overview.publications.oa | number}}</span>
<span *ngIf="!overviewData.overview.publications || !overviewData.overview.publications.oa" class="number">--</span>
</h2>
</div>
<div class="uk-margin-top">
<!--<span class="uk-text-muted uk-text-small">Number of OA publications</span>-->
<span class="">Number of OA publications</span>
</div>
<div *ngIf="overviewData.overview.publications?.percentage" class="uk-margin-top">
<span class="number">{{overviewData.overview.publications.percentage | number}}%</span> are OA
</div>
</div>
</div>
</div>
<div class="">
<div class="md-card">
<div class="md-card-content">
<div class="uk-margin-top">
<div class="uk-float-right uk-margin-small-right">
<span class="peity_sale peity_data" style="display: none;">5,3,9,6,5,9,7,3,5,2</span>
<svg class="peity" height="28" width="64"><polygon fill="#44653D" points="0 27.5 0 12.5 7.111111111111111 18.5 14.222222222222221 0.5 21.333333333333332 9.5 28.444444444444443 12.5 35.55555555555556 0.5 42.666666666666664 6.5 49.77777777777777 18.5 56.888888888888886 12.5 64 21.5 64 27.5"></polygon><polyline fill="none" points="0 12.5 7.111111111111111 18.5 14.222222222222221 0.5 21.333333333333332 9.5 28.444444444444443 12.5 35.55555555555556 0.5 42.666666666666664 6.5 49.77777777777777 18.5 56.888888888888886 12.5 64 21.5" stroke="#44653D" stroke-width="1" stroke-linecap="square"></polyline></svg>
</div>
<h2 class="uk-margin-remove">
<span *ngIf="overviewData.overview.datasets?.oa" class="number">{{overviewData.overview.datasets.oa | number}}</span>
<span *ngIf="!overviewData.overview.datasets || !overviewData.overview.datasets.oa" class="number">--</span>
</h2>
</div>
<div class="uk-margin-top">
<!--<span class="uk-text-muted uk-text-small">Number of OA publications</span>-->
<span class="">Number of OA datasets</span>
</div>
<div *ngIf="overviewData.overview.datasets?.percentage" class="uk-margin-top">
<span class="number">{{overviewData.overview.datasets.percentage | number}}%</span> are OA
</div>
</div>
</div>
</div>
<div class="">
<div class="md-card">
<div class="md-card-content">
<div class="uk-margin-top">
<div class="uk-float-right uk-margin-small-right">
<span class="peity_orders peity_data" style="display: none;">64/100</span>
<svg class="peity" height="24" width="24"><path d="M 12 0 A 12 12 0 1 1 2.7538410866905263 19.649087876984275 L 7.376920543345263 15.824543938492138 A 6 6 0 1 0 12 6" data-value="64" fill="#A33C3C"></path><path d="M 2.7538410866905263 19.649087876984275 A 12 12 0 0 1 11.999999999999998 0 L 11.999999999999998 6 A 6 6 0 0 0 7.376920543345263 15.824543938492138" data-value="36" fill="#eee"></path></svg>
</div>
<h2 class="uk-margin-remove">
<span *ngIf="overviewData.overview.repositories?.oa" class="number">{{overviewData.overview.repositories.oa | number}}</span>
<span *ngIf="!overviewData.overview.repositories || !overviewData.overview.repositories.oa" class="number">--</span>
</h2>
</div>
<div class="uk-margin-top">
<!--<span class="uk-text-muted uk-text-small">Number of OA publications</span>-->
<span class="">Number of OA repositories</span>
</div>
<div *ngIf="overviewData.overview.repositories?.percentage" class="uk-margin-top">
<span class="number">{{overviewData.overview.repositories.percentage | number}}%</span> are OA
</div>
</div>
</div>
</div>
<div class="">
<div class="md-card">
<div class="md-card-content">
<div class="uk-margin-top">
<div class="uk-float-right uk-margin-small-right">
<span class="peity_sale peity_data" style="display: none;">5,3,9,6,5,9,7,3,5,2</span>
<svg class="peity" height="28" width="64"><polygon fill="#7056AF" points="0 27.5 0 12.5 7.111111111111111 18.5 14.222222222222221 0.5 21.333333333333332 9.5 28.444444444444443 12.5 35.55555555555556 0.5 42.666666666666664 6.5 49.77777777777777 18.5 56.888888888888886 12.5 64 21.5 64 27.5"></polygon><polyline fill="none" points="0 12.5 7.111111111111111 18.5 14.222222222222221 0.5 21.333333333333332 9.5 28.444444444444443 12.5 35.55555555555556 0.5 42.666666666666664 6.5 49.77777777777777 18.5 56.888888888888886 12.5 64 21.5" stroke="#7056AF" stroke-width="1" stroke-linecap="square"></polyline></svg>
</div>
<h2 class="uk-margin-remove">
<span *ngIf="overviewData.overview.journals?.oa" class="number">{{overviewData.overview.journals.oa | number}}</span>
<span *ngIf="!overviewData.overview.journals || !overviewData.overview.journals.oa" class="number">--</span>
</h2>
</div>
<div class="uk-margin-top">
<!--<span class="uk-text-muted uk-text-small">Number of OA publications</span>-->
<span class="">Number of OA journals</span>
</div>
<div *ngIf="overviewData.overview.journals?.percentage" class="uk-margin-top">
<span class="number">{{overviewData.overview.journals.percentage | number}}%</span> are OA
</div>
</div>
</div>
</div>
<div class="">
<div class="md-card">
<div class="md-card-content">
<div class="uk-margin-top">
<div class="uk-float-right uk-margin-small-right">
<span class="peity_visitors peity_data" style="display: none;">5,3,9,6,5,9,7</span>
<svg class="peity" height="28" width="48"><rect data-value="5" fill="#A26C0A" x="1.3714285714285717" y="12.444444444444443" width="4.114285714285715" height="15.555555555555557"></rect><rect data-value="3" fill="#A26C0A" x="8.228571428571428" y="18.666666666666668" width="4.114285714285716" height="9.333333333333332"></rect><rect data-value="9" fill="#A26C0A" x="15.085714285714287" y="0" width="4.1142857142857086" height="28"></rect><rect data-value="6" fill="#A26C0A" x="21.942857142857147" y="9.333333333333336" width="4.114285714285707" height="18.666666666666664"></rect><rect data-value="5" fill="#A26C0A" x="28.800000000000004" y="12.444444444444443" width="4.114285714285707" height="15.555555555555557"></rect><rect data-value="9" fill="#A26C0A" x="35.65714285714286" y="0" width="4.114285714285707" height="28"></rect><rect data-value="7" fill="#A26C0A" x="42.51428571428572" y="6.222222222222221" width="4.114285714285707" height="21.77777777777778"></rect></svg>
</div>
<h2 class="uk-margin-remove">
<span *ngIf="overviewData.overview.policies?.oa" class="number">{{overviewData.overview.policies.oa | number}}</span>
<span *ngIf="!overviewData.overview.policies || !overviewData.overview.policies.oa" class="number">--</span>
</h2>
</div>
<div class="uk-margin-top">
<!--<span class="uk-text-muted uk-text-small">Number of OA publications</span>-->
<span class="">Number of OA policies</span>
</div>
<div *ngIf="overviewData.overview.policies?.percentage" class="uk-margin-top">
<span class="number">{{overviewData.overview.policies.percentage | number}}%</span> are OA
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!--TABS SECTION-->
<section class="section greySection" id="sect-tabs">
<div class="uk-container uk-container-expand uk-container-center uk-scrollspy-init-inview uk-scrollspy-inview uk-animation-scale-up" data-uk-scrollspy="{cls:'uk-animation-scale-up uk-invisible',delay:300,topoffset:-100}">
<div class="">
<ul class="uk-tab uk-tab-large uk-flex-center" data-uk-tab="{connect:'#team_tabbed',animation: 'slide-bottom'}">
<li class="uk-active" aria-expanded="true"><a href="#">Overview</a></li>
<li aria-expanded="false"><a href="#">Open Science</a></li>
<li class="uk-disabled" aria-expanded="false"><a href="#" data-uk-tooltip="{title: Stay tuned..; pos: top-left}">Collaboration</a></li>
<li class="uk-disabled" aria-expanded="false" data-uk-tooltip="Stay tuned.."><a href="#">Impact</a></li>
<li class="uk-disabled" aria-expanded="false" data-uk-tooltip="Stay tuned.."><a href="#">Innovation</a></li>
<!--<li class="uk-tab-responsive uk-active uk-hidden" aria-haspopup="true" aria-expanded="false"><a>Developers</a><div class="uk-dropdown uk-dropdown-small" aria-hidden="true"><ul class="uk-nav uk-nav-dropdown"></ul><div></div></div></li>-->
</ul>
<ul *ngIf="overviewData?.countries" id="team_tabbed" class="uk-switcher">
<!--OVERVIEW tab-->
<li aria-hidden="false" class="uk-active" style="animation-duration: 200ms;">
<div class="uk-margin tabContent">
<app-data-view [type]="'overview'" [countries]="overviewData.countries"></app-data-view>
<!--<app-countries-table [isPercentage]="false" [type]="'overview'" [countries]="overviewData.countries"></app-countries-table>-->
</div>
</li>
<!--OPEN SCIENCE tab-->
<li aria-hidden="true" style="animation-duration: 200ms;">
<div class="uk-margin tabContent">
<app-data-view [type]="'openScience'" [countries]="overviewData.countries"></app-data-view>
<!--<app-countries-table [isPercentage]="false" [type]="'openScience'" [countries]="overviewData.countries"></app-countries-table>-->
</div>
</li>
<li aria-hidden="true">
<div class="uk-grid uk-grid-medium uk-grid-width-small-1-2 uk-grid-width-medium-1-3 uk-grid-width-large-1-4" data-uk-grid-margin="">
</div>
</li>
<li aria-hidden="true">
<div class="uk-grid uk-grid-medium uk-grid-width-small-1-2 uk-grid-width-medium-1-3 uk-grid-width-large-1-4" data-uk-grid-margin="">
</div>
</li>
<li aria-hidden="true">
<div class="uk-grid uk-grid-medium uk-grid-width-small-1-2 uk-grid-width-medium-1-3 uk-grid-width-large-1-4" data-uk-grid-margin="">
</div>
</li>
</ul>
</div>
</div>
</section>

View File

@ -0,0 +1,39 @@
import { Component, DoCheck, OnInit, ViewEncapsulation } from '@angular/core';
import { DataService } from '../../services/data.service';
import { OverviewData } from '../../domain/overview-data';
@Component({
selector: 'app-home',
templateUrl: './home.component.html',
// styleUrls: ['./top-menu.component.css'],
encapsulation: ViewEncapsulation.None
})
export class HomeComponent implements OnInit {
overviewData: OverviewData;
countrySelectedName: string = null;
constructor(private dataService: DataService) { }
ngOnInit(): void {
this.dataService.getOverviewData().subscribe(
overviewData => {
this.overviewData = overviewData;
},
error => {
console.log(error);
}
);
}
countrySelected(countryName: string) {
console.log('Country selected: ', countryName);
this.countrySelectedName = countryName;
}
deselectCountry() {
this.countrySelectedName = null;
}
}

View File

@ -0,0 +1,27 @@
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { OverviewData } from '../domain/overview-data';
const headerOptions = {
headers : new HttpHeaders().set('Content-Type', 'application/json')
.set('Accept', 'application/json'),
};
@Injectable ()
export class DataService {
// private _jsonURl = environment.API_ENDPOINT + '/monitor/';
// private _jsonURl = '/assets/json/';
private _jsonURl = 'http://esperos.di.uoa.gr/oss.json';
constructor(private httpClient: HttpClient) {
}
public getOverviewData(): Observable<OverviewData> {
return this.httpClient.get<OverviewData>(this._jsonURl, headerOptions);
}
// public getOverviewData(): Observable<OverviewData> {
// return ;
// }
}

View File

@ -0,0 +1,46 @@
/**
* Created by stefania on 7/17/17.
*/
import { Injectable } from '@angular/core';
import { environment } from '../../environments/environment';
import { HttpClient } from '@angular/common/http';
import { PageContent } from '../domain/page-content';
import { catchError } from 'rxjs/operators';
import { throwError } from 'rxjs';
@Injectable()
export class HelpContentService {
private _helpServiceUrl = environment.FAQ_ENDPOINT;
constructor (private httpClient: HttpClient) {
}
getActivePageContent(route: string) {
const url = this._helpServiceUrl + '/page/route?q=' + route;
console.log(`sending request at: ${url}`);
return this.httpClient.get<PageContent>(url).pipe(catchError(this.handleError));
}
private extractData(res: Response) {
const body = res;
return body.body || { };
}
private handleError (error: Response | any) {
// In a real world app, we might use a remote logging infrastructure
// We'd also dig deeper into the error to get a better message
let errMsg = '';
console.log(error);
if (error instanceof Response) {
const body = error.text() || '';
errMsg = `${error.status} - ${error.statusText || ''} ${body}`;
} else {
errMsg = (error.message) ? error.message :
error.status ? `${error.status} - ${error.statusText}` : 'Server error';
console.error(errMsg); // log to console instead
}
return throwError(errMsg);
}
}

View File

@ -0,0 +1,11 @@
import { Component, DoCheck, OnInit, ViewEncapsulation } from '@angular/core';
@Component({
selector: 'app-footer',
templateUrl: './footer.component.html',
// styleUrls: ['./footer.component.css'],
encapsulation: ViewEncapsulation.None
})
export class FooterComponent {
}

View File

@ -0,0 +1,140 @@
/**
* angular2-cookie-law
*
* Copyright 2016-2017, @andreasonny83, All rights reserved.
*
* @author: @andreasonny83 <andreasonny83@gmail.com>
*/
import {
DomSanitizer,
SafeHtml,
} from '@angular/platform-browser';
import {
CookieLawService,
} from './cookie-law.service';
import { Component, EventEmitter, HostBinding, Input, OnInit, Output } from '@angular/core';
import { animate, AnimationEvent, state, style, transition, trigger } from '@angular/animations';
// import {
// closeIcon,
// } from './icons';
export type CookieLawPosition = 'top' | 'bottom';
export type CookieLawAnimation = 'topIn' | 'bottomIn' | 'topOut' | 'bottomOut';
export type CookieLawTarget = '_blank' | '_self';
@Component({
selector: 'cookie-law',
// encapsulation: ViewEncapsulation.None,
animations: [
trigger('state', [
state('bottomOut', style({ transform: 'translateY(100%)' })),
state('topOut', style({ transform: 'translateY(-100%)' })),
state('*', style({ transform: 'translateY(0)' })),
transition('void => topIn', [
style({ transform: 'translateY(-100%)' }),
animate('1000ms ease-in-out'),
]),
transition('void => bottomIn', [
style({ transform: 'translateY(100%)' }),
animate('1000ms ease-in-out'),
]),
transition('* => *', animate('1000ms ease-out')),
])
],
styleUrls: [ './cookie-law.css' ],
templateUrl: './cookie-law.html',
})
export class CookieLawComponent implements OnInit {
public cookieLawSeen: boolean;
@Input('learnMore')
get learnMore() { return this._learnMore; }
set learnMore(value: string) {
this._learnMore = (value !== null && `${value}` !== 'false') ? value : null;
}
@Input('target')
get target() { return this._target; }
set target(value: CookieLawTarget) {
this._target = (value !== null && `${value}` !== 'false' &&
(`${value}` === '_blank' || `${value}` === '_self')
) ? value : '_blank';
}
@Input('position')
get position() { return this._position; }
set position(value: CookieLawPosition) {
this._position = (value !== null && `${value}` !== 'false' &&
(`${value}` === 'top' || `${value}` === 'bottom')
) ? value : 'bottom';
}
@Output('isSeen')
private isSeenEvt: EventEmitter<boolean>;
@HostBinding('attr.seen')
public isSeen: boolean;
private animation: CookieLawAnimation;
private closeSvg: SafeHtml;
private currentStyles: {};
private _learnMore: string;
private _target: CookieLawTarget;
private _position: CookieLawPosition;
constructor(
private _service: CookieLawService,
private domSanitizer: DomSanitizer,
) {
this.isSeenEvt = new EventEmitter<boolean>();
this.animation = 'topIn';
this._position = 'bottom';
this.cookieLawSeen = this._service.seen();
}
ngOnInit(): void {
if (typeof document !== 'undefined') {
this.animation = this.position === 'bottom' ? 'bottomIn' : 'topIn';
this.closeSvg = `
<span class="clickable uk-icon">
<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" icon="close" ratio="1">
<path fill="none" stroke="#000" stroke-width="1.06" d="M16,16 L4,4"></path>
<path fill="none" stroke="#000" stroke-width="1.06" d="M16,4 L4,16"></path>
</svg>
</span>`;
if (this.cookieLawSeen) {
this.isSeen = true;
}
this.currentStyles = {
'top': this.position === 'top' ? '0' : null,
'bottom': this.position === 'top' ? 'initial' : null,
};
}
}
afterDismissAnimation(evt: AnimationEvent) {
if (evt.toState === 'topOut' ||
evt.toState === 'bottomOut') {
this.isSeen = true;
this.isSeenEvt.emit(this.isSeen);
}
}
public dismiss(evt?: MouseEvent): void {
if (evt) {
evt.preventDefault();
}
this._service.storeCookie();
this.animation = this.position === 'top' ? 'topOut' : 'bottomOut';
}
}

View File

@ -0,0 +1,77 @@
.cookie-law-wrapper a {
color: #bbb;
-webkit-transition: color .2s;
transition: color .2s;
}
.cookie-law-wrapper a:hover {
color: #fff;
}
.cookie-law-wrapper a:hover svg {
fill: #fff;
}
.cookie-law-wrapper {
background: #333;
color: #bbb;
display: block;
/*font-family: Helvetica Neue,Helvetica,Arial,sans-serif;
font-size: 15px;
font-weight: 200;
line-height: 20px;*/
position: fixed;
bottom: 0;
left: 0;
width: 100%;
z-index: 100;
font-smooth: always;
-webkit-font-smoothing: antialiased;
text-align: center;
}
.dismiss {
display: block;
box-sizing: border-box;
padding: 10px;
position: absolute;
top: 0;
right: 10px;
text-decoration: none;
line-height: 20px;
}
.dismiss svg {
display: block;
fill: #bbb;
width: 20px;
height: 20px;
-webkit-transition: fill .2s;
transition: fill .2s;
}
.copy {
box-sizing: border-box;
padding: 10px 60px 10px 10px;
}
.copy span {
color: #fff;
/*font-weight: 400;*/
}
.copy a {
text-decoration: underline;
}
.copy a:active, .copy a:hover {
outline: 0;
}
@media (min-width: 600px) {
/* For bigger devices: */
.copy {
padding: 20px 60px 20px 20px;
/*font-size: 18px;
line-height: 24px;*/
}
.dismiss {
top: 10px;
right: 15px;
}
.dismiss svg {
width: 24px;
height: 24px;
}
}

View File

@ -0,0 +1,25 @@
<div class="cookie-law-wrapper"
[ngStyle]="currentStyles"
*ngIf="!cookieLawSeen"
[@state]="animation"
(@state.done)="afterDismissAnimation($event)">
<div class="copy">
<span #ref><ng-content></ng-content></span>
<span *ngIf="ref.childNodes.length == 0">
By continuing to browse the site, you're agreeing to our use of cookies.
<span *ngIf="learnMore">
Learn more in our <a [href]="learnMore" [target]="target">privacy policy</a>.
</span>
</span>
<a href="#" role="button" class="dismiss" (click)="dismiss($event)">
<span class="clickable uk-icon">
<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" icon="close" ratio="1">
<path fill="none" stroke="#000" stroke-width="1.06" d="M16,16 L4,4"></path>
<path fill="none" stroke="#000" stroke-width="1.06" d="M16,4 L4,16"></path>
</svg>
</span>
</a>
</div>
</div>

View File

@ -0,0 +1,24 @@
/**
* angular2-cookie-law
*
* Copyright 2016-2017, @andreasonny83, All rights reserved.
*
* @author: @andreasonny83 <andreasonny83@gmail.com>
*/
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { CookieLawComponent } from './cookie-law.component';
import { CookieLawService } from './cookie-law.service';
@NgModule({
imports: [ CommonModule ],
declarations: [ CookieLawComponent ],
providers: [ CookieLawService ],
exports: [ CookieLawComponent ]
})
export class CookieLawModule { }
export {
CookieLawComponent,
CookieLawService
};

View File

@ -0,0 +1,61 @@
/**
* angular2-cookie-law
*
* Copyright 2016-2017, @andreasonny83, All rights reserved.
*
* @author: @andreasonny83 <andreasonny83@gmail.com>
*/
import { Injectable } from '@angular/core';
@Injectable()
export class CookieLawService {
seen(): boolean {
return this.cookieExists('cookieLawSeen');
}
storeCookie(): void {
return this.setCookie('cookieLawSeen');
}
/**
* try to read a saved cookie
*
* @param {string} name [the cookie name]
*
* @return {string} [the cookie's value]
*/
private cookieExists(name: string): boolean {
if (typeof document !== 'undefined') {
let ca: Array<string> = document.cookie.split(';');
let caLen: number = ca.length;
let cookieName = name + '=';
let c: string;
for (let i: number = 0; i < caLen; i += 1) {
c = ca[i].replace(/^\s\+/g, '');
if (c.indexOf(cookieName) !== -1) {
return true;
}
}
}
return false;
}
/**
* store a new cookie in the browser
*
* @param {string} name [the name for the cookie]
*/
private setCookie(name: string): void {
if (typeof document !== 'undefined') {
let d:Date = new Date();
d.setTime(d.getTime() + 3*30 * 24 * 60 * 60 * 1000); // in 3 months
let expires:string = `expires=${d.toUTCString()}`;
document.cookie = encodeURIComponent(name) + '=true; path=/; expires='+expires+';';
}
}
}

View File

@ -0,0 +1,13 @@
/**
* angular2-cookie-law
*
* Copyright 2016-2017, @andreasonny83, All rights reserved.
*
* @author: @andreasonny83 <andreasonny83@gmail.com>
*/
export const closeIcon: string = `
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path d="M377.047 184.198q0 8.26-6.037 14.297L313.505 256l57.505 57.505q6.037 6.037 6.037 14.297 0 8.578-6.037 14.615l-28.593 28.593q-6.037 6.037-14.615 6.037-8.26 0-14.297-6.037L256 313.505l-57.505 57.505q-6.037 6.037-14.297 6.037-8.578 0-14.615-6.037l-28.593-28.593q-6.037-6.037-6.037-14.615 0-8.26 6.037-14.297L198.495 256l-57.505-57.505q-6.037-6.037-6.037-14.297 0-8.578 6.037-14.615l28.593-28.593q6.037-6.037 14.615-6.037 8.26 0 14.297 6.037L256 198.495l57.505-57.505q6.037-6.037 14.297-6.037 8.578 0 14.615 6.037l28.593 28.593q6.037 6.037 6.037 14.615zM500 256q0-66.401-32.724-122.477-32.724-56.075-88.799-88.799Q322.401 12 256 12q-66.401 0-122.477 32.724-56.075 32.724-88.799 88.799Q12 189.599 12 256q0 66.401 32.724 122.477 32.724 56.075 88.799 88.799Q189.599 500 256 500q66.401 0 122.477-32.724 56.075-32.724 88.799-88.799Q500 322.401 500 256z"></path>
</svg>
`;

View File

@ -0,0 +1,67 @@
/**
* Created by stefania on 7/17/17.
*/
import { Component, Input, OnInit } from '@angular/core';
import { Content, PageContent } from '../../domain/page-content';
import { HelpContentService } from '../../services/help-content.service';
import { ActivatedRoute, Router } from '@angular/router';
@Component({
selector: 'help-content',
template: `
<ng-template [ngIf]="contents && contents.length>0">
<ng-template ngFor let-content [ngForOf]="contents">
<div [innerHTML]="content.content" class="uk-margin-medium-bottom"></div>
</ng-template>
</ng-template>
`,
})
export class HelpContentComponent implements OnInit {
@Input('position')
position: string;
contents: Content[];
errorMessage: string = null;
constructor(private _helpContentService: HelpContentService, private route: ActivatedRoute, private router: Router) {
}
ngOnInit() {
this.errorMessage = null;
setTimeout(() => {
this._helpContentService.getActivePageContent( this.router.url ).subscribe(
pageContent => this.shiftThroughContent(pageContent),
error => this.handleError(<any>error)
);
}, 50);
}
shiftThroughContent(pageContent: PageContent) {
this.contents = pageContent.content[this.position];
/*console.log(`help-service for ${this.router.url} -> ${this.position} responded: ${JSON.stringify(this.contents)}`);*/
}
isPresent() {
return (this.contents && this.contents.length > 0);
}
handleError(error) {
this.errorMessage = 'System error retrieving page content (Server responded: ' + error + ')';
}
}
@Component({
selector: 'aside-help-content',
template: `
<ng-template [ngIf]="contents && contents.length>0">
<ng-template ngFor let-content [ngForOf]="contents">
<div [innerHTML]="content.content" class="uk-card uk-card-body uk-card-default sidemenu uk-margin-bottom"></div>
</ng-template>
</ng-template>
`,
})
export class AsideHelpContentComponent extends HelpContentComponent {
}

View File

@ -0,0 +1,73 @@
/**
* Created by stefania on 4/6/17.
*/
import {AfterContentInit, AfterViewInit, Component, ElementRef, Input, OnChanges, ViewChild} from "@angular/core";
@Component({
selector: "read-more",
template: `
<div [class.collapsed]="isCollapsed" [style.height]="isCollapsed ? maxHeight+'px' : 'auto'" #readMoreDiv>
<ng-content></ng-content>
</div>
<a *ngIf="isCollapsable" (click)="isCollapsed =! isCollapsed">View {{isCollapsed ? 'more' : 'less'}}...</a>
`,
styles: [`
div.collapsed {
overflow: hidden;
}
`]
})
export class ReadMoreComponent implements AfterContentInit {
//the text that need to be put in the container
//@Input() text: string;
//maximum height of the container
@Input("maxHeight") maxHeight: number = 100;
@ViewChild("readMoreDiv")
readMoreDiv: ElementRef;
//set these to false to get the height of the expended container
public isCollapsed: boolean = false;
public isCollapsable: boolean = false;
constructor(public elementRef: ElementRef) {
}
ngAfterContentInit() {
setTimeout(_ => {
let currentHeight = this.readMoreDiv.nativeElement.offsetHeight;
//collapsable only if the contents make container exceed the max height
if (currentHeight > this.maxHeight) {
this.isCollapsed = true;
this.isCollapsable = true;
} else {
}
}, 200);
}
}
@Component({
selector: "read-more-text",
template: `
<div [innerHTML]="text" [class.collapsed]="isCollapsed" [style.height]="isCollapsed ? maxHeight+'px' : 'auto'" #readMoreDiv>
<!--{{text}}-->
</div>
<a *ngIf="isCollapsable" (click)="isCollapsed =! isCollapsed">View {{isCollapsed ? 'more' : 'less'}}...</a>
`,
styles: [`
div.collapsed {
overflow: hidden;
}
`]
})
export class ReadMoreTextComponent extends ReadMoreComponent implements OnChanges, AfterViewInit {
@Input()
text: string = "";
ngAfterViewInit(): void {
this.ngAfterContentInit();
}
ngOnChanges(): void {
this.ngAfterContentInit();
}
}

View File

@ -0,0 +1,53 @@
/**
* Created by stefania on 4/6/17.
*/
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule } from '@angular/router';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { HttpClientModule } from '@angular/common/http';
import { AsideHelpContentComponent, HelpContentComponent } from './help-content.component';
import { HelpContentService } from '../../services/help-content.service';
// import { ModalModule, TabsModule } from 'ngx-bootstrap';
import { FooterComponent } from '../footer/footer.component';
import { ReadMoreComponent, ReadMoreTextComponent } from './read-more.component';
import { TopmenuComponent } from '../topmenu/top-menu.component';
const myGroups = [
];
@NgModule({
imports: [
CommonModule,
RouterModule,
// TabsModule.forRoot(),
// ModalModule.forRoot(),
FormsModule,
ReactiveFormsModule,
HttpClientModule,
],
declarations: [
HelpContentComponent,
AsideHelpContentComponent,
TopmenuComponent,
FooterComponent,
ReadMoreComponent,
ReadMoreTextComponent,
...myGroups
],
exports: [
HelpContentComponent,
AsideHelpContentComponent,
TopmenuComponent,
FooterComponent,
...myGroups,
ReadMoreComponent,
ReadMoreTextComponent
],
providers: [
HelpContentService
],
})
export class ReusableComponentsModule {
}

View File

@ -0,0 +1,54 @@
<header id="header_main">
<nav class="uk-navbar">
<div class="uk-container uk-container-large uk-container-center">
<a href="#" class="uk-float-left" id="mobile_navigation_toggle" data-uk-offcanvas="{target:'#mobile_navigation'}"><i class="material-icons">&#xE5D2;</i></a>
<a href="/" class="uk-navbar-brand">
<img src="https://www.openaire.eu/images/OpenAIRE_branding/Logo_Horizontal.png" alt="" width="152" height="30">
</a>
<div class="uk-navbar-flip">
<ul class="uk-navbar-nav" id="main_navigation">
<li>
<a href="#sect-overview">
About
</a>
</li>
<li>
<a href="#sect-features">
Help
</a>
</li>
<li>
<a href="#sect-gallery">
Sign In
</a>
</li>
</ul>
</div>
</div>
</nav>
</header>
<div id="mobile_navigation" class="uk-offcanvas">
<div class="uk-offcanvas-bar">
<ul>
<li>
<a href="#sect-overview" data-uk-smooth-scroll="{offset: 48}">
<span class="menu_icon"><i class="material-icons">&#xE417;</i></span>
<span class="menu_title">About</span>
</a>
</li>
<li>
<a href="#sect-features" data-uk-smooth-scroll="{offset: 48}">
<span class="menu_icon"><i class="material-icons">&#xE896;</i></span>
<span class="menu_title">Help</span>
</a>
</li>
<li>
<a href="#sect-gallery" data-uk-smooth-scroll="{offset: 48}">
<span class="menu_icon"><i class="material-icons">&#xE410;</i></span>
<span class="menu_title">Sign In</span>
</a>
</li>
</ul>
</div>
</div>

View File

@ -0,0 +1,11 @@
import { Component, DoCheck, OnInit, ViewEncapsulation } from '@angular/core';
@Component({
selector: 'app-top-menu',
templateUrl: './top-menu.component.html',
// styleUrls: ['./top-menu.component.css'],
encapsulation: ViewEncapsulation.None
})
export class TopmenuComponent {
}

0
src/assets/.gitkeep Normal file
View File

6172
src/assets/css/main.css Executable file

File diff suppressed because it is too large Load Diff

2
src/assets/css/main.min.css vendored Executable file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,219 @@
@import url('https://fonts.googleapis.com/css?family=Open+Sans:300,400,700&display=swap');
body {
font: 400 14px/19px 'Open Sans';
}
h1, h2, h3, h4, h5, h6 {
font-family: 'Open Sans', sans-serif;
}
.uk-container-large {
max-width: 1600px;
}
.uk-container-expand {
max-width: none;
}
#sect-overview, #sect-tabs {
padding: 20px 0;
}
.greySection {
background-color: #F0F0F0;
}
.mapContainer {
/*background: #F7F7F7 0% 0% no-repeat padding-box;*/
/*border: 1px solid #E0E0E0;*/
/*opacity: 0.4;*/
/*padding: 15px;*/
position: relative;
height: 100%;
}
.mapContainerEmbed {
height: 100%;
}
.map {
/*height: 398px;*/
border: 1px solid #707070;
/*margin: 15px;*/
position: absolute;
height: 88%;
width: 100%;
}
.mapControls {
position: absolute;
bottom: 20px;
}
.uk-nav-label {
width: 12px;
height: 12px;
display: inline-block;
vertical-align: -1px;
margin-right: 8px;
}
.uk-nav-horizontal li {
display: inline-block;
}
.mapControls .text {
opacity: 0.5;
}
.mapControls .text.active {
opacity: 1;
}
.dark-blue-box {
background: #002D60 0% 0% no-repeat padding-box;
border: 1px solid #707070;
border-radius: 2px;
opacity: 1;
color: #fff;
}
.infoBox {
font-weight: 300;
font-size: 15px;
}
.infoBox h3 {
font-weight: bold;
}
.infoBox ul {
padding-left: 18px;
}
.infoBox ul li {
margin-bottom: 20px;
letter-spacing: 0px;
line-height: 27px;
}
.dark-blue-box h3 {
color: #fff;
}
a.backToOriginalInfoBox, a.backToOriginalInfoBox:hover, a.backToOriginalInfoBox:focus {
color: #fff;
}
.greyBoldDivider {
border: 1px solid #707070;
}
.numbers .number {
font-size: 28px;
}
.indicatorCards .md-card {
box-shadow: 0px 2px 6px #00000038;
}
/********* Mock chart for country **********/
.epc_chart {
display: block;
position: relative;
}
.epc_chart_text {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
text-align: center;
font: 400 20px/110px Roboto,sans-serif;
}
/********************************************/
.md-btn-primary {
background: #1F73F7 0% 0% no-repeat padding-box;
box-shadow: 0px 3px 6px #00000029;
border-radius: 26px;
opacity: 1;
text-align: left;
font: 14px/19px Open Sans;
font-weight: 400;
letter-spacing: 0;
color: #FFFFFF;
text-transform: none;
/*padding: 10px 30px;*/
}
.md-btn-secondary {
background: #034DA1 0% 0% no-repeat padding-box;
box-shadow: 0px 2px 6px #00000038;
border-radius: 23px;
opacity: 1;
opacity: 1;
text-align: left;
font: 14px/19px Open Sans;
font-weight: 400;
letter-spacing: 0;
color: #FFFFFF;
text-transform: none;
/*padding: 7px 30px;*/
}
.number {
font-weight: bold;
}
#sect-tabs .uk-tab > li > a {
text-transform: none;
}
#team_tabbed {
background: #FBFBFB 0% 0% no-repeat padding-box;
border: 1px solid #E0E0E0;
}
.tabContent {
padding: 30px 50px;
}
.uk-tab {
display: flex;
}
.uk-tab > li.uk-active > a {
font-weight: bold;
}
/*.uk-tab-center.uk-tab {*/
/*position: relative;*/
/*right: 50%;*/
/*border: none;*/
/*float: right;*/
/*}*/
.uk-subnav-pill > .uk-active > * {
background: #1F73F7;
}
.dataView.uk-subnav-pill > * > * {
padding: 6px 10px;
border-radius: 50%;
border: 1px solid;
}
.tabContent hr {
margin: 30px 0;
}
.dataContent {
background-color: #FFFFFF;
border: 1px solid #E0E0E0;
padding: 30px;
}

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 453 KiB

165
src/assets/js/altair_lp_common.js Executable file
View File

@ -0,0 +1,165 @@
// variables
var $body = $('body'),
$html = $('html'),
$window = $(window),
$document = $(document),
$header_main = $('#header_main'),
header_main_height = $header_main.height(),
easing_swiftOut = [ 0.35,0,0.25,1 ];
bez_easing_swiftOut = $.bez(easing_swiftOut);
/* Detect hi-res devices */
function isHighDensity() {
return ((window.matchMedia && (window.matchMedia('only screen and (min-resolution: 124dpi), only screen and (min-resolution: 1.3dppx), only screen and (min-resolution: 48.8dpcm)').matches || window.matchMedia('only screen and (-webkit-min-device-pixel-ratio: 1.3), only screen and (-o-min-device-pixel-ratio: 2.6/2), only screen and (min--moz-device-pixel-ratio: 1.3), only screen and (min-device-pixel-ratio: 1.3)').matches)) || (window.devicePixelRatio && window.devicePixelRatio > 1.3));
}
/*
* Dynamically loading an external JavaScript or CSS file
* http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml
*/
function loadjscssfile(b,c){if("js"==c){var a=document.createElement("script");a.setAttribute("type","text/javascript");a.setAttribute("src",b)}else"css"==c&&(a=document.createElement("link"),a.setAttribute("rel","stylesheet"),a.setAttribute("type","text/css"),a.setAttribute("href",b));"undefined"!=typeof a&&document.getElementsByTagName("head")[0].appendChild(a)};
/* detect touch devices */
function isTouchDevice() {
return 'ontouchstart' in document.documentElement;
}
$(function() {
// header main
altair_header_main.init();
// inputs
altair_md.init();
});
$window.on('load',function () {
if(isHighDensity()) {
loadjscssfile("bower_components/dense/src/dense.js", "js");
// enable hires images
$('img').dense({
glue: "@"
});
}
if (isTouchDevice()) {
// fastClick (touch devices)
FastClick.attach(document.body);
}
});
altair_header_main = {
init: function () {
// sticky header
altair_header_main.sticky_header();
// main navigation
altair_header_main.main_navigation();
},
sticky_header: function () {
$body.addClass('header_sticky');
$(window).on("scroll touchmove", function () {
$body.toggleClass('header_shadow', $(document).scrollTop() > 0);
});
},
main_navigation: function() {
$('#main_navigation').onePageNav({
currentClass: 'current_active',
changeHash: false,
scrollSpeed: 840,
scrollThreshold: 0.4,
filter: '',
scrollOffset: -header_main_height,
easing: bez_easing_swiftOut,
begin: function() {
//Hack so you can click other menu items after the initial click (IOS)
//$('body').append('<div id="device-dummy" style="height: 1px;"></div>');
},
end: function() {
$('#device-dummy').remove();
},
scrollChange: function($currentListItem) {
//I get fired when you enter a section and I pass the list item of the section
}
});
}
};
altair_md = {
init: function () {
altair_md.inputs();
},
inputs: function(parent) {
var $mdInput = (typeof parent === 'undefined') ? $('.md-input') : $(parent).find('.md-input');
$mdInput.each(function() {
if(!$(this).closest('.md-input-wrapper').length) {
var $this = $(this),
extraClass = '';
if($this.is('[class*="uk-form-width-"]')) {
var elClasses = $this.attr('class').split (' ');
for(var i = 0; i < elClasses.length; i++){
var classPart = elClasses[i].substr(0,14);
if(classPart == "uk-form-width-"){
var extraClass = elClasses[i];
}
}
}
if( $this.prev('label').length ) {
$this.prev('label').andSelf().wrapAll('<div class="md-input-wrapper"/>');
} else if($this.siblings('[data-uk-form-password]').length) {
$this.siblings('[data-uk-form-password]').andSelf().wrapAll('<div class="md-input-wrapper"/>');
} else {
$this.wrap('<div class="md-input-wrapper"/>');
}
$this.closest('.md-input-wrapper').append('<span class="md-input-bar '+extraClass+'"/>');
altair_md.update_input($this);
}
$body
.on('focus', '.md-input', function() {
$(this).closest('.md-input-wrapper').addClass('md-input-focus')
})
.on('blur', '.md-input', function() {
$(this).closest('.md-input-wrapper').removeClass('md-input-focus');
if(!$(this).hasClass('label-fixed')) {
if($(this).val() != '') {
$(this).closest('.md-input-wrapper').addClass('md-input-filled')
} else {
$(this).closest('.md-input-wrapper').removeClass('md-input-filled')
}
}
})
.on('change', '.md-input', function() {
altair_md.update_input($(this));
});
})
},
update_input: function(object) {
// clear wrapper classes
object.closest('.uk-input-group').removeClass('uk-input-group-danger uk-input-group-success');
object.closest('.md-input-wrapper').removeClass('md-input-wrapper-danger md-input-wrapper-success md-input-wrapper-disabled');
if(object.hasClass('md-input-danger')) {
if(object.closest('.uk-input-group').length) {
object.closest('.uk-input-group').addClass('uk-input-group-danger')
}
object.closest('.md-input-wrapper').addClass('md-input-wrapper-danger')
}
if(object.hasClass('md-input-success')) {
if(object.closest('.uk-input-group').length) {
object.closest('.uk-input-group').addClass('uk-input-group-success')
}
object.closest('.md-input-wrapper').addClass('md-input-wrapper-success')
}
if(object.prop('disabled')) {
object.closest('.md-input-wrapper').addClass('md-input-wrapper-disabled')
}
if(object.hasClass('label-fixed')) {
object.closest('.md-input-wrapper').addClass('md-input-filled')
}
if(object.val() != '') {
object.closest('.md-input-wrapper').addClass('md-input-filled')
}
}
};

1
src/assets/js/altair_lp_common.min.js vendored Executable file
View File

@ -0,0 +1 @@
var $body=$("body"),$html=$("html"),$window=$(window),$document=$(document),$header_main=$("#header_main"),header_main_height=$header_main.height(),easing_swiftOut=[.35,0,.25,1];function isHighDensity(){return window.matchMedia&&(window.matchMedia("only screen and (min-resolution: 124dpi), only screen and (min-resolution: 1.3dppx), only screen and (min-resolution: 48.8dpcm)").matches||window.matchMedia("only screen and (-webkit-min-device-pixel-ratio: 1.3), only screen and (-o-min-device-pixel-ratio: 2.6/2), only screen and (min--moz-device-pixel-ratio: 1.3), only screen and (min-device-pixel-ratio: 1.3)").matches)||window.devicePixelRatio&&1.3<window.devicePixelRatio}function loadjscssfile(e,i){if("js"==i){var t=document.createElement("script");t.setAttribute("type","text/javascript"),t.setAttribute("src",e)}else"css"==i&&((t=document.createElement("link")).setAttribute("rel","stylesheet"),t.setAttribute("type","text/css"),t.setAttribute("href",e));void 0!==t&&document.getElementsByTagName("head")[0].appendChild(t)}function isTouchDevice(){return"ontouchstart"in document.documentElement}bez_easing_swiftOut=$.bez(easing_swiftOut),$(function(){altair_header_main.init(),altair_md.init()}),$window.on("load",function(){isHighDensity()&&(loadjscssfile("bower_components/dense/src/dense.js","js"),$("img").dense({glue:"@"})),isTouchDevice()&&FastClick.attach(document.body)}),altair_header_main={init:function(){altair_header_main.sticky_header(),altair_header_main.main_navigation()},sticky_header:function(){$body.addClass("header_sticky"),$(window).on("scroll touchmove",function(){$body.toggleClass("header_shadow",0<$(document).scrollTop())})},main_navigation:function(){$("#main_navigation").onePageNav({currentClass:"current_active",changeHash:!1,scrollSpeed:840,scrollThreshold:.4,filter:"",scrollOffset:-header_main_height,easing:bez_easing_swiftOut,begin:function(){},end:function(){$("#device-dummy").remove()},scrollChange:function(e){}})}},altair_md={init:function(){altair_md.inputs()},inputs:function(e){(void 0===e?$(".md-input"):$(e).find(".md-input")).each(function(){if(!$(this).closest(".md-input-wrapper").length){var e=$(this),i="";if(e.is('[class*="uk-form-width-"]'))for(var t=e.attr("class").split(" "),n=0;n<t.length;n++){if("uk-form-width-"==t[n].substr(0,14))i=t[n]}e.prev("label").length?e.prev("label").andSelf().wrapAll('<div class="md-input-wrapper"/>'):e.siblings("[data-uk-form-password]").length?e.siblings("[data-uk-form-password]").andSelf().wrapAll('<div class="md-input-wrapper"/>'):e.wrap('<div class="md-input-wrapper"/>'),e.closest(".md-input-wrapper").append('<span class="md-input-bar '+i+'"/>'),altair_md.update_input(e)}$body.on("focus",".md-input",function(){$(this).closest(".md-input-wrapper").addClass("md-input-focus")}).on("blur",".md-input",function(){$(this).closest(".md-input-wrapper").removeClass("md-input-focus"),$(this).hasClass("label-fixed")||(""!=$(this).val()?$(this).closest(".md-input-wrapper").addClass("md-input-filled"):$(this).closest(".md-input-wrapper").removeClass("md-input-filled"))}).on("change",".md-input",function(){altair_md.update_input($(this))})})},update_input:function(e){e.closest(".uk-input-group").removeClass("uk-input-group-danger uk-input-group-success"),e.closest(".md-input-wrapper").removeClass("md-input-wrapper-danger md-input-wrapper-success md-input-wrapper-disabled"),e.hasClass("md-input-danger")&&(e.closest(".uk-input-group").length&&e.closest(".uk-input-group").addClass("uk-input-group-danger"),e.closest(".md-input-wrapper").addClass("md-input-wrapper-danger")),e.hasClass("md-input-success")&&(e.closest(".uk-input-group").length&&e.closest(".uk-input-group").addClass("uk-input-group-success"),e.closest(".md-input-wrapper").addClass("md-input-wrapper-success")),e.prop("disabled")&&e.closest(".md-input-wrapper").addClass("md-input-wrapper-disabled"),e.hasClass("label-fixed")&&e.closest(".md-input-wrapper").addClass("md-input-filled"),""!=e.val()&&e.closest(".md-input-wrapper").addClass("md-input-filled")}};

10928
src/assets/js/common.js Executable file

File diff suppressed because it is too large Load Diff

1
src/assets/js/common.min.js vendored Executable file

File diff suppressed because one or more lines are too long

399
src/assets/js/custom/dense.js Executable file
View File

@ -0,0 +1,399 @@
/**
* Dense - Device pixel ratio aware images
*
* @link http://dense.rah.pw
* @license MIT
*/
/*
* Copyright (C) 2013 Jukka Svahn
*
* 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.
*/
/**
* @name jQuery
* @class
*/
/**
* @name fn
* @class
* @memberOf jQuery
*/
(function (factory)
{
'use strict';
if (typeof define === 'function' && define.amd)
{
define(['jquery'], factory);
}
else
{
factory(window.jQuery || window.Zepto);
}
}(function ($)
{
'use strict';
/**
* An array of checked image URLs.
*/
var pathStack = [],
/**
* Methods.
*/
methods = {},
/**
* Regular expression to check whether the URL has a protocol.
*
* Is used to check whether the image URL is external.
*/
regexHasProtocol = /^([a-z]:)?\/\//i,
/**
* Regular expression that split extensions from the file.
*
* Is used to inject the DPR suffix to the name.
*/
regexSuffix = /\.\w+$/,
/**
* Device pixel ratio.
*/
devicePixelRatio;
/**
* Init is the default method responsible for rendering
* a pixel-ratio-aware images.
*
* This method is used to select the images that
* should display retina-size images on high pixel ratio
* devices. Dense defaults to the init method if no
* method is specified.
*
* When attached to an image, the correct image variation is
* selected based on the device's pixel ratio. If the image element
* defines <code>data-{ratio}x</code> attributes (e.g. data-1x, data-2x, data-3x),
* the most appropriate of those is selected.
*
* If no data-ratio attributes are defined, the retina image is
* constructed from the <code>src</code> attribute.
* The searched high pixel ratio images follows
* a <code>{imageName}_{ratio}x.{ext}</code> naming convention.
* For an image found in /path/to/images/image.jpg, the 2x retina
* image would be looked from /path/to/images/image_2x.jpg.
*
* When image is constructed from the src, the image existance is
* verified using HTTP HEAD request, if <code>ping</code> option is
* <code>true</code>. The check makes sure no HTTP error code is returned,
* and that the received content-type is of an image. Vector image formats,
* like svg, are skipped based on the file extension.
*
* This method can also be used to load image in semi-lazy fashion,
* and avoid larger extra HTTP requests due to retina replacements.
* The data-1x attribute can be used to supstitute the src, making
* sure the browser doesn't try to download the normal image variation
* before the JavaScript driven behaviour kicks in.
*
* Some classes are added to the selected elements while Dense is processing
* the document. These classes include <code>dense-image</code>, <code>dense-loading</code>
* and <code>dense-ready</code>. These classes can be used to style the images,
* or hide them while they are being loaded.
*
* @param {Object} [options={}] Options
* @param {Boolean} [options.ping=null] Check image existence. If the default <code>NULL</code> checks local images, <code>FALSE</code> disables checking and <code>TRUE</code> checks even external images cross-domain
* @param {String} [options.dimensions=preserve] What to do with the image's <code>width</code> and <code>height</code> attributes. Either <code>update</code>, <code>remove</code> or <code>preserve</code>
* @param {String} [options.glue=_] String that glues the retina "nx" suffix to the image. This option can be used to change the naming convention between the two commonly used practices, <code>image@2x.jpg</code> and <code>image_2x.jpg</code>
* @param {Array} [options.skipExtensions=['svg']] Skipped image file extensions. There might be situations where you might want to exclude vector image formats
* @return {Object} this
* @method init
* @memberof jQuery.fn.dense
* @fires jQuery.fn.dense#denseRetinaReady.dense
* @example
* $('img').dense({
* ping: false,
* dimension: 'update'
* });
*/
methods.init = function (options)
{
options = $.extend({
ping: null,
dimensions: 'preserve',
glue: '_',
skipExtensions: ['svg']
}, options);
this.each(function ()
{
var $this = $(this);
if (!$this.is('img') || $this.hasClass('dense-image'))
{
return;
}
$this.addClass('dense-image dense-loading');
var image = methods.getImageAttribute.call(this),
originalImage = $this.attr('src'),
ping = false,
updateImage;
if (!image)
{
if (!originalImage || devicePixelRatio === 1 || $.inArray(originalImage.split('.').pop().split(/[\?\#]/).shift(), options.skipExtensions) !== -1)
{
$this.removeClass('dense-image dense-loading');
return;
}
image = originalImage.replace(regexSuffix, function (extension)
{
var pixelRatio = $this.attr('data-dense-cap') ? $this.attr('data-dense-cap') : devicePixelRatio;
return options.glue + pixelRatio + 'x' + extension;
});
ping = options.ping !== false && $.inArray(image, pathStack) === -1 && (options.ping === true || !regexHasProtocol.test(image) || image.indexOf('//'+document.domain) === 0 || image.indexOf(document.location.protocol+'//'+document.domain) === 0);
}
updateImage = function ()
{
var readyImage = function ()
{
$this.removeClass('dense-loading').addClass('dense-ready').trigger('denseRetinaReady.dense');
};
$this.attr('src', image);
if (options.dimensions === 'update')
{
$this.dense('updateDimensions').one('denseDimensionChanged', readyImage);
}
else
{
if (options.dimensions === 'remove')
{
$this.removeAttr('width height');
}
readyImage();
}
};
if (ping)
{
$.ajax({
url : image,
type : 'HEAD'
})
.done(function (data, textStatus, jqXHR)
{
var type = jqXHR.getResponseHeader('Content-type');
if (!type || type.indexOf('image/') === 0)
{
pathStack.push(image);
updateImage();
}
});
}
else
{
updateImage();
}
});
return this;
};
/**
* Sets an image's width and height attributes to its native values.
*
* Updates an img element's dimensions to the source image's
* real values. This method is asynchronous, so you can not directly
* return its values. Instead, use the 'dense-dimensions-updated'
* event to detect when the action is done.
*
* @return {Object} this
* @method updateDimensions
* @memberof jQuery.fn.dense
* @fires jQuery.fn.dense#denseDimensionChanged.dense
* @example
* var image = $('img').dense('updateDimensions');
*/
methods.updateDimensions = function ()
{
return this.each(function ()
{
var img, $this = $(this), src = $this.attr('src');
if (src)
{
img = new Image();
img.src = src;
$(img).on('load.dense', function ()
{
$this.attr({
width: img.width,
height: img.height
}).trigger('denseDimensionChanged.dense');
});
}
});
};
/**
* Gets device pixel ratio rounded up to the closest integer.
*
* @return {Integer} The pixel ratio
* @method devicePixelRatio
* @memberof jQuery.fn.dense
* @example
* var ratio = $(window).dense('devicePixelRatio');
* alert(ratio);
*/
methods.devicePixelRatio = function ()
{
var pixelRatio = 1;
if ($.type(window.devicePixelRatio) !== 'undefined')
{
pixelRatio = window.devicePixelRatio;
}
else if ($.type(window.matchMedia) !== 'undefined')
{
$.each([1.3, 2, 3, 4, 5, 6], function (key, ratio)
{
var mediaQuery = [
'(-webkit-min-device-pixel-ratio: '+ratio+')',
'(min-resolution: '+Math.floor(ratio*96)+'dpi)',
'(min-resolution: '+ratio+'dppx)'
].join(',');
if (!window.matchMedia(mediaQuery).matches)
{
return false;
}
pixelRatio = ratio;
});
}
return Math.ceil(pixelRatio);
};
/**
* Gets an appropriate URL for the pixel ratio from the data attribute list.
*
* Selects the most appropriate <code>data-{ratio}x</code> attribute from
* the given element's attributes. If the devices pixel ratio is greater
* than the largest specified image, the largest one of the available is used.
*
* @return {String|Boolean} The attribute value
* @method getImageAttribute
* @memberof jQuery.fn.dense
* @example
* var image = $('<div data-1x="image.jpg" data-2x="image_2x.jpg" />').dense('getImageAttribute');
* $('body').css('background-image', 'url(' + image + ')');
*/
methods.getImageAttribute = function ()
{
var $this = $(this).eq(0), image = false, url;
for (var i = 1; i <= devicePixelRatio; i++)
{
url = $this.attr('data-' + i + 'x');
if (url)
{
image = url;
}
}
return image;
};
devicePixelRatio = methods.devicePixelRatio();
/**
* Dense offers few methods and options that can be used to both customize the
* plugin's functionality and return resulting values. All interaction is done through
* the <code>$.fn.dense()</code> method, that accepts a called method and its options
* object as its arguments. Both arguments are optional, and either one can be omitted.
*
* @param {String} [method=init] The called method
* @param {Object} [options={}] Options passed to the method
* @class dense
* @memberof jQuery.fn
*/
$.fn.dense = function (method, options)
{
if ($.type(method) !== 'string' || $.type(methods[method]) !== 'function')
{
options = method;
method = 'init';
}
return methods[method].call(this, options);
};
/**
* Initialize automatically when document is ready.
*
* Dense is initialized automatically if the body element
* has a <code>dense-retina</code> class.
*/
$(function ()
{
$('body.dense-retina img').dense();
});
/**
* This event is invoked when a retina image has finished loading.
*
* @event jQuery.fn.dense#denseRetinaReady.dense
* @type {Object}
*/
/**
* This event is invoked when an image's dimension values
* have been updated by the <code>updateDimensions</code>
* method.
*
* @event jQuery.fn.dense#denseDimensionChanged.dense
* @type {Object}
*/
}));

1
src/assets/js/custom/dense.min.js vendored Executable file
View File

@ -0,0 +1 @@
!function(e){"use strict";"function"==typeof define&&define.amd?define(["jquery"],e):e(window.jQuery||window.Zepto)}(function(e){"use strict";var n,i=[],t={},a=/^([a-z]:)?\/\//i;t.init=function(d){return d=e.extend({ping:null,dimensions:"preserve",glue:"_",skipExtensions:["svg"]},d),this.each(function(){var s=e(this);if(s.is("img")&&!s.hasClass("dense-image")){s.addClass("dense-image dense-loading");var o,r=t.getImageAttribute.call(this),u=s.attr("src"),c=!1;if(!r){if(!u||1===n||-1!==e.inArray(u.split(".").pop().split(/[\?\#]/).shift(),d.skipExtensions))return void s.removeClass("dense-image dense-loading");r=u.replace(/\.\w+$/,function(e){var i=s.attr("data-dense-cap")?s.attr("data-dense-cap"):n;return d.glue+i+"x"+e}),c=!1!==d.ping&&-1===e.inArray(r,i)&&(!0===d.ping||!a.test(r)||0===r.indexOf("//"+document.domain)||0===r.indexOf(document.location.protocol+"//"+document.domain))}o=function(){var e=function(){s.removeClass("dense-loading").addClass("dense-ready").trigger("denseRetinaReady.dense")};s.attr("src",r),"update"===d.dimensions?s.dense("updateDimensions").one("denseDimensionChanged",e):("remove"===d.dimensions&&s.removeAttr("width height"),e())},c?e.ajax({url:r,type:"HEAD"}).done(function(e,n,t){var a=t.getResponseHeader("Content-type");a&&0!==a.indexOf("image/")||(i.push(r),o())}):o()}}),this},t.updateDimensions=function(){return this.each(function(){var n,i=e(this),t=i.attr("src");t&&(n=new Image,n.src=t,e(n).on("load.dense",function(){i.attr({width:n.width,height:n.height}).trigger("denseDimensionChanged.dense")}))})},t.devicePixelRatio=function(){var n=1;return"undefined"!==e.type(window.devicePixelRatio)?n=window.devicePixelRatio:"undefined"!==e.type(window.matchMedia)&&e.each([1.3,2,3,4,5,6],function(e,i){var t=["(-webkit-min-device-pixel-ratio: "+i+")","(min-resolution: "+Math.floor(96*i)+"dpi)","(min-resolution: "+i+"dppx)"].join(",");if(!window.matchMedia(t).matches)return!1;n=i}),Math.ceil(n)},t.getImageAttribute=function(){for(var i,t=e(this).eq(0),a=!1,d=1;d<=n;d++)(i=t.attr("data-"+d+"x"))&&(a=i);return a},n=t.devicePixelRatio(),e.fn.dense=function(n,i){return"string"===e.type(n)&&"function"===e.type(t[n])||(i=n,n="init"),t[n].call(this,i)},e(function(){e("body.dense-retina img").dense()})});

View File

@ -0,0 +1,258 @@
/*
* jQuery One Page Nav Plugin
* http://github.com/davist11/jQuery-One-Page-Nav
*
* Copyright (c) 2010 Trevor Davis (http://trevordavis.net)
* Dual licensed under the MIT and GPL licenses.
* Uses the same license as jQuery, see:
* http://jquery.org/license
*
* @version 3.0.0
*
* Example usage:
* $('#nav').onePageNav({
* currentClass: 'current',
* changeHash: false,
* scrollSpeed: 750
* });
*/
;(function($, window, document, undefined){
// our plugin constructor
var OnePageNav = function(elem, options){
this.elem = elem;
this.$elem = $(elem);
this.options = options;
this.metadata = this.$elem.data('plugin-options');
this.$win = $(window);
this.sections = {};
this.didScroll = false;
this.$doc = $(document);
this.docHeight = this.$doc.height();
};
// the plugin prototype
OnePageNav.prototype = {
defaults: {
navItems: 'a',
currentClass: 'current',
changeHash: false,
easing: 'swing',
filter: '',
scrollOffset: 0,
scrollSpeed: 750,
scrollThreshold: 0.5,
begin: false,
end: false,
scrollChange: false
},
init: function() {
// Introduce defaults that can be extended either
// globally or using an object literal.
this.config = $.extend({}, this.defaults, this.options, this.metadata);
this.$nav = this.$elem.find(this.config.navItems);
//Filter any links out of the nav
if(this.config.filter !== '') {
this.$nav = this.$nav.filter(this.config.filter);
}
//Handle clicks on the nav
this.$nav.on('click.onePageNav', $.proxy(this.handleClick, this));
//Get the section positions
this.getPositions();
//Handle scroll changes
this.bindInterval();
//Update the positions on resize too
this.$win.on('resize.onePageNav', $.proxy(this.getPositions, this));
return this;
},
adjustNav: function(self, $parent) {
self.$elem.find('.' + self.config.currentClass).removeClass(self.config.currentClass);
$parent.addClass(self.config.currentClass);
},
bindInterval: function() {
var self = this;
var docHeight;
self.$win.on('scroll.onePageNav', function() {
self.didScroll = true;
});
self.t = setInterval(function() {
docHeight = self.$doc.height();
//If it was scrolled
if(self.didScroll) {
self.didScroll = false;
self.scrollChange();
}
//If the document height changes
if(docHeight !== self.docHeight) {
self.docHeight = docHeight;
self.getPositions();
}
}, 250);
},
getHash: function($link) {
return $link.attr('href').split('#')[1];
},
getPositions: function() {
var self = this;
var linkHref;
var topPos;
var $target;
self.$nav.each(function() {
linkHref = self.getHash($(this));
$target = $('#' + linkHref);
if($target.length) {
topPos = $target.offset().top;
self.sections[linkHref] = Math.round(topPos);
}
});
},
getSection: function(windowPos) {
var returnValue = null;
var windowHeight = Math.round(this.$win.height() * this.config.scrollThreshold);
// Sort Sections by Position
this.sections = this.sortSectionsByPosition(this.sections);
for(var section in this.sections) {
if((this.sections[section] - windowHeight) < windowPos) {
returnValue = section;
}
}
return returnValue;
},
/**
* Sort Sections by its position value
* based on http://am.aurlien.net/post/1221493460/sorting-javascript-objects
* @param {Object} obj Object to sort
* @return {Object} sorted Object
*/
sortSectionsByPosition: function (obj) {
var tempArray = [];
var tempObj = {};
// Transform Object in Array
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
tempArray.push(key);
}
}
tempArray.sort(function(a,b) {
var x = obj[a];
var y = obj[b];
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
});
// Transform sorted tempArray back into Object
for (var i=0; i<tempArray.length; i++) {
tempObj[tempArray[i]] = obj[tempArray[i]];
}
return tempObj;
},
handleClick: function(e) {
var self = this;
var $link = $(e.currentTarget);
var $parent = $link.parent();
var newLoc = '#' + self.getHash($link);
if(!$parent.hasClass(self.config.currentClass)) {
//Start callback
if(self.config.begin) {
self.config.begin();
}
//Change the highlighted nav item
self.adjustNav(self, $parent);
//Removing the auto-adjust on scroll
self.unbindInterval();
//Scroll to the correct position
self.scrollTo(newLoc, function() {
//Do we need to change the hash?
if(self.config.changeHash) {
window.location.hash = newLoc;
}
//Add the auto-adjust on scroll back in
self.bindInterval();
//End callback
if(self.config.end) {
self.config.end();
}
});
}
e.preventDefault();
},
scrollChange: function() {
var windowTop = this.$win.scrollTop();
var position = this.getSection(windowTop);
var $parent;
//If the position is set
if(position !== null) {
$parent = this.$elem.find('a[href$="#' + position + '"]').parent();
//If it's not already the current section
if(!$parent.hasClass(this.config.currentClass)) {
//Change the highlighted nav item
this.adjustNav(this, $parent);
//If there is a scrollChange callback
if(this.config.scrollChange) {
this.config.scrollChange($parent);
}
}
}
},
scrollTo: function(target, callback) {
var offset = $(target).offset().top;
$('html, body').animate({
scrollTop: offset + this.config.scrollOffset
}, this.config.scrollSpeed, this.config.easing, callback);
},
unbindInterval: function() {
clearInterval(this.t);
this.$win.unbind('scroll.onePageNav');
}
};
OnePageNav.defaults = OnePageNav.prototype.defaults;
$.fn.onePageNav = function(options) {
return this.each(function() {
new OnePageNav(this, options).init();
});
};
})( jQuery, window , document );

1
src/assets/js/custom/jquery.nav.min.js vendored Executable file
View File

@ -0,0 +1 @@
!function(t,n,i,s){var e=function(s,e){this.elem=s,this.$elem=t(s),this.options=e,this.metadata=this.$elem.data("plugin-options"),this.$win=t(n),this.sections={},this.didScroll=!1,this.$doc=t(i),this.docHeight=this.$doc.height()};e.prototype={defaults:{navItems:"a",currentClass:"current",changeHash:!1,easing:"swing",filter:"",scrollOffset:0,scrollSpeed:750,scrollThreshold:.5,begin:!1,end:!1,scrollChange:!1},init:function(){return this.config=t.extend({},this.defaults,this.options,this.metadata),this.$nav=this.$elem.find(this.config.navItems),""!==this.config.filter&&(this.$nav=this.$nav.filter(this.config.filter)),this.$nav.on("click.onePageNav",t.proxy(this.handleClick,this)),this.getPositions(),this.bindInterval(),this.$win.on("resize.onePageNav",t.proxy(this.getPositions,this)),this},adjustNav:function(t,n){t.$elem.find("."+t.config.currentClass).removeClass(t.config.currentClass),n.addClass(t.config.currentClass)},bindInterval:function(){var t,n=this;n.$win.on("scroll.onePageNav",function(){n.didScroll=!0}),n.t=setInterval(function(){t=n.$doc.height(),n.didScroll&&(n.didScroll=!1,n.scrollChange()),t!==n.docHeight&&(n.docHeight=t,n.getPositions())},250)},getHash:function(t){return t.attr("href").split("#")[1]},getPositions:function(){var n,i,s,e=this;e.$nav.each(function(){n=e.getHash(t(this)),s=t("#"+n),s.length&&(i=s.offset().top,e.sections[n]=Math.round(i))})},getSection:function(t){var n=null,i=Math.round(this.$win.height()*this.config.scrollThreshold);this.sections=this.sortSectionsByPosition(this.sections);for(var s in this.sections)this.sections[s]-i<t&&(n=s);return n},sortSectionsByPosition:function(t){var n=[],i={};for(var s in t)t.hasOwnProperty(s)&&n.push(s);n.sort(function(n,i){var s=t[n],e=t[i];return e>s?-1:s>e?1:0});for(var e=0;e<n.length;e++)i[n[e]]=t[n[e]];return i},handleClick:function(i){var s=this,e=t(i.currentTarget),o=e.parent(),a="#"+s.getHash(e);o.hasClass(s.config.currentClass)||(s.config.begin&&s.config.begin(),s.adjustNav(s,o),s.unbindInterval(),s.scrollTo(a,function(){s.config.changeHash&&(n.location.hash=a),s.bindInterval(),s.config.end&&s.config.end()})),i.preventDefault()},scrollChange:function(){var t,n=this.$win.scrollTop(),i=this.getSection(n);null!==i&&(t=this.$elem.find('a[href$="#'+i+'"]').parent(),t.hasClass(this.config.currentClass)||(this.adjustNav(this,t),this.config.scrollChange&&this.config.scrollChange(t)))},scrollTo:function(n,i){var s=t(n).offset().top;t("html, body").animate({scrollTop:s+this.config.scrollOffset},this.config.scrollSpeed,this.config.easing,i)},unbindInterval:function(){clearInterval(this.t),this.$win.unbind("scroll.onePageNav")}},e.defaults=e.prototype.defaults,t.fn.onePageNav=function(t){return this.each(function(){new e(this,t).init()})}}(jQuery,window,document);

View File

@ -0,0 +1,101 @@
// http://getuikit.com/docs/documentation_javascript.html#js-override
if (typeof UIkit !== 'undefined') {
UIkit.on('beforeready.uk.dom', function () {
// accrodion
if (typeof UIkit.components.accordion !== "undefined") { // check if accordion component is defined
$.extend(UIkit.components.accordion.prototype.defaults, {
easing: $.bez(easing_swiftOut),
duration: 200
});
}
// dropdown
if (typeof UIkit.components.dropdown.prototype !== "undefined") { // check if dropdown component is defined
$.extend(UIkit.components.dropdown.prototype.defaults, {
remaintime: 150,
delay: 50
});
(function() {
var old_show_function = UIkit.components.dropdown.prototype.show;
UIkit.components.dropdown.prototype.show = function() {
this.dropdown
.css({
'min-width': this.dropdown.outerWidth()
})
.addClass('uk-dropdown-active uk-dropdown-shown');
return old_show_function.apply(this, arguments);
}
})();
(function() {
var old_hide_function = UIkit.components.dropdown.prototype.hide;
UIkit.components.dropdown.prototype.hide = function() {
var this_dropdown = this.dropdown;
this_dropdown.removeClass('uk-dropdown-shown');
var dropdown_timeout = setTimeout(function() {
this_dropdown.removeClass('uk-dropdown-active')
},280);
return old_hide_function.apply(this, arguments);
}
})();
}
// modal
if (typeof UIkit.components.modal !== "undefined") { // check if modal component is defined
$.extend(UIkit.components.modal.prototype.defaults, {
center: true
});
UIkit.modal.dialog.template = '<div class="uk-modal uk-modal-dialog-replace"><div class="uk-modal-dialog" style="min-height:0;"></div></div>';
$body
.on('show.uk.modal', '.uk-modal-dialog-replace', function () {
// customize uikit dialog
setTimeout(function () {
var dialogReplace = $('.uk-modal-dialog-replace');
if (dialogReplace.find('.uk-button-primary').length) {
var actionBtn = dialogReplace.find('.uk-button-primary').toggleClass('uk-button-primary md-btn-flat-primary');
if (actionBtn.next('button')) {
actionBtn.next('button').after(actionBtn);
}
}
if (dialogReplace.find('.uk-button').length) {
dialogReplace.find('.uk-button').toggleClass('uk-button md-btn md-btn-flat');
}
if (dialogReplace.find('.uk-margin-small-top').length) {
dialogReplace.find('.uk-margin-small-top').toggleClass('uk-margin-small-top uk-margin-top');
}
if (dialogReplace.find('input.uk-width-1-1').length) {
dialogReplace.find('input.uk-width-1-1').toggleClass('uk-width-1-1 md-input');
// reinitialize md inputs
altair_md.inputs();
}
if (dialogReplace.find('.uk-form').length) {
dialogReplace.find('.uk-form').removeClass('uk-form');
}
}, 50)
});
}
// tooltip
if (typeof UIkit.components.tooltip !== "undefined") { // check if tooltip component is defined
$.extend(UIkit.components.tooltip.prototype.defaults, {
animation: 280,
offset: 8
});
}
});
}

View File

@ -0,0 +1 @@
"undefined"!=typeof UIkit&&UIkit.on("beforeready.uk.dom",function(){"undefined"!=typeof UIkit.components.accordion&&$.extend(UIkit.components.accordion.prototype.defaults,{easing:$.bez(easing_swiftOut),duration:200}),"undefined"!=typeof UIkit.components.dropdown.prototype&&($.extend(UIkit.components.dropdown.prototype.defaults,{remaintime:150,delay:50}),function(){var t=UIkit.components.dropdown.prototype.show;UIkit.components.dropdown.prototype.show=function(){return this.dropdown.css({"min-width":this.dropdown.outerWidth()}).addClass("uk-dropdown-active uk-dropdown-shown"),t.apply(this,arguments)}}(),function(){var t=UIkit.components.dropdown.prototype.hide;UIkit.components.dropdown.prototype.hide=function(){var o=this.dropdown;o.removeClass("uk-dropdown-shown");setTimeout(function(){o.removeClass("uk-dropdown-active")},280);return t.apply(this,arguments)}}()),"undefined"!=typeof UIkit.components.modal&&($.extend(UIkit.components.modal.prototype.defaults,{center:!0}),UIkit.modal.dialog.template='<div class="uk-modal uk-modal-dialog-replace"><div class="uk-modal-dialog" style="min-height:0;"></div></div>',$body.on("show.uk.modal",".uk-modal-dialog-replace",function(){setTimeout(function(){var t=$(".uk-modal-dialog-replace");if(t.find(".uk-button-primary").length){var o=t.find(".uk-button-primary").toggleClass("uk-button-primary md-btn-flat-primary");o.next("button")&&o.next("button").after(o)}t.find(".uk-button").length&&t.find(".uk-button").toggleClass("uk-button md-btn md-btn-flat"),t.find(".uk-margin-small-top").length&&t.find(".uk-margin-small-top").toggleClass("uk-margin-small-top uk-margin-top"),t.find("input.uk-width-1-1").length&&(t.find("input.uk-width-1-1").toggleClass("uk-width-1-1 md-input"),altair_md.inputs()),t.find(".uk-form").length&&t.find(".uk-form").removeClass("uk-form")},50)})),"undefined"!=typeof UIkit.components.tooltip&&$.extend(UIkit.components.tooltip.prototype.defaults,{animation:280,offset:8})});

File diff suppressed because one or more lines are too long

6955
src/assets/js/uikit_custom.js Executable file

File diff suppressed because it is too large Load Diff

1
src/assets/js/uikit_custom.min.js vendored Executable file

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,485 @@
html {
background: @site_background;
}
body {
.md_font(400, 15px, 1.42857143);
box-sizing: border-box;
overflow-x: hidden;
}
/*html, body {
height: 100%;
}*/
a, button {
outline: none !important;
}
a {
color: @md-color-blue-600;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
&:hover,
&:active {
color: @md-color-blue-900;
text-decoration: none;
}
}
.uk-text-upper {
text-transform: uppercase;
}
.animate > * {
visibility: hidden;
}
.animated {
visibility: visible;
}
[class*=uk-animation-] {
animation-timing-function: @md_easing;
animation-duration: 840ms;
}
.heading {
&_a {
margin: 0;
.md_font(300,42px,48px);
.sub-heading {
font-weight: 300;
font-size: 24px;
line-height: 30px;
display: block;
padding-top: 10px;
}
@media @screen_large_max {
.md_font(300,32px,36px);
.sub-heading {
font-size: 20px;
line-height: 24px;
}
}
}
&_b {
margin: 0;
.md_font(300,32px,36px);
.sub-heading {
font-weight: 300;
font-size: 20px;
line-height: 26px;
display: block;
padding-top: 10px;
}
@media @screen_large_max {
.md_font(300,28px,32px);
.sub-heading {
font-size: 18px;
line-height: 22px;
}
}
}
&_c {
margin: 0;
.md_font(400,24px,28px);
.sub-heading {
font-weight: 300;
font-size: 18px;
line-height: 20px;
display: block;
padding-top: 10px;
}
@media @screen_large_max {
.md_font(300,22px,25px);
.sub-heading {
font-size: 16px;
line-height: 20px;
}
}
}
&_a,
&_b,
&_c {
+ .uk-grid {
margin-top: 24px;
}
.material-icons {
vertical-align: middle;
}
}
&_light {
&,
.sub-heading {
color: @white;
}
}
}
// icons
.icon {
&_large {
font-size: 64px;
@media @screen_large_max {
font-size: 48px;
}
}
&_dark {
color: @text_secondary_color;
}
}
// header
#header_main {
transition: all 280ms @md_easing;
position: relative;
z-index: 10;
.uk-navbar {
background: @white;
&-nav {
> li {
> a {
color: @text_secondary_color;
text-transform: uppercase;
font-size: 14px;
.md_font_family();
font-weight: 500;
box-shadow: inset 0 -4px 0 rgba(255,255,255,0);
background: none !important;
transition: all 280ms @md_easing;
&:hover,
&:active {
color: @text_secondary_color;
}
}
&.current_active {
a {
box-shadow: inset 0 -4px 0 @accent_color;
}
}
}
}
}
&.header-light {
background: @white;
}
.header_cta {
margin-top: 14px;
@media @screen_large_max {
margin-top: 6px;
}
}
}
#mobile_navigation_toggle {
display: none;
}
#mobile_navigation {
.uk-offcanvas-bar {
background: @white;
.md-box-shadow-right();
transition: transform 280ms @md_easing;
&:after {
display: none;
}
ul {
.reset_list(32px 0 0 0,0);
li {
a {
display: block;
font-size: 16px;
font-weight: 500;
line-height: 25px;
padding: 8px 20px;
color: @text_primary_color;
small {
font-size: 12px;
color: @text_secondary_color;
display: block;
margin-top: -2px;
}
.menu_icon {
width: 48px;
text-align: left;
display: inline-block;
color: @text_secondary_color;
float: left;
.material-icons {
font-size: 24px;
vertical-align: top;
}
}
.menu_title {
display: block;
overflow: hidden;
}
}
}
}
}
}
.uk-offcanvas-page {
transition: margin 280ms @md_easing;
}
.header_sticky {
padding-top: @header_main_height;
@media @screen_large_max {
padding-top: @header_main_mobile_height;
}
#header_main {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 1000;
}
}
.header_shadow {
#header_main {
box-shadow: 0 2px 6px rgba(0,0,0,0.25);
}
}
// top banner (slideshow)
.banner {
color: @white;
position: relative;
.uk-slideshow {
&,
> li {
height: 640px;
}
> li {
background-size: 100% auto;
background-position: center center;
background-repeat: no-repeat;
.slide {
&_content_a {
margin: 160px 0 0 640px;
}
&_content_b {
margin: 320px 0 0 0;
background: rgba(0,0,0,.4);
padding: 24px;
}
&_content_c {
margin: 120px 540px 0 0;
.slide_header,
p {
color: @text_primary_color;
}
}
&_header {
color: @white;
.md_font(400,38px,42px);
margin: 0 0 18px;
}
}
p {
margin: 0;
font-size: 20px;
font-weight: 300;
+ * {
margin-top: 32px;
}
}
}
}
.slide_navigation {
display: none;
}
&:hover {
.slide_navigation {
display: block;
}
}
}
.uk-touch {
.slide_navigation {
display: block !important;
}
}
.uk-slidenav {
position: absolute;
top: 50%;
margin-top: -30px;
color: @white !important;
background: rgba(0,0,0,.2);
border-radius: 12px;
font-size: 48px;
transition: all 280ms @md_easing;
&-previous {
left: 16px;
&:before {
position: relative;
left: -2px;
top: -2px;
}
}
&-next {
right: 16px;
&:before {
position: relative;
right: -2px;
top: -2px;
}
}
&:active,
&:hover {
background: rgba(0,0,0,.6);
border-radius: 50%;
}
}
.uk-dotnav {
> li {
border: 2px solid rgba(255,255,255,.8);
padding: 2px;
margin-right: 6px;
border-radius: 50%;
&.uk-active {
border-color: @white;
> a {
background: @accent_color;
}
}
> a {
margin: 0;
width: 14px;
height: 14px;
}
}
}
// sections
.section {
padding: 48px 0;
position: relative;
&_large {
padding: 64px 0;
}
&_dark {
color: @white;
}
&_gallery {
position: relative;
.slide_navigation {
display: none;
}
&:hover {
.slide_navigation {
display: block;
}
}
}
}
// uikit
[class*=uk-width].uk-container-center {
float: none;
}
// media queries
@media @screen_xlarge_max {
.banner {
.uk-slideshow {
&,
> li {
height: auto;
min-height: 360px;
}
> li {
.slide {
&_content_a,
&_content_b,
&_content_c {
margin: 0;
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
background: rgba(0,0,0,.4);
padding: 48px 48px 0;
text-align: center;
}
&_header {
margin-bottom: 20px;
color: @white !important;
}
}
p {
font-size: 20px;
color: @white !important;
+ * {
margin-top: 24px;
}
}
}
}
}
}
@media @screen_large_max {
#header_main {
height: @header_main_mobile_height;
.uk-navbar-brand {
line-height: 48px;
padding: 0;
}
}
#main_navigation {
display: none;
.uk-navbar {
&-nav {
}
}
}
#mobile_navigation_toggle {
padding: 12px 4px 10px;
display: inline-block;
i {
font-size: 24px;
}
}
}
@media @screen_medium_max {
.banner {
.uk-slideshow {
> li {
background-size: auto 100%;
.slide {
&_content_a,
&_content_b,
&_content_c {
margin: 0;
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
background: rgba(0,0,0,.4);
padding: 24px 12px;
text-align: center;
}
&_header {
.md_font(400,24px,28px);
margin-bottom: 6px;
color: @white !important;
}
}
p {
font-size: 15px;
color: @white !important;
+ * {
margin-top: 24px;
}
}
}
}
}
.uk-container {
padding-left: 15px;
padding-right: 15px;
}
}

1090
src/assets/less/_uikit_custom.less Executable file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,140 @@
// colors
@text_primary_color: #212121;
@text_secondary_color: #727272;
@text_muted: #aaa;
@site_background: #fff;
@border_color: rgba(0,0,0,0.12);
@border_color_hex: #e0e0e0;
@border_color_light: rgba(0,0,0,0.08);
@background_color_default: rgba(0,0,0,0.085);
@background_color_default_hex: #ededed;
@hover_bg: #f5f5f5;
@white: #fff;
@danger_color: @md-color-red-600;
@primary_color: @md-color-blue-500;
@primary_color_dark: @md-color-blue-700;
@success_color: @md-color-light-green-600;
@warning_color: @md-color-amber-700;
@muted_color: @md-color-grey-400;
// theme
@theme_primary_color: @md-color-blue-500;
@theme_light_color: @md-color-blue-50;
@theme_dark_color: @md-color-blue-700;
@accent_color: @md-color-light-green-600;
/* md buttons */
@hover_btn: rgba(153,153,153,0.2);
@active_btn: rgba(153,153,153,0.4);
// input colors
@input_on_color: @md-color-teal-500;
@input_off_color: rgba(0,0,0,.54);
@input_disabled_color: rgba(0,0,0,.26);
@input_disabled_color_hex: #bdbdbd;
// swiftOut easing
@md_easing: cubic-bezier(0.4,0,0.2,1);
// main header
@header_main_height: 64px;
@header_main_mobile_height: 48px;
@header_main_height_double: (@header_main_height*2)+10;
@header_main_zIndex: 1104;
// top bar
@top_bar_height: 40px;
// main sidebar
@sidebar_main_width: 240px;
@sidebar_main_width_mini: 60px;
// secondary sidebar
@sidebar_secondary_width: 280px;
// media queries
@screen_xlarge: ~"only screen and (min-width: 1220px)";
@screen_large: ~"only screen and (min-width: 960px)";
@screen_medium: ~"only screen and (min-width: 768px)";
@screen_small: ~"only screen and (min-width: 480px)";
@screen_xlarge_max: ~"only screen and (max-width: 1219px)";
@screen_large_max: ~"only screen and (max-width: 959px)";
@screen_medium_max: ~"only screen and (max-width: 767px)";
@screen_small_max: ~"only screen and (max-width: 479px)";
// box-sizing: border-box (this and all childrens)
.border-box() {
&,
&:before,
&:after,
*,
*:before,
*:after {
box-sizing: border-box;
}
}
// Retina background-image support with non-retina fall back
.retina_image(@file-1x, @file-2x, @width-1x, @height-1x) {
background-image: url("@{file-1x}");
background-repeat: no-repeat;
@media only screen and (-webkit-min-device-pixel-ratio: 2),
only screen and ( min--moz-device-pixel-ratio: 2),
only screen and ( -o-min-device-pixel-ratio: 2/1),
only screen and ( min-device-pixel-ratio: 2),
only screen and ( min-resolution: 192dppx),
only screen and ( min-resolution: 2dppx) {
background-image: url("@{file-2x}");
background-size: @width-1x @height-1x;
}
}
// remove default styles for ordered/unordered list
.reset_list(@margin: 0, @padding: 0) {
margin: @margin;
padding: @padding;
list-style: none;
> li {
padding: 0;
margin: 0;
list-style: none;
}
}
// clearfix
.clearfix() {
&:before,
&:after {
content: " ";
display: table;
}
&:after {
clear: both;
}
}
// custom fonts
.md_font(@weight: 400, @size: 14px, @height: 20px) {
font: @weight @size e('/') @height "Roboto", sans-serif;
}
.code_font(@weight: 400, @size: 14px, @height: 18px) {
font: @weight @size e('/') @height "Source Code Pro",Consolas, Monaco, 'Andale Mono', monospace !important;
}
.md_font_family() {
font-family: "Roboto", sans-serif;
}
// text truncate
.truncate_line(@width: 100%) {
text-overflow: ellipsis;
display: inline-block;
vertical-align: top;
white-space: nowrap;
overflow: hidden;
width: @width;
}

View File

@ -0,0 +1,109 @@
/* pricing tables */
.pricing_table {
&.pricing_table_a {
text-align: center;
.pricing_table_plan {
font-size: 18px;
font-weight: 400;
padding: 16px 0;
margin-bottom: 16px;
}
.pricing_table_price {
padding: 8px 0 0;
font-size: 48px;
margin-bottom: 24px;
.currency {
vertical-align: top;
font-size: 24px;
padding: 0 4px;
}
.period {
font-size: 14px;
padding: 4px;
color: @text_muted;
display: block;
}
}
.pricing_table_features {
.reset_list();
li {
font-size: 16px;
padding: 8px 0;
}
}
.pricing_table_select {
padding: 32px 0;
}
}
&.pricing_table_b {
text-align: center;
.pricing_table_plan {
font-size: 16px;
font-weight: 400;
padding: 16px 0;
margin-bottom: 16px;
text-transform: uppercase;
}
.pricing_table_price {
padding: 8px 0 0;
font-size: 48px;
margin-bottom: 24px;
.currency {
vertical-align: top;
font-size: 24px;
padding: 0 4px;
}
.period {
font-size: 14px;
padding: 4px;
color: @text_muted;
display: block;
}
}
.pricing_table_features {
.reset_list();
li {
font-size: 16px;
padding: 8px 0;
}
}
.pricing_table_select {
padding: 32px 0;
}
}
&.pricing_table_c {
text-align: center;
.pricing_table_plan {
font-size: 16px;
font-weight: 400;
padding: 16px 0;
margin-bottom: 8px;
}
.pricing_table_price {
padding: 8px 0 0;
font-size: 48px;
margin-bottom: 24px;
.currency {
vertical-align: top;
font-size: 24px;
padding: 0 4px;
}
.period {
font-size: 14px;
color: @text_muted;
vertical-align: 0;
padding-left: 4px;
}
}
.pricing_table_features {
.reset_list();
li {
font-size: 16px;
padding: 8px 0;
}
}
.pricing_table_select {
padding: 32px 0;
}
}
}

View File

@ -0,0 +1,125 @@
.al_timeline {
position: relative;
padding: 24px 0 32px;
&:after {
position: absolute;
top: 0;
bottom: 0;
margin-left: -2px;
left: 50%;
content: '';
width: 4px;
background: rgba(255,255,255,.5);
display: block;
}
&_block {
.clearfix;
+ * {
margin-top: 48px;
}
&:nth-child(even) {
.al_timeline {
&_content {
float: right;
&:after {
border-left-color: transparent;
border-right-color: @white;
right: auto;
left: -20px;
}
}
}
}
}
&_content {
box-sizing: border-box;
background: @white;
width: 44%;
padding: 16px;
.boxShadowHelper(2);
position: relative;
border-radius: 4px;
&:after {
position: absolute;
top: 24px;
right: -20px;
content: '';
display: block;
border: 10px solid transparent;
border-left-color: @white;
}
}
&_image {
position: absolute;
left: 50%;
width: 64px;
height: 64px;
margin-left: -32px;
background: @white;
border-radius: 50%;
text-align: center;
z-index: 10;
.boxShadowHelper(2);
> i {
font-size: 32px;
line-height: 64px;
}
}
}
@media @screen_large_max {
.al_timeline {
&:after {
margin-left: 0;
left: 30px;
}
&_block {
padding-left: 96px;
}
&_content {
width: 100%;
&:after {
border-left-color: transparent;
border-right-color: @white;
right: auto;
left: -20px;
}
}
&_image {
left: 0;
margin-left: 0;
}
}
}
@media @screen_medium_max {
.al_timeline {
&:after {
margin-left: 0;
left: 22px;
}
&_block {
padding-left: 72px;
}
&_content {
width: 100%;
&:after {
border-left-color: transparent;
border-right-color: @white;
right: auto;
left: -20px;
top: 14px;
}
}
&_image {
width: 48px;
height: 48px;
left: 0;
margin-left: 0;
> i {
line-height: 48px;
font-size: 24px;
}
}
}
}

34
src/assets/less/main.less Executable file
View File

@ -0,0 +1,34 @@
/*
* Altair Admin Landing Page
* author: tzd
*
* Content:
* 1. variables/mixins
* 2. UIkit custom styles
* 3. custom components
* 4. material design styles
* 5. partials (header,sidebars,top bar)
* 6. altair landing page styles
*
*/
/* 1. altair variables/mixins ======================== */
@import (reference) "_variables_mixins";
/* 2. UIkit custom styles ============================ */
@import "_uikit_custom";
/* 3. custom components ============================== */
@import "components/_pricing_table";
@import "components/_timeline";
/* 4. material designv styles ========================= */
@import "md/md_main";
/* 5. partials (header,sidebars,top bar) ============= */
/* 6. altair landing page styles ===================== */
@import "_altair_landing_page";
/* theme */
//@import "themes/_default";

View File

@ -0,0 +1,599 @@
/* buttons */
@fab_large_size: 64px;
@fab_small_size: 48px;
@fab_transition_delay: 50ms;
.md-btn {
background: @white;
border: none;
border-radius: 2px;
.boxShadowHelper(1);
min-height: 31px;
min-width: 70px;
padding: 2px 16px;
text-align: center;
text-shadow: none;
text-transform: uppercase;
transition: all 280ms @md_easing;
color: @text_primary_color;
box-sizing: border-box;
cursor: pointer;
-webkit-appearance: none;
display: inline-block;
vertical-align: middle;
.md_font(500, 14px, 31px) !important;
&:hover,
&:focus,
&:active,
.uk-button-dropdown.uk-open > & {
background: @white;
outline: none;
text-decoration: none;
color: @text_primary_color;
.boxShadowHelper(2);
}
&:active,
.uk-button-dropdown.uk-open > & {
.boxShadowHelper(3);
}
&-flat {
.boxShadowHelper(0);
background: none;
&:hover,
&:focus {
background: @hover_btn;
}
&:active {
background: @active_btn;
}
&-danger {
&,
&:hover,
&:focus,
&:active {
color: @danger_color;
}
&:hover,
&:focus,
&:active {
background: lighten(@danger_color,40%);
}
}
&-primary {
&,
&:hover,
&:focus,
&:active {
color: @primary_color_dark;
}
&:hover,
&:focus,
&:active {
background: lighten(@primary_color,40%);
}
}
&-success {
&,
&:hover,
&:focus,
&:active {
color: @success_color;
}
&:hover,
&:focus,
&:active {
background: lighten(@success_color,40%);
}
}
&-warning {
&,
&:hover,
&:focus,
&:active {
color: @warning_color;
}
&:hover,
&:focus,
&:active {
background: lighten(@warning_color,40%);
}
}
&.disabled {
background: none !important;
}
}
&-danger {
&,
&:hover,
&:focus,
&:active {
background: @danger_color;
}
}
&-primary {
&,
&:hover,
&:focus,
&:active {
background: @primary_color;
}
}
&-success {
&,
&:hover,
&:focus,
&:active {
background: @success_color;
}
}
&-warning {
&,
&:hover,
&:focus,
&:active {
background: @warning_color;
}
}
&-danger,
&-primary,
&-success,
&-warning {
&,
&:hover,
&:focus,
&:active,
> i {
color: @white;
}
}
&.disabled {
&,
&:hover,
&:focus,
&:active {
color: #a8a8a8;
background: #eaeaea;
box-shadow: none !important;
cursor: default;
pointer-events: none;
}
}
> i {
&.material-icons {
margin-top: 5px;
font-size: 18px;
}
}
&-mini {
line-height: 21px !important;
min-width: 12px;
font-size: 10px !important;
min-height: 24px;
}
&-small {
line-height: 27px !important;
min-width: 14px;
font-size: 11px !important;
}
&-large {
line-height: 42px !important;
font-size: 16px !important;
}
&::-moz-focus-inner {
border: 0;
padding: 0;
}
+ .md-btn {
margin-left: 8px;
}
&-block {
width: 100%;
& + & {
margin-left: 0;
margin-top: 12px;
}
}
+ .md-btn-group {
margin-left: 16px;
}
&-facebook {
background: #3b5998 !important;
}
&-twitter {
background: #00aced !important;
}
&-gplus {
background: #dd4b39 !important;
}
&-facebook,
&-twitter,
&-gplus {
&,
> i {
color: @white !important;
}
}
&-icon {
&:extend(.md-btn-icon-default);
> i {
&:extend(.md-btn-icon-default > i);
&.no_margin {
margin-right: 0 !important;
margin-left: 0 !important;
}
}
&.md-btn-large {
&:extend(.md-btn-icon-large);
> i {
&:extend(.md-btn-icon-large > i);
}
}
&.md-btn-small {
&:extend(.md-btn-icon-small);
> i {
&:extend(.md-btn-icon-small > i);
}
}
&.md-btn-mini {
&:extend(.md-btn-icon-mini);
> i {
&:extend(.md-btn-icon-mini > i);
}
}
}
}
.md-btn-icon-large {
min-width: 72px;
> i {
font-size: 24px;
margin-right: 12px;
vertical-align: -3px;
}
}
.md-btn-icon-default {
min-width: 64px;
> i {
font-size: 18px;
margin-right: 8px;
vertical-align: -2px;
}
}
.md-btn-icon-small {
min-width: 48px;
> i {
font-size: 16px;
margin-right: 6px;
vertical-align: -2px;
}
}
.md-btn-icon-mini {
min-width: 36px;
> i {
font-size: 16px;
margin-right: 4px;
vertical-align: -2px;
}
}
.md-fab {
box-sizing: border-box;
width: @fab_large_size;
height: @fab_large_size;
border-radius: 50%;
background: @white;
color: @text_secondary_color;
display: block;
.boxShadowHelper(1);
transition: box-shadow 280ms @md_easing;
border: none;
position: relative;
text-align: center;
cursor: pointer;
&:hover,
&:focus,
&:active {
.boxShadowHelper(3);
}
> i {
font-size: 36px;
line-height: @fab_large_size;
height: inherit;
width: inherit;
position: absolute;
left: 0;
top: 0;
color: @text_secondary_color;
}
&.md-fab-accent {
background: @accent_color;
> i {
color: @white;
}
}
&.md-fab-success {
background: @success_color;
> i {
color: @white;
}
}
&.md-fab-danger {
background: @danger_color;
> i {
color: @white;
}
}
&.md-fab-primary {
background: @primary_color;
> i {
color: @white;
}
}
&.md-fab-warning {
background: @warning_color;
> i {
color: @white;
}
}
&.md-fab-small {
width: @fab_small_size;
height: @fab_small_size;
border-radius: 50%;
> i {
line-height: @fab_small_size;
height: inherit;
width: inherit;
font-size: 24px;
}
}
&-speed-dial {
.md-fab-action-close {
display: none;
}
}
}
.md-fab-wrapper {
position: fixed;
bottom: 24px;
right: 24px;
z-index: 1004;
transition: margin 280ms @md_easing;
@media @screen_medium_max {
bottom: 20px;
right: 20px;
}
> .md-fab + .md-fab {
margin-top: 16px;
}
&.md-fab-in-card {
position: absolute;
}
}
.md-fab-speed-dial {
.md-fab-wrapper-small {
position: absolute;
bottom: @fab_large_size + 16px;
right: 8px;
min-height: @fab_small_size;
width: @fab_small_size;
z-index: -1;
.md-fab-small {
transform: scale(0);
opacity: 0;
position: absolute;
right: 0;
&:nth-child(1) {
transition: box-shadow 280ms @md_easing,transform 100ms @md_easing @fab_transition_delay,opacity 100ms @md_easing @fab_transition_delay;
}
.generate-fab-child(@n, @i: 2) when (@i =< @n) {
// small buttons position
&:nth-last-child(@{i}) {
bottom: (@fab_small_size * (@i - 1) ) + (16px * (@i - 1) );
}
// transition for small buttons (on hide)
&:nth-child(@{i}) {
transition: box-shadow 280ms @md_easing,transform 100ms @md_easing ( @fab_transition_delay * @i ),opacity 100ms @md_easing ( @fab_transition_delay * @i );
}
.generate-fab-child(@n, (@i + 1));
}
.generate-fab-child(8);
}
}
&.md-fab-active {
.md-fab-small {
transform: scale(1);
opacity: 1;
z-index: 10;
// transition for small buttons (on show)
&:nth-last-child(1) {
transition: box-shadow 280ms @md_easing,transform 100ms @md_easing @fab_transition_delay,opacity 100ms @md_easing @fab_transition_delay;
}
.generate-fab-child-active(@n, @i: 2) when (@i =< @n) {
&:nth-last-child(@{i}) {
transition: box-shadow 280ms @md_easing,transform 100ms @md_easing ( @fab_transition_delay * @i ),opacity 100ms @md_easing ( @fab_transition_delay * @i );
}
.generate-fab-child-active(@n, (@i + 1));
}
.generate-fab-child-active(8);
}
}
}
.md-fab-toolbar {
transition: all 280ms @md_easing;
cursor: default;
> i {
cursor: pointer;
}
&-actions {
visibility: hidden;
white-space: nowrap;
padding: 0 16px;
overflow: hidden;
box-sizing: border-box;
> a,
> button {
display: block;
float: left;
opacity: 0;
margin: 0 0 0 16px;
height: @fab_large_size;
width: 48px;
box-sizing: border-box;
transition: opacity 280ms @md_easing;
background: none;
border: none;
outline: none;
cursor: pointer;
&:first-child {
margin-left: 0;
}
}
.material-icons {
font-size: 36px;
line-height: @fab_large_size;
}
}
&.md-fab-animated {
.boxShadowHelper(1);
border-radius: 4px;
> i {
display: none;
}
}
&.md-fab-active {
.md-fab-toolbar-actions {
visibility: visible;
> a,
> button {
opacity: 1;
}
}
}
&.md-fab-small {
.md-fab-toolbar-actions {
> a,
> button {
height: @fab_small_size;
width: 36px;
padding: 0;
margin: 0 0 0 8px;
&:first-child {
margin-left: 0;
}
}
.material-icons {
font-size: 24px;
line-height: @fab_small_size;
height: inherit;
}
}
}
}
.md-fab-sheet {
transition: all 280ms @md_easing;
cursor: default;
> i {
cursor: pointer;
}
&-actions {
visibility: hidden;
white-space: nowrap;
overflow: hidden;
box-sizing: border-box;
padding: 4px 0;
> a {
display: block;
opacity: 0;
padding: 4px 16px;
box-sizing: border-box;
.md_font(400, 16px, 32px);
text-align: left;
&,
&:hover {
color: @text_primary_color;
}
}
.material-icons {
font-size: 24px;
margin-right: 8px;
vertical-align: -6px;
}
}
&.md-fab-animated {
.boxShadowHelper(1);
border-radius: 4px;
> i {
display: none;
}
}
&.md-fab-active {
.md-fab-sheet-actions {
visibility: visible;
> a {
opacity: 1;
}
}
}
}
.sidebar_secondary_active {
.md-fab-wrapper {
margin-right: @sidebar_secondary_width - 16;
@media @screen_medium_max {
margin-right: @sidebar_secondary_width;
}
}
}
.md-toggle-group {
.md-toggle-button {
border-width: 0 0 2px;
border-style: solid;
border-color: transparent;
background: none;
line-height: 30px;
min-width: 42px;
text-align: center;
padding: 0 8px;
vertical-align: middle;
cursor: pointer;
&.md-toggle-active {
border-bottom-color: #212121;
}
}
&.md-toggle-group-small {
.md-toggle-button {
font-size: 11px;
line-height: 24px;
min-width: 16px;
padding: 0 6px;
}
}
}
.md-btn-group {
display: inline-block;
vertical-align: top;
position: relative;
font-size: 0;
white-space: nowrap;
.md-btn {
vertical-align: top;
margin-left: 0 !important;
&:first-child {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
&:not(:first-child):not(:last-child) {
border-radius: 0;
}
&:last-child {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
}
}

525
src/assets/less/md/_md_cards.less Executable file
View File

@ -0,0 +1,525 @@
/* cards */
.md-card {
background: @white;
position: relative;
.boxShadowHelper(1);
border: none;
& + &,
& + .uk-grid,
.uk-grid + & {
margin-top: 25px;
}
.full_width_in_card {
padding: 16px 24px;
background: @background_color_default;
}
.md-card-toolbar {
height: @header_main_height;
//position: relative;
//z-index: 11;
padding: 0 16px;
border-bottom: 1px solid @border_color;
background: @white;
.clearfix();
&-heading-text {
.md_font(500,14px,50px);
color: @text_primary_color;
margin: 0;
float: left;
overflow: hidden;
height: 48px;
&.large {
font-size: 18px;
font-weight: 400;
}
}
.md-toggle-group {
float: left;
margin: 8px 0 0 16px;
&.md-toggle-group-small {
margin-top: 10px;
}
}
.md-card-toolbar-actions {
float: right;
padding-top: 10px;
.uk-open {
.md-card-toolbar-icon {
background: @background_color_default;
color: @text_primary_color;
}
}
.md-card-dropdown {
display: inline-block;
position: relative;
}
.selectize-control {
min-width: 220px;
margin-top: -3px;
.selectize-input {
min-height: 30px;
padding: 4px 8px;
}
.selectize-dropdown {
margin-top: -34px;
}
}
}
.md-icon {
+ .md-card-dropdown {
margin-left: 4px;
}
}
.md-card-fullscreen-deactivate {
margin: 9px 8px 0 0;
}
&-input {
border: none;
.md_font(400,18px,24px);
height: auto;
background: none !important;
padding: 12px 0;
width: 50%;
box-sizing: border-box;
}
.uk-tab {
margin-top: -2px;
border-bottom: none;
li > a {
padding: 10px 8px !important;
}
}
}
.md-card-head {
height: 160px;
position: relative;
border-bottom: 1px solid @border_color;
&-menu {
position: absolute;
right: 8px;
top: 8px;
}
&-avatar {
width: 82px;
height: 82px;
border-radius: 50%;
margin-top: 16px;
border: 2px solid @white;
display: inline-block;
}
&-text {
padding: 8px 16px 16px;
.md_font(500,16px,22px);
color: @text_primary_color;
margin: 0;
span {
display: block;
.md_font(400,12px,18px);
margin-top: -2px;
}
&.text_dark {
color: @text_primary_color !important;
}
&-over {
background-image: linear-gradient(to bottom, rgba(0,0,0,0.65) 0%,rgba(0,0,0,0) 100%);
}
}
&-subtext {
position: absolute;
bottom: 10px;
left: 0;
right: 0;
padding: 0 16px;
text-align: right;
color: @white;
span {
font-size: 26px;
}
}
&-icon {
font-size: 48px;
color: @white;
vertical-align: middle;
}
&.head_background {
background-repeat: no-repeat;
background-position: center center;
background-size: cover;
border-bottom-color: transparent;
.md-card-head-text {
color: @white;
}
&_top {
background-repeat: no-repeat;
background-position: center top;
}
&_bottom {
background-repeat: no-repeat;
background-position: center bottom;
}
}
.head_chart {
height: 100px;
width: 100%;
position: absolute !important;
left: 0;
top: 40px;
}
.fitVid_player {
width: 100%;
height: 160px;
overflow: hidden;
}
&-img {
height: 100%;
width: auto;
}
iframe {
height: 160px;
}
}
.md-card-content {
padding: 16px;
&.padding-reset {
padding: 0;
}
&.large-padding {
padding: 24px 35px;
}
&.small-padding {
padding: 8px;
}
}
.md-card-footer {
padding: 16px;
font-size: 14px;
line-height: 18px;
.md-card-footer-head {
.md_font(500,16px,20px);
margin: 0 0 4px;
}
}
&.md-card-fullscreen {
position: fixed;
z-index: 9998;
overflow-x: hidden;
.md-card-fullscreen-activate {
display: none;
}
}
.md-card-fullscreen-content {
display: none;
padding: 16px 0;
.md-card-fullscreen-content-hidden & {
display: block;
visibility: hidden;
padding: 0;
}
}
&.mdToolbar_fixed {
overflow-y: hidden;
> .md-card-toolbar {
position: fixed;
left: 0;
right: 0;
top: 0;
z-index: 9999;
.boxShadowHelper(2);
}
> .md-card-content {
overflow-y: scroll;
box-sizing: border-box;
position: absolute;
width: 100%;
top: @header_main_height;
bottom: 0;
}
}
&.md-card-overlay {
overflow: hidden;
padding-bottom: 54px;
.md-card-content {
height: 142px;
overflow: hidden;
box-sizing: border-box;
&.no_truncate {
position: relative;
&:after {
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 8px;
background-image: linear-gradient(to top, rgba(255,255,255,1) 50%,rgba(255,255,255,0) 100%);
display: block;
content: '';
z-index: 10;
}
}
> pre {
margin-top: 0;
max-height: 110px;
> code {
overflow: hidden;
}
}
}
.md-card-overlay-content {
position: absolute;
top: 100%;
left: 0;
right: 0;
padding: 0 16px;
margin-top: -54px;
border-top: 1px solid @border_color;
text-align: left;
bottom: 0;
background: @white;
z-index: 10;
transition: all 280ms @md_easing;
p {
margin: 0;
+ * {
margin-top: 16px
}
+ p {
margin-top: 4px
}
}
}
.md-card-overlay-header {
.clearfix;
padding: 12px 0;
h3,
h4 {
margin: 0;
.truncate_line;
padding-right: 32px;
box-sizing: border-box;
}
h3 {
.md_font(400, 16px, 30px);
}
h4 {
.md_font(500, 14px, 30px);
}
.md-icon {
position: absolute;
right: 12px;
top: 11px;
}
}
&-active {
.md-card-overlay-content {
top: -1px;
margin-top: 0;
}
}
}
&.md-card-hover {
transition: all 280ms @md_easing;
will-change: box-shadow;
&:hover {
.boxShadowHelper(3);
}
}
// ui-kit sortable
.uk-sortable-dragged & {
.boxShadowHelper(3);
canvas {
margin: 0 auto;
display: block;
}
}
.heading_list {
padding: 0;
}
&-primary,
&-success,
&-danger,
&-warning {
border-left: 4px solid transparent;
}
&-primary {
border-left-color: @primary_color;
}
&-success {
border-left-color: @success_color;
}
&-danger {
border-left-color: @danger_color;
}
&-warning {
border-left-color: @warning_color;
}
}
.md-expand,
.md-expand-group > * {
opacity: 0;
}
.md-card-placeholder {
min-width: 100%;
}
.md-card-list-wrapper {
.border-box();
.md-card-list-header {
position: absolute;
top: -24px;
left: 0;
}
.md-card-list {
margin: 48px 0 0 0;
position: relative;
&:first-child {
margin-top: 24px;
}
> ul {
.reset_list();
> li {
min-height: 34px;
padding: 8px 16px;
font-size: 13px;
.clearfix();
transition: background 150ms,padding 200ms;
background: @white;
.boxShadowHelper(1);
&.item-shown {
background: @white;
padding: 8px 36px;
.md-card-list-item {
&-subject {
@media @screen_medium_max {
clear: both;
float: none;
padding-top: 16px;
> span {
white-space: normal;
}
}
}
&-sender {
width: auto;
overflow: hidden;
}
}
&.md-card-list-item-selected {
position: relative;
&:before {
content: '';
position: absolute;
display: block;
left: 0;
top: 0;
bottom: 0;
width: 8px;
background: @theme_light_color;
}
}
}
}
}
.md-card-list-item {
&-select,
&-avatar-wrapper,
&-sender {
float: left;
}
&-select {
padding: 6px 8px 0 0;
}
&-avatar-wrapper,
&-sender,
&-subject,
&-date {
padding: 0 8px;
}
&-avatar-wrapper {
.md-card-list-item-avatar {
background: #757575;
color: @white;
.md-user-image;
display: block;
}
span.md-card-list-item-avatar {
line-height: 34px;
text-transform: uppercase;
text-align: center;
}
}
&-sender {
width: 220px;
line-height: 34px;
> span {
.truncate_line();
}
@media @screen_xlarge_max {
display: none;
}
}
&-subject {
overflow: hidden;
font-weight: 500;
> span {
line-height: 34px;
.truncate_line();
}
.md-card-list-item-sender-small {
display: none;
@media @screen_xlarge_max {
display: block;
+ span {
line-height: inherit;
}
}
> span {
.truncate_line();
font-size: 12px;
color: #999;
}
}
}
&-date {
line-height: 34px;
float: right;
color: #999;
@media @screen_small_max {
display: none;
}
}
&-menu {
float: right;
margin: 0 0 0 8px;
position: relative;
.uk-dropdown {
.material-icons {
margin-right: 8px;
}
}
}
&-content-wrapper {
display: none;
clear: both;
opacity: 0;
}
&-content {
padding: 16px 16px 0 0;
max-height: 360px;
overflow-x: hidden;
margin: 0 0 40px;
top: 20px;
position: relative;
font-size: 14px;
+ .md-card-list-item-reply {
padding-top: 10px;
}
}
&-reply {
padding: 16px 0;
}
&-selected {
background: @theme_light_color;
}
}
}
}

View File

@ -0,0 +1,274 @@
// colors
@md-color-red-50: #ffebee;
@md-color-red-100: #ffcdd2;
@md-color-red-200: #ef9a9a;
@md-color-red-300: #e57373;
@md-color-red-400: #ef5350;
@md-color-red-500: #f44336;
@md-color-red-600: #e53935;
@md-color-red-700: #d32f2f;
@md-color-red-800: #c62828;
@md-color-red-900: #b71c1c;
@md-color-red-A100: #ff8a80;
@md-color-red-A200: #ff5252;
@md-color-red-A400: #ff1744;
@md-color-red-A700: #d50000;
@md-color-pink-50: #fce4ec;
@md-color-pink-100: #f8bbd0;
@md-color-pink-200: #f48fb1;
@md-color-pink-300: #f06292;
@md-color-pink-400: #ec407a;
@md-color-pink-500: #e91e63;
@md-color-pink-600: #d81b60;
@md-color-pink-700: #c2185b;
@md-color-pink-800: #ad1457;
@md-color-pink-900: #880e4f;
@md-color-pink-A100: #ff80ab;
@md-color-pink-A200: #ff4081;
@md-color-pink-A400: #f50057;
@md-color-pink-A700: #c51162;
@md-color-purple-50: #f3e5f5;
@md-color-purple-100: #e1bee7;
@md-color-purple-200: #ce93d8;
@md-color-purple-300: #ba68c8;
@md-color-purple-400: #ab47bc;
@md-color-purple-500: #9c27b0;
@md-color-purple-600: #8e24aa;
@md-color-purple-700: #7b1fa2;
@md-color-purple-800: #6a1b9a;
@md-color-purple-900: #4a148c;
@md-color-purple-A100: #ea80fc;
@md-color-purple-A200: #e040fb;
@md-color-purple-A400: #d500f9;
@md-color-purple-A700: #aa00ff;
@md-color-deep-purple-50: #ede7f6;
@md-color-deep-purple-100: #d1c4e9;
@md-color-deep-purple-200: #b39ddb;
@md-color-deep-purple-300: #9575cd;
@md-color-deep-purple-400: #7e57c2;
@md-color-deep-purple-500: #673ab7;
@md-color-deep-purple-600: #5e35b1;
@md-color-deep-purple-700: #512da8;
@md-color-deep-purple-800: #4527a0;
@md-color-deep-purple-900: #311b92;
@md-color-deep-purple-A100: #b388ff;
@md-color-deep-purple-A200: #7c4dff;
@md-color-deep-purple-A400: #651fff;
@md-color-deep-purple-A700: #6200ea;
@md-color-indigo-50: #e8eaf6;
@md-color-indigo-100: #c5cae9;
@md-color-indigo-200: #9fa8da;
@md-color-indigo-300: #7986cb;
@md-color-indigo-400: #5c6bc0;
@md-color-indigo-500: #3f51b5;
@md-color-indigo-600: #3949ab;
@md-color-indigo-700: #303f9f;
@md-color-indigo-800: #283593;
@md-color-indigo-900: #1a237e;
@md-color-indigo-A100: #8c9eff;
@md-color-indigo-A200: #536dfe;
@md-color-indigo-A400: #3d5afe;
@md-color-indigo-A700: #304ffe;
@md-color-blue-50: #e3f2fd;
@md-color-blue-100: #bbdefb;
@md-color-blue-200: #90caf9;
@md-color-blue-300: #64b5f6;
@md-color-blue-400: #42a5f5;
@md-color-blue-500: #2196f3;
@md-color-blue-600: #1e88e5;
@md-color-blue-700: #1976d2;
@md-color-blue-800: #1565c0;
@md-color-blue-900: #0d47a1;
@md-color-blue-A100: #82b1ff;
@md-color-blue-A200: #448aff;
@md-color-blue-A400: #2979ff;
@md-color-blue-A700: #2962ff;
@md-color-light-blue-50: #e1f5fe;
@md-color-light-blue-100: #b3e5fc;
@md-color-light-blue-200: #81d4fa;
@md-color-light-blue-300: #4fc3f7;
@md-color-light-blue-400: #29b6f6;
@md-color-light-blue-500: #03a9f4;
@md-color-light-blue-600: #039be5;
@md-color-light-blue-700: #0288d1;
@md-color-light-blue-800: #0277bd;
@md-color-light-blue-900: #01579b;
@md-color-light-blue-A100: #80d8ff;
@md-color-light-blue-A200: #40c4ff;
@md-color-light-blue-A400: #00b0ff;
@md-color-light-blue-A700: #0091ea;
@md-color-cyan-50: #e0f7fa;
@md-color-cyan-100: #b2ebf2;
@md-color-cyan-200: #80deea;
@md-color-cyan-300: #4dd0e1;
@md-color-cyan-400: #26c6da;
@md-color-cyan-500: #00bcd4;
@md-color-cyan-600: #00acc1;
@md-color-cyan-700: #0097a7;
@md-color-cyan-800: #00838f;
@md-color-cyan-900: #006064;
@md-color-cyan-A100: #84ffff;
@md-color-cyan-A200: #18ffff;
@md-color-cyan-A400: #00e5ff;
@md-color-cyan-A700: #00b8d4;
@md-color-teal-50: #e0f2f1;
@md-color-teal-100: #b2dfdb;
@md-color-teal-200: #80cbc4;
@md-color-teal-300: #4db6ac;
@md-color-teal-400: #26a69a;
@md-color-teal-500: #009688;
@md-color-teal-600: #00897b;
@md-color-teal-700: #00796b;
@md-color-teal-800: #00695c;
@md-color-teal-900: #004d40;
@md-color-teal-A100: #a7ffeb;
@md-color-teal-A200: #64ffda;
@md-color-teal-A400: #1de9b6;
@md-color-teal-A700: #00bfa5;
@md-color-green-50: #e8f5e9;
@md-color-green-100: #c8e6c9;
@md-color-green-200: #a5d6a7;
@md-color-green-300: #81c784;
@md-color-green-400: #66bb6a;
@md-color-green-500: #4caf50;
@md-color-green-600: #43a047;
@md-color-green-700: #388e3c;
@md-color-green-800: #2e7d32;
@md-color-green-900: #1b5e20;
@md-color-green-A100: #b9f6ca;
@md-color-green-A200: #69f0ae;
@md-color-green-A400: #00e676;
@md-color-green-A700: #00c853;
@md-color-light-green-50: #f1f8e9;
@md-color-light-green-100: #dcedc8;
@md-color-light-green-200: #c5e1a5;
@md-color-light-green-300: #aed581;
@md-color-light-green-400: #9ccc65;
@md-color-light-green-500: #8bc34a;
@md-color-light-green-600: #7cb342;
@md-color-light-green-700: #689f38;
@md-color-light-green-800: #558b2f;
@md-color-light-green-900: #33691e;
@md-color-light-green-A100: #ccff90;
@md-color-light-green-A200: #b2ff59;
@md-color-light-green-A400: #76ff03;
@md-color-light-green-A700: #64dd17;
@md-color-lime-50: #f9fbe7;
@md-color-lime-100: #f0f4c3;
@md-color-lime-200: #e6ee9c;
@md-color-lime-300: #dce775;
@md-color-lime-400: #d4e157;
@md-color-lime-500: #cddc39;
@md-color-lime-600: #c0ca33;
@md-color-lime-700: #afb42b;
@md-color-lime-800: #9e9d24;
@md-color-lime-900: #827717;
@md-color-lime-A100: #f4ff81;
@md-color-lime-A200: #eeff41;
@md-color-lime-A400: #c6ff00;
@md-color-lime-A700: #aeea00;
@md-color-yellow-50: #fffde7;
@md-color-yellow-100: #fff9c4;
@md-color-yellow-200: #fff59d;
@md-color-yellow-300: #fff176;
@md-color-yellow-400: #ffee58;
@md-color-yellow-500: #ffeb3b;
@md-color-yellow-600: #fdd835;
@md-color-yellow-700: #fbc02d;
@md-color-yellow-800: #f9a825;
@md-color-yellow-900: #f57f17;
@md-color-yellow-A100: #ffff8d;
@md-color-yellow-A200: #ffff00;
@md-color-yellow-A400: #ffea00;
@md-color-yellow-A700: #ffd600;
@md-color-amber-50: #fff8e1;
@md-color-amber-100: #ffecb3;
@md-color-amber-200: #ffe082;
@md-color-amber-300: #ffd54f;
@md-color-amber-400: #ffca28;
@md-color-amber-500: #ffc107;
@md-color-amber-600: #ffb300;
@md-color-amber-700: #ffa000;
@md-color-amber-800: #ff8f00;
@md-color-amber-900: #ff6f00;
@md-color-amber-A100: #ffe57f;
@md-color-amber-A200: #ffd740;
@md-color-amber-A400: #ffc400;
@md-color-amber-A700: #ffab00;
@md-color-orange-50: #fff3e0;
@md-color-orange-100: #ffe0b2;
@md-color-orange-200: #ffcc80;
@md-color-orange-300: #ffb74d;
@md-color-orange-400: #ffa726;
@md-color-orange-500: #ff9800;
@md-color-orange-600: #fb8c00;
@md-color-orange-700: #f57c00;
@md-color-orange-800: #ef6c00;
@md-color-orange-900: #e65100;
@md-color-orange-A100: #ffd180;
@md-color-orange-A200: #ffab40;
@md-color-orange-A400: #ff9100;
@md-color-orange-A700: #ff6d00;
@md-color-deep-orange-50: #fbe9e7;
@md-color-deep-orange-100: #ffccbc;
@md-color-deep-orange-200: #ffab91;
@md-color-deep-orange-300: #ff8a65;
@md-color-deep-orange-400: #ff7043;
@md-color-deep-orange-500: #ff5722;
@md-color-deep-orange-600: #f4511e;
@md-color-deep-orange-700: #e64a19;
@md-color-deep-orange-800: #d84315;
@md-color-deep-orange-900: #bf360c;
@md-color-deep-orange-A100: #ff9e80;
@md-color-deep-orange-A200: #ff6e40;
@md-color-deep-orange-A400: #ff3d00;
@md-color-deep-orange-A700: #dd2c00;
@md-color-brown-50: #efebe9;
@md-color-brown-100: #d7ccc8;
@md-color-brown-200: #bcaaa4;
@md-color-brown-300: #a1887f;
@md-color-brown-400: #8d6e63;
@md-color-brown-500: #795548;
@md-color-brown-600: #6d4c41;
@md-color-brown-700: #5d4037;
@md-color-brown-800: #4e342e;
@md-color-brown-900: #3e2723;
@md-color-grey-50: #fafafa;
@md-color-grey-100: #f5f5f5;
@md-color-grey-200: #eeeeee;
@md-color-grey-300: #e0e0e0;
@md-color-grey-400: #bdbdbd;
@md-color-grey-500: #9e9e9e;
@md-color-grey-600: #757575;
@md-color-grey-700: #616161;
@md-color-grey-800: #424242;
@md-color-grey-900: #212121;
@md-color-blue-grey-50: #eceff1;
@md-color-blue-grey-100: #cfd8dc;
@md-color-blue-grey-200: #b0bec5;
@md-color-blue-grey-300: #90a4ae;
@md-color-blue-grey-400: #78909c;
@md-color-blue-grey-500: #607d8b;
@md-color-blue-grey-600: #546e7a;
@md-color-blue-grey-700: #455a64;
@md-color-blue-grey-800: #37474f;
@md-color-blue-grey-900: #263238;

239
src/assets/less/md/_md_forms.less Executable file
View File

@ -0,0 +1,239 @@
/* forms */
select,
textarea,
input:not([type]),
input[type="text"],
input[type="password"],
input[type="datetime"],
input[type="datetime-local"],
input[type="date"],
input[type="month"],
input[type="time"],
input[type="week"],
input[type="number"],
input[type="email"],
input[type="url"],
input[type="search"],
input[type="tel"],
input[type="color"] {
outline: none;
&.md-input {
border-radius: 0;
border-width: 0 0 1px;
border-style: solid;
border-color: @border_color;
.md_font(400,15px,18px);
box-shadow: inset 0 -1px 0 rgba(0,0,0,0);
box-sizing: border-box;
padding: 12px 4px;
background: transparent;
width: 100%;
display: block;
&.md-input-danger {
border-color: @danger_color;
&:focus {
border-bottom-color: @danger_color;
}
}
&.md-input-success {
border-color: @success_color;
&:focus {
border-bottom-color: @success_color;
}
}
&:focus {
background: transparent;
border-color: @border_color;
}
&-small {
padding: 4px;
}
&.uk-form-width {
&-mini {
width: 40px;
}
&-small {
width: 130px;
}
&-medium {
width: 200px;
}
&-large {
width: 500px;
}
}
}
}
select.md-input {
&.uk-form-width-mini {
width: 65px;
}
}
.md-input {
&-width-small {
min-width: 80px !important;
}
&-width-medium {
min-width: 160px !important;
}
&-width-large {
min-width: 320px !important;
}
}
textarea {
&.md-input {
min-height: 80px;
resize: none;
overflow: hidden;
transition: height 200ms ease-out;
line-height: 24px;
}
&.no_autosize {
min-height: inherit;
overflow: auto;
transition: none;
resize: both;
}
}
.md-input-wrapper {
position: relative;
padding-top: 4px;
width: 100%;
display: block;
.md-input-bar {
display: block;
position: absolute;
bottom: 0;
left: 0;
width: 100%;
&:before,
&:after {
content: '';
display: block;
position: absolute;
bottom: 0;
width: 0;
height: 2px;
background: @primary_color_dark;
transition: width 400ms @md_easing;
}
&:before {
left: 50%
}
&:after {
right: 50%
}
&.uk-form-width {
&-mini {
width: 40px;
}
&-small {
width: 130px;
}
&-medium {
width: 200px;
}
&-large {
width: 500px;
}
}
}
> label {
color: @text_secondary_color;
position: absolute;
top: 16px;
left: 4px;
right: 0;
pointer-events: none;
transition: all 150ms ease-out;
}
+ * {
margin-top: 10px;
}
&.md-input-wrapper-disabled {
> label {
color: @input_disabled_color;
}
}
&-count {
padding-bottom: 24px;
.md-input-bar {
bottom: 24px;
}
.text-count-wrapper {
font-size: 12px;
position: absolute;
right: 0;
bottom: 0;
opacity: 0;
transition: opacity 200ms ease-in;
.md-input-wrapper-count > & {
position: absolute;
bottom: 0;
right: 0;
}
}
}
}
.md-input-filled,
.md-input-focus {
> label {
top: -6px;
font-size: 12px;
}
&.md-input-wrapper-count {
.text-count-wrapper {
opacity: 1;
}
}
}
.md-input-focus {
.md-input-bar:before,
.md-input-bar:after {
width: 50%;
}
}
.md-input-wrapper-danger {
.md-input-bar {
&:before,
&:after {
background: @danger_color;
}
}
&.md-input-wrapper-count {
.text-count-wrapper {
color: @danger_color;
}
}
}
.md-input-wrapper-success {
.md-input-bar {
&:before,
&:after {
background: @success_color;
}
}
&.md-input-wrapper-count {
.text-count-wrapper {
color: @success_color;
}
}
}
.md-form-group {
position: relative;
}
label.md-label {
color: #999;
padding: 0 6px;
font-size: 11px;
}

View File

@ -0,0 +1,58 @@
// Material Design Icons
// http://google.github.io/material-design-icons/
@material_icons_directory: '../icons/material-design-icons/';
@font-face {
font-family: 'Material Icons';
font-style: normal;
font-weight: 400;
src: url("@{material_icons_directory}MaterialIcons-Regular.eot"); /* For IE6-8 */
src: local('Material Icons'),
local('MaterialIcons-Regular'),
url("@{material_icons_directory}MaterialIcons-Regular.woff2") format('woff2'),
url("@{material_icons_directory}MaterialIcons-Regular.woff") format('woff'),
url("@{material_icons_directory}MaterialIcons-Regular.ttf") format('truetype');
}
.material-icons {
font-family: 'Material Icons';
font-weight: normal;
font-style: normal;
font-size: 18px; /* Preferred icon size */
display: inline-block;
width: 1em;
height: 1em;
line-height: 1;
text-transform: none;
letter-spacing: normal;
/* Support for all WebKit browsers. */
-webkit-font-smoothing: antialiased;
/* Support for Safari and Chrome. */
text-rendering: optimizeLegibility;
/* Support for Firefox. */
-moz-osx-font-smoothing: grayscale;
/* Support for IE. */
font-feature-settings: 'liga';
vertical-align: -4px;
color: rgba(0, 0, 0, 0.54);
&.md-inactive {
color: rgba(0, 0, 0, 0.26);
}
&.md-24 {
font-size: 24px;
vertical-align: -8px;
}
&.md-36 {
font-size: 36px;
vertical-align: -16px;
}
&.md-48 {
font-size: 48px;
vertical-align: -24px;
}
&.md-light {
color: rgba(255, 255, 255, 1);
&.md-inactive {
color: rgba(255, 255, 255, 0.3);
}
}
}

285
src/assets/less/md/_md_list.less Executable file
View File

@ -0,0 +1,285 @@
/* list */
.md-list {
.reset_list;
.border-box;
.uk-nestable-list > li,
> li {
min-height: 48px;
padding: 8px 4px;
box-sizing: border-box;
border-bottom: 1px solid @border_color;
position: relative;
> .md-list-content {
overflow: hidden;
> span {
display: block;
}
.md-list-heading {
margin: 0;
font-weight: 500;
display: block;
overflow: hidden;
padding-bottom: 1px;
}
.md-list-menu {
float: right;
.md-list-menu-toggle {
display: block;
font-size: 18px;
color: rgba(0,0,0,.8);
width: 28px;
height: 28px;
line-height: 28px;
border-radius: 14px;
text-align: center;
}
}
.uk-badge {
float: right;
color: @white !important;
}
.md-list-action {
float: right;
margin-left: 8px;
margin-top: 2px;
display: none;
}
.md-list-action-placeholder {
float: right;
margin-left: 8px;
display: none;
width: 32px;
height: 32px;
}
}
.md-list-action-dropdown {
position: absolute;
right: 16px;
top: 10px;
display: none;
}
> a.md-list-content {
display: block;
color: @text_primary_color;
}
&:last-child {
border-bottom: none;
}
&.md-list-item-active {
color: @accent_color;
background: @background_color_default_hex;
}
&.md-list-item-disabled {
> .md-list-content {
color: @muted_color;
span {
color: @muted_color !important;
}
}
}
&.heading_list {
min-height: 32px;
padding: 32px 8px 16px;
border-bottom: none;
background: transparent !important;
text-transform: uppercase;
}
.uk-touch &,
&:hover {
> .md-list-addon-element {
.uk-nestable-handle {
display: block;
}
}
> .md-list-content {
.md-list-action,
.md-list-action-placeholder {
display: block;
}
}
.md-list-action-dropdown {
display: block;
}
}
}
.uk-nestable-list > li {
margin-left: 64px;
}
&-addon {
> li {
margin-left: 64px;
position: relative;
&:last-child {
.md-list-addon-element {
border-bottom: none;
bottom: 0;
}
}
&:first-child {
.md-list-addon-element {
top: 0;
}
}
&.md-list-item-active {
.md-list-addon-element {
&,
.material-icons {
color: @accent_color;
}
}
}
}
&-element {
position: absolute;
left: -64px;
top: -1px;
bottom: -1px;
width: 64px;
text-align: center;
padding: 8px 0;
display: block;
.element-status {
position: absolute;
right: 12px;
top: 10px;
width: 12px;
height: 12px;
border-radius: 50%;
background: @muted_color;
border: 1px solid @white;
&-danger {
background: @danger_color;
}
&-success {
background: @success_color;
}
&-warning {
background: @warning_color;
}
}
> .md-list-addon-avatar {
margin-top: 2px;
}
> .md-list-addon-icon {
font-size: 28px;
margin-top: 4px;
color: @text_secondary_color;
}
> .material-icons {
margin-top: 6px;
}
.iradio_md,
.icheckbox_md {
margin-top: 10px;
}
.uk-nestable-handle {
position: absolute;
left: -2px;
top: 12px;
display: none;
}
}
}
&-interactive {
li {
cursor: pointer;
}
}
&-bg {
background: @white;
}
&-separated {
li {
background: @white;
padding: 8px;
+ li {
border-top: none;
margin-top: 8px;
}
}
}
&-bg-no-sep {
background: @white;
padding: 8px;
li > .md-list-content {
padding: 0 4px;
}
}
&-outside {
> li {
padding: 0;
> .md-list-content {
padding: 8px 16px;
display: block;
color: @text_primary_color;
}
&.md-list-item-active,
&:hover:not(.heading_list) {
background: @background_color_default;
}
&.heading_list {
padding: 32px 16px 16px;
}
}
&.md-list-addon {
li {
margin-left: 0;
.md-list-addon-element {
position: relative;
top: auto;
left: auto;
float: left;
}
.md-list-content {
padding-left: 0;
}
}
}
}
/*&-outside-wrapper {
overflow: hidden;
}*/
.uk-nestable-list {
padding-left: 0;
.uk-nestable-item {
padding-right: 0;
}
}
.uk-nestable-item + .uk-nestable-item {
margin-top: 0;
}
&-right {
&.md-list-addon {
> li {
margin-left: 0;
margin-right: 64px;
.md-list-addon-element {
left: auto;
right: -64px;
}
}
}
}
&-borderless {
> li {
border-bottom: none;
}
}
}
.uk-touch {
.md-list-addon-element {
.uk-nestable-handle {
display: block !important;
}
}
.md-list-content {
.md-list-action,
.md-list-action-placeholder {
display: block !important;
}
}
.md-list-action-dropdown {
display: block !important;
}
}

View File

@ -0,0 +1,49 @@
/* panels */
.md-panel-full {
.border-box();
position: relative;
overflow: hidden;
min-height: 100%;
> .uk-grid {
height: 100%;
[class*=uk-width] {
height: 100%;
}
}
.md-panel-full-aside {
margin: 16px 16px 32px;
padding: 16px;
&.md-panel-full-aside-bg {
background: @white;
}
}
.md-panel-full-content {
background: @white;
padding: 25px 25px 90px;
width: inherit;
min-width: 100%;
min-height: 100%;
> .md-panel-full-content-inner {
position: relative;
z-index: 10;
}
&:before {
width: inherit;
content: '';
position: absolute;
background: @white;
display: block;
right: 0;
top: 0;
bottom: 0;
.md-box-shadow-left();
z-index: 5;
}
.md-panel-full-content-header {
margin-bottom: 24px;
.md-panel-full-content-menu {
float: right;
}
}
}
}

View File

@ -0,0 +1,59 @@
// variables
@color_variants: 50,100,200,300,400,500,600,700,800,900,A100,A200,A400,A700;
@color_array: 'red','pink','purple','deep-purple','indigo','blue','light-blue','cyan','teal','green','light-green','lime','yellow','amber','orange','deep-orange';
@color_array_no_accent: 'brown','grey','blue-grey';
// colors with accents
.makeMdVariants(@i, @actColor) when (@i <= 14) {
@colorVariant: extract(@color_variants, @i);
.md-color-@{actColor}-@{colorVariant} {
color: ~"@{md-color-@{actColor}-@{colorVariant}}" !important;
}
.md-bg-@{actColor}-@{colorVariant} {
background-color: ~"@{md-color-@{actColor}-@{colorVariant}}" !important;
}
.makeMdVariants(@i + 1,@actColor);
}
.makeMdColors(@i) when (@i <= 16) {
@actColor: extract(@color_array, @i);
.makeMdVariants(1,e(@actColor));
.makeMdColors(@i + 1);
}
.makeMdColors(1);
// colors without accent
.makeMdVariantsNoAccent(@i, @actColor) when (@i <= 10) {
@colorVariant: extract(@color_variants, @i);
.md-color-@{actColor}-@{colorVariant} {
color: ~"@{md-color-@{actColor}-@{colorVariant}}" !important;
}
.md-bg-@{actColor}-@{colorVariant} {
background-color: ~"@{md-color-@{actColor}-@{colorVariant}}" !important;
}
.makeMdVariantsNoAccent(@i + 1,@actColor);
}
.makeMdColorsNoAccent(@i) when (@i <= 3) {
@actColorNoAccent: extract(@color_array_no_accent, @i);
.makeMdVariantsNoAccent(1,e(@actColorNoAccent));
.makeMdColorsNoAccent(@i + 1);
}
.makeMdColorsNoAccent(1);
.md-color-white {
color: #fff !important;
}

View File

@ -0,0 +1,33 @@
/* top bar */
.md-top-bar {
.md-top-bar-checkbox {
padding-top: 10px;
}
.md-top-bar-icons {
margin-top: 5px;
}
.md-top-bar-icons,
.md-top-bar-checkbox {
display: inline-block;
}
.md-btn-group {
margin-top: 4px;
}
.md-top-bar-actions-left {
float: left;
padding-left: 16px;
.md-btn-group {
margin-left: 8px;
}
}
.md-top-bar-actions-right {
float: right;
padding-right: 16px;
.md-btn-group {
margin-right: 8px;
}
}
.md-btn-small {
padding: 2px 12px;
}
}

191
src/assets/less/md/_md_utils.less Executable file
View File

@ -0,0 +1,191 @@
/*** utils ***/
/* avatar */
.md-user-image {
width: 34px;
border-radius: 50%;
&-large {
width: 82px;
border-radius: 50%;
}
}
.md-user {
&-placeholder {
background-color: @background_color_default;
width: 34px;
height: 34px;
border-radius: 50%;
}
&-letters {
display: inline-block;
line-height: 35px;
width: 34px;
height: 34px;
border-radius: 50%;
text-align: center;
text-transform: uppercase;
font-weight: 500;
background-color: @background_color_default;
}
}
/* icons */
.md-icon {
font-size: 24px;
line-height: 32px !important;
height: 32px !important;
color: @text_secondary_color;
border-radius: 50%;
cursor: pointer;
transition: background 280ms ease-out,color 280ms ease-out;
width: 32px !important;
text-align: center;
-webkit-tap-highlight-color: rgba(0,0,0,0);
&:hover,
&:focus,
&:active,
&.active {
color: @text_primary_color;
background: rgba(0,0,0,.08);
}
&-light {
color: @white;
&:hover,
&:focus,
&:active {
color: @white;
background: rgba(0,0,0,.2);
}
}
&-dark {
color: @text_primary_color;
&:hover,
&:focus,
&:active {
color: @text_primary_color;
background: rgba(255,255,255,.6);
}
}
& + & {
margin-left: 4px;
}
&-btn {
display: inline-block;
&.active {
.md-icon {
color: @text_primary_color;
background: rgba(0,0,0,.08);
}
}
}
button& {
background: none;
border: none;
outline: none;
}
}
.uk-open {
.md-icon {
color: @text_primary_color;
background: rgba(0,0,0,.08);
&-light {
color: @white;
background: rgba(0,0,0,.2);
}
&-dark {
color: @text_primary_color;
background: rgba(255,255,255,.6);
}
}
}
/* dropdown list */
.md-list-inputs {
.reset_list();
li {
+ li {
margin-top: 8px;
}
.icheckbox_md {
float: left;
}
label {
overflow: hidden;
padding-left: 8px;
display: block;
cursor: pointer;
}
}
}
/* hr */
.md-hr {
margin: 32px 0;
height: 0;
border-top: 2px solid @border_color;
}
/* animated show */
@keyframes hierarchical_show {
0% {
opacity: 0;
transform: scale3d(.2, .2, 2);
}
50% {
opacity: 1;
}
100% {
transform: scale3d(1, 1, 1);
}
}
.hierarchical_show {
will-change: transform, opacity;
> * {
visibility: hidden;
}
&_inView {
> * {
animation-fill-mode: both;
animation-timing-function: @md_easing;
animation-duration: 700ms;
animation-name: hierarchical_show;
visibility: visible;
}
}
}
@keyframes hierarchical_slide {
0% {
opacity: 0;
transform: translate3d(0, 160%, 0);
}
33% {
opacity: 1;
}
100% {
transform: translate3d(0, 0, 0);
}
}
.hierarchical_slide {
will-change: transform, opacity;
> * {
visibility: hidden;
}
&_inView {
> * {
animation-fill-mode: both;
animation-timing-function: @md_easing;
animation-duration: 700ms;
animation-name: hierarchical_slide;
visibility: visible;
}
}
}
.fast_animation {
animation-duration: 350ms;
}

View File

@ -0,0 +1,61 @@
// shadows
.boxShadowHelper(@level: 1){
& when (@level = 0) {
box-shadow: none !important;
}
& when (@level = 1) {
box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);
}
& when (@level = 2) {
box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23);
}
& when (@level = 3) {
box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23);
}
& when (@level = 4) {
box-shadow: 0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22);
}
& when (@level = 5) {
box-shadow: 0 19px 38px rgba(0,0,0,0.30), 0 15px 12px rgba(0,0,0,0.22);
}
}
.md-box-shadow-left() {
box-shadow: -2px 2px 5px rgba(0,0,0,.26);
}
.md-box-shadow-right() {
box-shadow: 2px 2px 5px rgba(0,0,0,.26);
}
.md-box-shadow-medium-right() {
box-shadow: 4px 0 8px rgba(0,0,0,.26);
}
/* bg colors */
.md-bg-cyan {
background-color: @md-color-cyan-600 !important;
color: @white;
}
.md-bg-light-green {
background-color: @md-color-light-green-600 !important;
color: @white;
}
.md-bg-grey {
background-color: @md-color-grey-700 !important;
color: @white;
}
.md-bg-red {
background-color: @md-color-red-700 !important;
color: @white;
}
.md-bg-light-blue {
background-color: @md-color-light-blue-700 !important;
color: @white;
}
.md-bg-teal {
background-color: @md-color-teal-600 !important;
color: @white;
}
.md-bg-purple {
background-color: @md-color-purple-600 !important;
color: @white;
}

21
src/assets/less/md/md_main.less Executable file
View File

@ -0,0 +1,21 @@
// variables_mixins
@import '_md_variables_mixins';
// buttons
@import '_md_buttons';
// colors
@import '_md_colors';
@import '_md_precompiled_colors';
// cards
@import '_md_cards';
// forms
@import '_md_forms';
// icons
@import '_md_icons';
// list
@import '_md_list';
// panels
@import '_md_panels';
// top bar
@import '_md_top_bar';
// utils
@import '_md_utils';

View File

@ -0,0 +1,23 @@
// default theme
@theme_default_color: @md-color-light-blue-500;
@theme_default_colorLight: @md-color-light-blue-50;
@theme_default_colorDark: @md-color-light-blue-700;
@theme_default_colorAccent: @md-color-light-green-A200;
.uk-navbar {
background: @theme_default_color;
&-nav {
> li > a {
color: @white;
&:hover,
&:active {
background: none;
color: @white;
}
}
}
}
.hero_section {
background: @theme_default_color;
}

11
src/browserslist Normal file
View File

@ -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

View File

@ -0,0 +1,6 @@
export const environment = {
production: true,
API_ENDPOINT: '/api',
FAQ_ENDPOINT: '/uoa-admin-tools/api',
FAQ_HOMEPAGE: '/uoa-admin-tools/dashboard'
};

View File

@ -0,0 +1,19 @@
// 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,
API_ENDPOINT: '/uoa-repository-manager-service',
FAQ_ENDPOINT: 'http://audrey.athenarc.gr:5555/api',
FAQ_HOMEPAGE: 'http://audrey.athenarc.gr:5555'
};
/*
* For easier debugging in development mode, you can import the following file
* to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.
*
* This import should be commented out in production mode because it will have a negative impact
* on performance if an error is thrown.
*/
// import 'zone.js/dist/zone-error'; // Included with Angular CLI.

BIN
src/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

51
src/index.html Normal file
View File

@ -0,0 +1,51 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Open Science Observatory</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
<!--<script src="https://kit.fontawesome.com/dfd38f32b9.js" crossorigin="anonymous"></script>-->
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.11.2/css/all.css" integrity="sha384-KA6wR/X5RY4zFAHpv/CnoG2UW1uogYfdnP67Uv7eULvTveboZJg0qUpmJZb5VqzN" crossorigin="anonymous">
<!-- uikit -->
<link rel="stylesheet" href="assets/css/uikit.almost-flat.min.css" media="all">
<!--<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.2.0/css/uikit.css" />-->
<!-- altair landing page -->
<link rel="stylesheet" href="assets/css/main.css" media="all">
<link rel="stylesheet" href="assets/css/os-observatory-custom.css" media="all">
</head>
<body class="header_sticky">
<!--<body class="header_sticky header_shadow">-->
<!-- RECOMMENDED if your web app will not function without JavaScript enabled -->
<noscript>
<div style="width: 22em; position: absolute; left: 50%; margin-left: -11em; color: red; background-color: white; border: 1px solid red; padding: 4px; font-family: sans-serif">
Your web browser must have JavaScript enabled
in order for this application to display correctly.
</div>
</noscript>
<app-root>
<div uk-spinner="ratio: 2" class="uk-overlay uk-position-center uk-dark" style="margin: auto"></div>
</app-root>
<!-- uikit functions -->
<!--<script src="assets/js/uikit_custom.js"></script>-->
<!-- common functions -->
<!--<script src="assets/js/common.min.js"></script>-->
<!-- altair common functions/helpers -->
<!--<script src="assets/js/altair_lp_common.min.js"></script>-->
</body>
</html>

31
src/karma.conf.js Normal file
View File

@ -0,0 +1,31 @@
// 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'),
reports: ['html', 'lcovonly'],
fixWebpackSourcePaths: true
},
reporters: ['progress', 'kjhtml'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['Chrome'],
singleRun: false
});
};

12
src/main.ts Normal file
View File

@ -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));

80
src/polyfills.ts Normal file
View File

@ -0,0 +1,80 @@
/**
* 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
*/
/** IE9, IE10 and IE11 requires all of the following polyfills. **/
// import 'core-js/es6/symbol';
// import 'core-js/es6/object';
// import 'core-js/es6/function';
// import 'core-js/es6/parse-int';
// import 'core-js/es6/parse-float';
// import 'core-js/es6/number';
// import 'core-js/es6/math';
// import 'core-js/es6/string';
// import 'core-js/es6/date';
// import 'core-js/es6/array';
// import 'core-js/es6/regexp';
// import 'core-js/es6/map';
// import 'core-js/es6/weak-map';
// import 'core-js/es6/set';
/**
* If the application will be indexed by Google Search, the following is required.
* Googlebot uses a renderer based on Chrome 41.
* https://developers.google.com/search/docs/guides/rendering
**/
// import 'core-js/es6/array';
/** IE10 and IE11 requires the following for NgClass support on SVG elements */
// import 'classlist.js'; // Run `npm install --save classlist.js`.
/** IE10 and IE11 requires the following for the Reflect API. */
// import 'core-js/es6/reflect';
/**
* 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
*/
// (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
*/

1
src/styles.css Normal file
View File

@ -0,0 +1 @@
/* You can add global styles to this file, and also import other style files */

20
src/test.ts Normal file
View File

@ -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);

11
src/tsconfig.app.json Normal file
View File

@ -0,0 +1,11 @@
{
"extends": "../tsconfig.json",
"compilerOptions": {
"outDir": "../out-tsc/app",
"types": []
},
"exclude": [
"test.ts",
"**/*.spec.ts"
]
}

18
src/tsconfig.spec.json Normal file
View File

@ -0,0 +1,18 @@
{
"extends": "../tsconfig.json",
"compilerOptions": {
"outDir": "../out-tsc/spec",
"types": [
"jasmine",
"node"
]
},
"files": [
"test.ts",
"polyfills.ts"
],
"include": [
"**/*.spec.ts",
"**/*.d.ts"
]
}

17
src/tslint.json Normal file
View File

@ -0,0 +1,17 @@
{
"extends": "../tslint.json",
"rules": {
"directive-selector": [
true,
"attribute",
"app",
"camelCase"
],
"component-selector": [
true,
"element",
"app",
"kebab-case"
]
}
}

21
tsconfig.json Normal file
View File

@ -0,0 +1,21 @@
{
"compileOnSave": false,
"compilerOptions": {
"baseUrl": "./",
"outDir": "./dist/out-tsc",
"sourceMap": true,
"declaration": false,
"module": "es2015",
"moduleResolution": "node",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"target": "es5",
"typeRoots": [
"node_modules/@types"
],
"lib": [
"es2018",
"dom"
]
}
}

131
tslint.json Normal file
View File

@ -0,0 +1,131 @@
{
"rulesDirectory": [
"node_modules/codelyzer"
],
"rules": {
"arrow-return-shorthand": true,
"callable-types": true,
"class-name": true,
"comment-format": [
true,
"check-space"
],
"curly": true,
"deprecation": {
"severity": "warn"
},
"eofline": true,
"forin": true,
"import-blacklist": [
true,
"rxjs/Rx"
],
"import-spacing": true,
"indent": [
true,
"spaces"
],
"interface-over-type-literal": true,
"label-position": true,
"max-line-length": [
true,
140
],
"member-access": false,
"member-ordering": [
true,
{
"order": [
"static-field",
"instance-field",
"static-method",
"instance-method"
]
}
],
"no-arg": true,
"no-bitwise": true,
"no-console": [
true,
"debug",
"info",
"time",
"timeEnd",
"trace"
],
"no-construct": true,
"no-debugger": true,
"no-duplicate-super": true,
"no-empty": false,
"no-empty-interface": true,
"no-eval": true,
"no-inferrable-types": [
true,
"ignore-params"
],
"no-misused-new": true,
"no-non-null-assertion": true,
"no-redundant-jsdoc": true,
"no-shadowed-variable": true,
"no-string-literal": false,
"no-string-throw": true,
"no-switch-case-fall-through": true,
"no-trailing-whitespace": true,
"no-unnecessary-initializer": true,
"no-unused-expression": true,
"no-use-before-declare": true,
"no-var-keyword": true,
"object-literal-sort-keys": false,
"one-line": [
true,
"check-open-brace",
"check-catch",
"check-else",
"check-whitespace"
],
"prefer-const": true,
"quotemark": [
true,
"single"
],
"radix": true,
"semicolon": [
true,
"always"
],
"triple-equals": [
true,
"allow-null-check"
],
"typedef-whitespace": [
true,
{
"call-signature": "nospace",
"index-signature": "nospace",
"parameter": "nospace",
"property-declaration": "nospace",
"variable-declaration": "nospace"
}
],
"unified-signatures": true,
"variable-name": false,
"whitespace": [
true,
"check-branch",
"check-decl",
"check-operator",
"check-separator",
"check-type"
],
"no-output-on-prefix": true,
"use-input-property-decorator": true,
"use-output-property-decorator": true,
"use-host-property-decorator": 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
}
}