Browse Source

Merge branch 'feature/apis' into develop

hotfix/class_typo
Dslak 5 years ago
parent
commit
efd1193cf3
  1. 4
      .gitignore
  2. 5
      angular.json
  3. 2
      package.json
  4. 16
      src/apis/conn.conn
  5. 93
      src/apis/index.php
  6. 43
      src/app/about/about.component.html
  7. 86
      src/app/about/about.component.scss
  8. 10
      src/app/about/about.component.ts
  9. 54
      src/app/app-layout/app-layout.component.html
  10. 89
      src/app/app-layout/app-layout.component.ts
  11. 32
      src/app/app-routing.module.ts
  12. 18
      src/app/app.module.ts
  13. 21
      src/app/detail/detail.component.html
  14. 73
      src/app/detail/detail.component.scss
  15. 12
      src/app/detail/detail.component.spec.ts
  16. 50
      src/app/detail/detail.component.ts
  17. 1
      src/app/entertainment/entertainment.component.html
  18. 0
      src/app/entertainment/entertainment.component.scss
  19. 25
      src/app/entertainment/entertainment.component.spec.ts
  20. 15
      src/app/entertainment/entertainment.component.ts
  21. 1
      src/app/exhibitions/exhibitions.component.html
  22. 0
      src/app/exhibitions/exhibitions.component.scss
  23. 15
      src/app/exhibitions/exhibitions.component.ts
  24. 22
      src/app/header/header.component.scss
  25. 7
      src/app/header/header.component.ts
  26. 1
      src/app/installations/installations.component.html
  27. 0
      src/app/installations/installations.component.scss
  28. 25
      src/app/installations/installations.component.spec.ts
  29. 15
      src/app/installations/installations.component.ts
  30. 1
      src/app/performances/performances.component.html
  31. 0
      src/app/performances/performances.component.scss
  32. 25
      src/app/performances/performances.component.spec.ts
  33. 15
      src/app/performances/performances.component.ts
  34. 17
      src/app/portfolio/portfolio.component.html
  35. 102
      src/app/portfolio/portfolio.component.scss
  36. 23
      src/app/portfolio/portfolio.component.ts
  37. 16
      src/app/services/apis.service.spec.ts
  38. 33
      src/app/services/apis.service.ts
  39. 16
      src/app/services/base-service.ts
  40. 13
      src/app/services/parse-xml.ts
  41. BIN
      src/assets/fonts/icomoon.eot
  42. 25
      src/assets/fonts/icomoon.svg
  43. BIN
      src/assets/fonts/icomoon.ttf
  44. BIN
      src/assets/fonts/icomoon.woff
  45. 1
      src/assets/fonts/selection.json
  46. BIN
      src/assets/images/favicon.png
  47. 13
      src/assets/scss/global.scss
  48. 75
      src/assets/scss/icons.scss
  49. 4
      src/assets/scss/main.scss
  50. 13
      src/assets/scss/variables.scss
  51. 6
      src/environments/environment.prod.ts
  52. 17
      src/environments/environment.ts
  53. BIN
      src/favicon.ico
  54. BIN
      src/favicon.png
  55. 2
      src/index.html

4
.gitignore

@ -2,3 +2,7 @@
node_modules/ node_modules/
package-lock\.json package-lock\.json
src/assets/images/contents/
dist/

5
angular.json

@ -24,8 +24,9 @@
"tsConfig": "tsconfig.app.json", "tsConfig": "tsconfig.app.json",
"aot": true, "aot": true,
"assets": [ "assets": [
"src/favicon.ico",
"src/assets"
"src/assets/images/favicon.png",
"src/assets",
"src/apis"
], ],
"styles": [ "styles": [
"src/assets/scss/main.scss" "src/assets/scss/main.scss"

2
package.json

@ -20,6 +20,8 @@
"@angular/platform-browser": "~9.1.7", "@angular/platform-browser": "~9.1.7",
"@angular/platform-browser-dynamic": "~9.1.7", "@angular/platform-browser-dynamic": "~9.1.7",
"@angular/router": "~9.1.7", "@angular/router": "~9.1.7",
"bootstrap": "^4.5.3",
"ng-particles": "^2.1.11",
"rxjs": "~6.5.4", "rxjs": "~6.5.4",
"tslib": "^1.10.0", "tslib": "^1.10.0",
"zone.js": "~0.10.2" "zone.js": "~0.10.2"

16
src/apis/conn.conn

@ -0,0 +1,16 @@
<?php
$DATAhst="localhost";
$DATAusr="root";
$DATApwd="root";
$DATAdtb="www_dslak_it";
/*
$DATAhst="localhost";
$DATAusr="token";
$DATApwd="tokendbpwd";
$DATAdtb="www_dslak_it";
*/
?>

93
src/apis/index.php

@ -0,0 +1,93 @@
<?php
@include 'conn.conn';
$GLOBALS['conn'];
$conn=@mysqli_connect($DATAhst,$DATAusr,$DATApwd,$DATAdtb)or die("CONNECTION ERROR");
$content = null;
$content->items = array();
$filter = array("portfolio", "installations", "entertainment", "performances", "workshops");
switch($_GET['query']) {
case "portfolio":
case "installations":
case "entertainment":
case "performances":
case "workshops":
if($_GET['query'] == 'portfolio') {$filter = '';} else {$filter = "WHERE type='".$_GET['query']."'";}
$qe = mysqli_query($conn,"SELECT * FROM `works` $filter ORDER BY id DESC");
if(mysqli_num_rows($qe) > 0) {
$content = null;
$content->items = array();
while($re = mysqli_fetch_array($qe)) {
$item = null;
$item->id = $re['id'];
$item->title = $re['title'];
$item->type = $re['type'];
$item->tags = $re['tags'];
$item->image = $re['image'];
array_push($content->items, $item);
}
}
break;
case "exhibitions":
$qe = mysqli_query($conn,"SELECT * FROM `exhibitions` ORDER BY date_from DESC");
if(mysqli_num_rows($qe) > 0) {
$content = null;
$content->items = array();
while($re = mysqli_fetch_array($qe)) {
$item = null;
$item->id = $re['id'];
$item->title = $re['title'];
$item->date_from = $re['date_from'];
$item->date_to = $re['date_to'];
$item->tags = $re['tags'];
$item->image = $re['image'];
array_push($content->items, $item);
}
}
break;
case "detail":
$qe = mysqli_query($conn,"SELECT * FROM `".$_GET['type']."` WHERE id=".$_GET['id']);
if(mysqli_num_rows($qe)>0) {
$content = null;
$re = mysqli_fetch_array($qe);
$item = null;
$item->id = $re['id'];
$item->title = $re['title'];
$item->content = $re['content'];
$item->tags = $re['tags'];
$item->image = $re['image'];
if($_GET['type'] == 'exhibitions') {
$item->date_from = $re['date_from'];
$item->date_to = $re['date_to'];
$item->works = array();
$qx = mysqli_query($conn,"SELECT id,title FROM `works` WHERE id IN (".$re['works'].")");
while($re = mysqli_fetch_array($qx)) {
$ex = null;
$ex->id = $re['id'];
$ex->title = $re['title'];
array_push($item->works, $ex);
}
} else if($_GET['type'] == 'works') {
$item->type = $re['type'];
$item->exhibitions = array();
$qx = mysqli_query($conn,"SELECT id,title FROM `exhibitions` WHERE id IN (".$re['exhibitions'].")");
while($re = mysqli_fetch_array($qx)) {
$ex = null;
$ex->id = $re['id'];
$ex->title = $re['title'];
array_push($item->exhibitions, $ex);
}
}
$content->item = $item;
}
break;
}
header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json');
echo json_encode($content);
?>

43
src/app/about/about.component.html

@ -1 +1,42 @@
<p>about works!</p>
<div class="component-about container">
<div class="row">
<div class="col-10 content mx-auto">
<button class="back icon-back" (click)="back()"></button>
<p> <b>DSLAK</b> è un progetto che nasce nel 2010 da un'idea di Carmine De Rosa, sviluppatore ed amministratore di sistema in ambiente Unix/Linux, dopo aver completato gli studi in ambito elettronico approfondisce le proprie conoscenze informatiche presso l'Università di Salerno dove insieme ad un gruppo di appassionati di haking fonda HCSSLUG (Linux Users Group dell'Università di Salerno) e ed il relativo HackLab con il quale realizza numerosi progetti in ambito OpenSource, basati sulla ricerca e sulla sperimentazione in ambito tecnologico. </p>
<p> Nel 2006 si avvicina alle arti digitali e nel 2009, incuriosito dapprima dall'aspetto tecnico ma senza tralasciare quello scenico e concettuale, inizia ad approfondire le propie conoscenze nell'ambito della new-media art e delle installazioni interattive, studiando le soluzioni adottate da artisti affermati e sviluppando varie soluzioni alternative che utilizzano però un approccio più sostenibile, efficiente e soprattutto open. </p>
<p> Nel 2011 realizza le sue prime installazioni interattive e ad oggi è alla continua ricerca di soluzioni creative. </p>
<p> <b>DSLAK</b> ha ad oggi all'attivo numerosi progetti, come workshops sull'utilizzo di sensori e microcontrollori nel campo dell'interattività e delle arti digitali, installazioni interattive e performances live frutto della sperimentazione e della ricerca continua, oltre alle collaborazioni con diversi artisti nazionali ed internazionali. </p>
<div class="about-links pt-4 pb-5">
<a class="link" target="_blank" rel="noopener noreferrer" href="https://www.facebook.com/dslakMediaArts">
<span class="icon icon-facebook"></span>
<div class="label">dslakMediaArts</div>
</a>
<a class="link" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/c/Dslak">
<span class="icon icon-youtube"></span>
<div class="label">dslak</div>
</a>
<a class="link" target="_blank" rel="noopener noreferrer" href="https://vimeo.com/dslak">
<span class="icon icon-vimeo"></span>
<div class="label">dslak</div>
</a>
<a class="link" target="_blank" rel="noopener noreferrer" href="https://twitter.com/dslak_">
<span class="icon icon-twitter"></span>
<div class="label">dslak_</div>
</a>
<a class="link" target="_blank" rel="noopener noreferrer" href="tel:+393391805849">
<span class="icon icon-phone"></span>
<div class="label">+39 339 1805849</div>
</a>
<a class="link" target="_blank" rel="noopener noreferrer" href="mailto:dslaknma@gmail.com">
<span class="icon icon-envelope"></span>
<div class="label">dslaknma@gmail.com</div>
</a>
</div>
</div>
</div>

86
src/app/about/about.component.scss

@ -0,0 +1,86 @@
@import "../../assets/scss/variables";
.component-about {
z-index: 0;
.content {
position: relative;
margin: 150px auto 80px auto;
padding: 40px 50px;
font-size: $font-18;
text-align: justify;
background: $white-alpha;
color: $black;
box-shadow: 0px 0px 25px $white-alpha;
border-radius: 10px;
.about-links {
color: $black;
.link {
display: flex;
text-decoration: none;
margin: 0;
padding: 0;
line-height: 35px;
width: 200px;
transition: transform .3s;
-webkit-backface-visibility: hidden;
.icon {
display: inline-block;
font-size: 15px;
padding: 5px;
margin: 5px;
background: $dark-gray;
border-radius: 2px;
color: $white;
height: 25px;
width: 25px;
text-align: center;
}
.label {
display: inline-block;
color: $dark-gray;
font-size: $font-16;
padding-left: 5px;
}
&:hover {
transform: scale(1.1);
}
}
}
.back {
position: absolute;
top: -40px;
left: 0px;
height: 40px;
width: 60px;
appearance: none;
border: none;
padding: 0;
font-size: $font-40;
color: $black-alpha;
background: transparent;
cursor: pointer;
transition: transform .3s;
-webkit-backface-visibility: hidden;
&:hover {
transform: scale(1.1) translateX(-10px);
}
}
}
}
@media (min-width: map-get($grid-breakpoints, 'md')) {
.component-about {
.content {
transform: rotate(2deg) skew(0deg, -6deg);
}
}
}

10
src/app/about/about.component.ts

@ -1,4 +1,5 @@
import { Component, OnInit } from '@angular/core';
import { Component, OnInit } from '@angular/core'
import { Location } from '@angular/common'
@Component({ @Component({
selector: 'app-about', selector: 'app-about',
@ -7,9 +8,14 @@ import { Component, OnInit } from '@angular/core';
}) })
export class AboutComponent implements OnInit { export class AboutComponent implements OnInit {
constructor() { }
constructor(
private location: Location
) { }
ngOnInit(): void { ngOnInit(): void {
} }
back() {
this.location.back()
}
} }

54
src/app/app-layout/app-layout.component.html

@ -1,54 +1,4 @@
<app-header></app-header> <app-header></app-header>
<router-outlet></router-outlet> <router-outlet></router-outlet>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<Particles class="particles" [id]="id" [options]="particlesOptions" (particlesLoaded)="particlesLoaded($event)" *ngIf="particlesEnabled"></Particles>

89
src/app/app-layout/app-layout.component.ts

@ -1,4 +1,5 @@
import { Component, OnInit } from '@angular/core';
import { Component, OnInit } from '@angular/core'
import type { Container } from 'tsparticles'
@Component({ @Component({
selector: 'app-app-layout', selector: 'app-app-layout',
@ -7,9 +8,95 @@ import { Component, OnInit } from '@angular/core';
}) })
export class AppLayoutComponent implements OnInit { export class AppLayoutComponent implements OnInit {
public particlesEnabled: boolean = false
public id: string = 'tsparticles'
public particlesOptions: any = {
background: {
color: {
value: "transparent"
}
},
fpsLimit: 60,
interactivity: {
detectsOn: "canvas",
events: {
onClick: {
enable: true,
mode: "push"
},
onHover: {
enable: true,
mode: "repulse"
},
resize: true
},
modes: {
bubble: {
distance: 200,
duration: 2,
opacity: 0.8,
size: 40
},
push: {
quantity: 6
},
repulse: {
distance: 100,
duration: 0.4
}
}
},
particles: {
color: {
value: "#fff"
},
links: {
color: "#fff",
distance: 150,
enable: true,
opacity: 0.7,
width: 1
},
collisions: {
enable: true
},
move: {
direction: "none",
enable: true,
outMode: "bounce",
random: false,
speed: 2,
straight: false
},
number: {
density: {
enable: true,
value_area: 600
},
value: 90
},
opacity: {
value: 0.5
},
shape: {
type: "circle"
},
size: {
random: true,
value: 5
}
},
detectRetina: true
}
constructor() { } constructor() { }
ngOnInit(): void { ngOnInit(): void {
} }
particlesLoaded(container: Container): void {
//console.log('particlesLoaded', container)
}
} }

32
src/app/app-routing.module.ts

@ -3,26 +3,32 @@ import { Routes, RouterModule } from '@angular/router'
import { AppLayoutComponent } from './app-layout/app-layout.component' import { AppLayoutComponent } from './app-layout/app-layout.component'
import { AboutComponent } from './about/about.component' import { AboutComponent } from './about/about.component'
import { PortfolioComponent } from './portfolio/portfolio.component' import { PortfolioComponent } from './portfolio/portfolio.component'
import { ExhibitionsComponent } from './exhibitions/exhibitions.component'
import { InstallationsComponent } from './installations/installations.component'
import { EntertainmentComponent } from './entertainment/entertainment.component'
import { PerformancesComponent } from './performances/performances.component'
import { WorkshopsComponent } from './workshops/workshops.component'
import { DetailComponent } from './detail/detail.component'
const routes: Routes = [ const routes: Routes = [
{ {
path: '', path: '',
component: AppLayoutComponent, component: AppLayoutComponent,
children: [ children: [
{ path: '', redirectTo: '/portfolio', pathMatch: 'full' },
{ path: 'portfolio', component: PortfolioComponent },
//{ path: '', redirectTo: '/portfolio', pathMatch: 'full' },
{ path: '', component: PortfolioComponent },
{ path: 'about', component: AboutComponent }, { path: 'about', component: AboutComponent },
{ path: 'exhibitions', component: ExhibitionsComponent },
{ path: 'installations', component: InstallationsComponent },
{ path: 'entertainment', component: EntertainmentComponent },
{ path: 'performances', component: PerformancesComponent },
{ path: 'workshops', component: WorkshopsComponent }
{ path: 'portfolio', component: PortfolioComponent },
{ path: 'exhibitions', component: PortfolioComponent },
{ path: 'installations', component: PortfolioComponent },
{ path: 'entertainment', component: PortfolioComponent },
{ path: 'performances', component: PortfolioComponent },
{ path: 'workshops', component: PortfolioComponent },
{ path: 'detail', component: DetailComponent,
children: [
{ path: '**', component: DetailComponent,
children: [
{ path: '**', component: DetailComponent }
]
}
]
}
] ]
} }
] ]

18
src/app/app.module.ts

@ -1,5 +1,7 @@
import { BrowserModule } from '@angular/platform-browser'; import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';
import { NgParticlesModule } from "ng-particles";
import { AppRoutingModule } from './app-routing.module'; import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component'; import { AppComponent } from './app.component';
@ -7,11 +9,7 @@ import { HeaderComponent } from './header/header.component';
import { AppLayoutComponent } from './app-layout/app-layout.component'; import { AppLayoutComponent } from './app-layout/app-layout.component';
import { AboutComponent } from './about/about.component'; import { AboutComponent } from './about/about.component';
import { PortfolioComponent } from './portfolio/portfolio.component'; import { PortfolioComponent } from './portfolio/portfolio.component';
import { ExhibitionsComponent } from './exhibitions/exhibitions.component';
import { InstallationsComponent } from './installations/installations.component';
import { EntertainmentComponent } from './entertainment/entertainment.component';
import { PerformancesComponent } from './performances/performances.component';
import { WorkshopsComponent } from './workshops/workshops.component';
import { DetailComponent } from './detail/detail.component';
@NgModule({ @NgModule({
declarations: [ declarations: [
@ -20,15 +18,13 @@ import { WorkshopsComponent } from './workshops/workshops.component';
AppLayoutComponent, AppLayoutComponent,
AboutComponent, AboutComponent,
PortfolioComponent, PortfolioComponent,
ExhibitionsComponent,
InstallationsComponent,
EntertainmentComponent,
PerformancesComponent,
WorkshopsComponent
DetailComponent
], ],
imports: [ imports: [
BrowserModule, BrowserModule,
AppRoutingModule
AppRoutingModule,
NgParticlesModule,
HttpClientModule
], ],
providers: [], providers: [],
bootstrap: [AppComponent] bootstrap: [AppComponent]

21
src/app/detail/detail.component.html

@ -0,0 +1,21 @@
<div class="component-detail container">
<div class="row">
<div class="col-11 col-md-10 col-lg-12 content mx-auto">
<button class="back icon-back" (click)="back()"></button>
<h2 class="title">{{details.title}}</h2>
<div class="text" [innerHTML]="details.content"></div>
<span class="tags" *ngIf="details.tags"><b>Tags:</b> {{details.tags}}</span>
<span class="links" *ngIf="details.exhibitions && details.exhibitions.length"><b>Exhibitions:</b>
<span class="link" *ngFor="let exhibition of details.exhibitions"
(click)="showDetails('exhibitions', exhibition.id)"
routerLink="/detail/exhibitions/{{exhibition.id}}">{{exhibition.title}} </span>
</span>
<span class="links" *ngIf="details.works && details.works.length"><b>Works:</b>
<span class="link" *ngFor="let work of details.works"
(click)="showDetails('works', work.id)"
routerLink="/detail/works/{{work.id}}">{{work.title}} </span>
</span>
</div>
</div>

73
src/app/detail/detail.component.scss

@ -0,0 +1,73 @@
@import "../../assets/scss/variables";
.component-detail {
z-index: 0;
.content {
position: relative;
margin: 150px auto 80px auto;
padding: 40px 50px;
background: $white-alpha;
color: $black;
box-shadow: 0px 0px 25px $white-alpha;
border-radius: 10px;
.title {
margin-top: 0;
font-size: $font-34;
font-weight: bold;
text-transform: uppercase;
}
.text {
font-size: $font-18;
text-align: justify;
padding-bottom: 40px;
}
.tags,
.links {
display: block;
font-size: $font-12;
text-transform: uppercase;
padding: 5px 0;
.link {
display: inline-block;
font-size: $font-12;
text-transform: uppercase;
padding: 0 5px;
cursor: pointer;
}
}
.back {
position: absolute;
top: -40px;
left: 0px;
height: 40px;
width: 60px;
appearance: none;
border: none;
padding: 0;
font-size: $font-40;
color: $black-alpha;
background: transparent;
cursor: pointer;
transition: transform .3s;
-webkit-backface-visibility: hidden;
&:hover {
transform: scale(1.1) translateX(-10px);
}
}
}
}
@media (min-width: map-get($grid-breakpoints, 'md')) {
.component-detail {
.content {
transform: rotate(2deg) skew(0deg, -6deg);
}
}
}

12
src/app/exhibitions/exhibitions.component.spec.ts → src/app/detail/detail.component.spec.ts

@ -1,20 +1,20 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ExhibitionsComponent } from './exhibitions.component';
import { DetailComponent } from './detail.component';
describe('ExhibitionsComponent', () => {
let component: ExhibitionsComponent;
let fixture: ComponentFixture<ExhibitionsComponent>;
describe('DetailComponent', () => {
let component: DetailComponent;
let fixture: ComponentFixture<DetailComponent>;
beforeEach(async(() => { beforeEach(async(() => {
TestBed.configureTestingModule({ TestBed.configureTestingModule({
declarations: [ ExhibitionsComponent ]
declarations: [ DetailComponent ]
}) })
.compileComponents(); .compileComponents();
})); }));
beforeEach(() => { beforeEach(() => {
fixture = TestBed.createComponent(ExhibitionsComponent);
fixture = TestBed.createComponent(DetailComponent);
component = fixture.componentInstance; component = fixture.componentInstance;
fixture.detectChanges(); fixture.detectChanges();
}); });

50
src/app/detail/detail.component.ts

@ -0,0 +1,50 @@
import { Component, OnInit } from '@angular/core'
import { Router, NavigationEnd, NavigationStart, ActivatedRoute } from '@angular/router'
import { Location } from '@angular/common'
import { ApisService } from '../services/apis.service'
@Component({
selector: 'app-detail',
templateUrl: './detail.component.html',
styleUrls: ['./detail.component.scss']
})
export class DetailComponent implements OnInit {
public details: any = {}
private history: string[] = []
constructor(
private apisService: ApisService,
private router: Router,
private location: Location,
private activeRoute: ActivatedRoute
) { }
ngOnInit(): void {
this.showDetails(this.router.url.split('/')[2], this.router.url.split('/')[3])
}
showDetails(section, id): void {
this.apisService.getDetails(section, id).toPromise().then((response) => {
if(this.history[this.history.length - 1] != `/detail/${section}/${id}`) {
this.history.push(`/detail/${section}/${id}`)
}
this.details = response.item
},(error) => {
console.error('getPortfolio ERROR', error)
}).catch((e) => {
console.error('getPortfolio CATCH', e)
})
}
back(): void {
this.history.pop()
if(this.history.length > 0) {
const last = this.history[this.history.length - 1]
this.showDetails(last.split('/')[2], last.split('/')[3])
this.location.back()
} else {
this.location.back()
}
}
}

1
src/app/entertainment/entertainment.component.html

@ -1 +0,0 @@
<p>entertainment works!</p>

0
src/app/entertainment/entertainment.component.scss

25
src/app/entertainment/entertainment.component.spec.ts

@ -1,25 +0,0 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { EntertainmentComponent } from './entertainment.component';
describe('EntertainmentComponent', () => {
let component: EntertainmentComponent;
let fixture: ComponentFixture<EntertainmentComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ EntertainmentComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(EntertainmentComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

15
src/app/entertainment/entertainment.component.ts

@ -1,15 +0,0 @@
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-entertainment',
templateUrl: './entertainment.component.html',
styleUrls: ['./entertainment.component.scss']
})
export class EntertainmentComponent implements OnInit {
constructor() { }
ngOnInit(): void {
}
}

1
src/app/exhibitions/exhibitions.component.html

@ -1 +0,0 @@
<p>exhibitions works!</p>

0
src/app/exhibitions/exhibitions.component.scss

15
src/app/exhibitions/exhibitions.component.ts

@ -1,15 +0,0 @@
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-exhibitions',
templateUrl: './exhibitions.component.html',
styleUrls: ['./exhibitions.component.scss']
})
export class ExhibitionsComponent implements OnInit {
constructor() { }
ngOnInit(): void {
}
}

22
src/app/header/header.component.scss

@ -7,8 +7,9 @@
left: 0; left: 0;
height: 100vh; height: 100vh;
width: 100vw; width: 100vw;
background: $yellow;
transition: height .5s;
background: transparent;
transition: height .5s, background .4s;
z-index: 100;
.logo-container { .logo-container {
height: 200px; height: 200px;
@ -60,22 +61,23 @@
} }
&.sticky { &.sticky {
height: 0px;
height: 0;
background: transparent;
.logo-container { .logo-container {
height: 80px;
width: 80px;
height: 100px;
width: 100px;
.circles { .circles {
&:before, &:before,
&:after { &:after {
background: $yellow;
//background: $yellow;
} }
} }
&.menu-open { &.menu-open {
height: 120px;
width: 120px;
height: 140px;
width: 140px;
.circles { .circles {
&:before, &:before,
&:after { &:after {
@ -92,7 +94,7 @@
left: 0; left: 0;
height: 100%; height: 100%;
width: 100%; width: 100%;
background: $yellow;
background: $yellow-alpha;
border-radius: 100px; border-radius: 100px;
transform: scale(0) skew(20deg, 20deg); transform: scale(0) skew(20deg, 20deg);
transition: transform .5s, border-radius .4s; transition: transform .5s, border-radius .4s;
@ -102,7 +104,7 @@
display: block; display: block;
text-align: center; text-align: center;
padding-top: 180px; padding-top: 180px;
height: calc(100vh - 180px);
height: 100vh;
overflow: hidden; overflow: hidden;
overflow-y: auto; overflow-y: auto;

7
src/app/header/header.component.ts

@ -11,16 +11,18 @@ export class HeaderComponent implements OnInit {
public isSticky: boolean = false public isSticky: boolean = false
public isMenuOpen: boolean = false public isMenuOpen: boolean = false
public isFirstScroll: boolean = true
constructor(@Inject(DOCUMENT) private document: Document, private router: Router) { constructor(@Inject(DOCUMENT) private document: Document, private router: Router) {
router.events.subscribe((val) => { router.events.subscribe((val) => {
this.isMenuOpen = false this.isMenuOpen = false
this.isSticky = true
//this.isSticky = true
this.document.body.classList.remove('no-scroll') this.document.body.classList.remove('no-scroll')
}) })
} }
ngOnInit(): void { ngOnInit(): void {
this.isSticky = this.router.url != '/'
} }
@HostListener('window:scroll', ['$event']) @HostListener('window:scroll', ['$event'])
@ -29,7 +31,8 @@ export class HeaderComponent implements OnInit {
|| document.documentElement.scrollTop || document.documentElement.scrollTop
|| document.body.scrollTop || 0 || document.body.scrollTop || 0
this.isSticky = this.isMenuOpen || verticalOffset > 10
this.isFirstScroll = this.router.url == '/'
this.isSticky = this.isFirstScroll ? this.isMenuOpen || verticalOffset > 10 : true
} }
toggleMenu(): void { toggleMenu(): void {

1
src/app/installations/installations.component.html

@ -1 +0,0 @@
<p>installations works!</p>

0
src/app/installations/installations.component.scss

25
src/app/installations/installations.component.spec.ts

@ -1,25 +0,0 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { InstallationsComponent } from './installations.component';
describe('InstallationsComponent', () => {
let component: InstallationsComponent;
let fixture: ComponentFixture<InstallationsComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ InstallationsComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(InstallationsComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

15
src/app/installations/installations.component.ts

@ -1,15 +0,0 @@
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-installations',
templateUrl: './installations.component.html',
styleUrls: ['./installations.component.scss']
})
export class InstallationsComponent implements OnInit {
constructor() { }
ngOnInit(): void {
}
}

1
src/app/performances/performances.component.html

@ -1 +0,0 @@
<p>performances works!</p>

0
src/app/performances/performances.component.scss

25
src/app/performances/performances.component.spec.ts

@ -1,25 +0,0 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { PerformancesComponent } from './performances.component';
describe('PerformancesComponent', () => {
let component: PerformancesComponent;
let fixture: ComponentFixture<PerformancesComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ PerformancesComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(PerformancesComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

15
src/app/performances/performances.component.ts

@ -1,15 +0,0 @@
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-performances',
templateUrl: './performances.component.html',
styleUrls: ['./performances.component.scss']
})
export class PerformancesComponent implements OnInit {
constructor() { }
ngOnInit(): void {
}
}

17
src/app/portfolio/portfolio.component.html

@ -1 +1,16 @@
<p>portfolio works!</p>
<div class="component-portfolio">
<div class="container">
<div class="row">
<div class="col-12 col-sm-6 mx-auto" [ngClass]="'col-md-' + ((item.id % 3)+3)" *ngFor="let item of portfolioItems">
<div class="box" [ngClass]="'skew-' + (item.id % 6)" (click)="showDetails(item.id)">
<img class="image" src="assets/{{item.image}}">
<div class="text">
<span class="title">{{item.title}}</span>
<span class="type">{{item.type}}</span>
<span class="tags">{{item.tags}}</span>
</div>
</div>
</div>
</div>
</div>
</div>

102
src/app/portfolio/portfolio.component.scss

@ -0,0 +1,102 @@
@import "../../assets/scss/variables";
.component-portfolio {
padding-top: 140px;
.box {
position: relative;
display: flex;
//background: $black-alpha;
border-radius: 10px;
overflow: hidden;
margin: 10px 0;
padding: 40px 20px;
min-height: 250px;
cursor: pointer;
transition: transform .4s, background .4s;
-webkit-backface-visibility: hidden;
.image {
position: absolute;
top: 50%;
left: 50%;
height: 100%;
width: 100%;
object-fit: cover;
transform: translate(-50%, -50%) scale(1.2);
opacity: .5;
filter: grayscale(100%) invert(100%);
transition: transform .4s, opacity .4s, filter .4s;
-webkit-backface-visibility: hidden;
z-index: 0;
}
.text {
display: block;
margin: auto;
text-align: center;
transform: translate(0%, 0%);
color: $black;
transition: color .4s;
-webkit-backface-visibility: hidden;
z-index: 1;
.title {
display: block;
font-size: $font-20;
text-transform: uppercase;
font-weight: bold;
}
.type {
display: block;
font-size: $font-16;
font-weight: bold;
}
.tags {
display: block;
font-size: $font-12;
text-transform: uppercase;
font-weight: bold;
padding-top: 10px;
}
}
@each $angle in 0,1,2,3,4,5,6 {
&.skew-#{$angle} {
transform: skew(#{$angle - 3}deg, #{$angle - 3}deg);
/*animation: zoom#{$angle} #{$angle + 3}s ease-in infinite forwards;
@keyframes zoom#{$angle} {
0% { transform: scale(1) skew(#{$angle - 3}deg, #{$angle - 3}deg); }
50% { transform: scale(1.1) skew(#{$angle - 3}deg, #{$angle - 3}deg); }
75% { transform: scale(.9) skew(#{$angle - 3}deg, #{$angle - 3}deg); }
100% { transform: scale(1) skew(#{$angle - 3}deg, #{$angle - 3}deg); }
}*/
}
}
&:hover {
background: $black;
z-index: 50;
//animation-play-state: paused;
@each $angle in 0,1,2,3,4,5,6 {
&.skew-#{$angle} {
transform: scale(1.4) rotate(2deg) skew(#{3 - $angle}deg, #{3 - $angle}deg);
}
}
.image {
filter: grayscale(100%) invert(0%) brightness(.5);
opacity: .9;
transform: translate(-50%, -50%) scale(1.6);
}
.text {
color: $yellow;
}
}
}
}

23
src/app/portfolio/portfolio.component.ts

@ -1,4 +1,6 @@
import { Component, OnInit } from '@angular/core';
import { Component, OnInit } from '@angular/core'
import { Router, NavigationEnd } from '@angular/router'
import { ApisService } from '../services/apis.service'
@Component({ @Component({
selector: 'app-portfolio', selector: 'app-portfolio',
@ -7,9 +9,26 @@ import { Component, OnInit } from '@angular/core';
}) })
export class PortfolioComponent implements OnInit { export class PortfolioComponent implements OnInit {
constructor() { }
public portfolioItems: any = []
constructor(
private apisService: ApisService,
private router: Router)
{ }
ngOnInit(): void { ngOnInit(): void {
this.apisService.getPortfolio(this.router.url.split('/')[1]).toPromise().then((response) => {
this.portfolioItems = response.items
},(error) => {
console.error('getPortfolio ERROR', error)
}).catch((e) => {
console.error('getPortfolio CATCH', e)
})
}
showDetails(id): void {
const section = this.router.url.split('/')[1] == 'exhibitions' ? 'exhibitions' : 'works'
this.router.navigate([`/detail/${section}/${id}`])
} }
} }

16
src/app/services/apis.service.spec.ts

@ -0,0 +1,16 @@
import { TestBed } from '@angular/core/testing';
import { ApisService } from './apis.service';
describe('ApisService', () => {
let service: ApisService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(ApisService);
});
it('should be created', () => {
expect(service).toBeTruthy();
});
});

33
src/app/services/apis.service.ts

@ -0,0 +1,33 @@
import { Injectable } from '@angular/core'
import { HttpClient, HttpHeaders, HttpParams, HttpRequest } from '@angular/common/http'
import { Observable, Subject, throwError } from 'rxjs'
import { catchError } from 'rxjs/operators'
import { BaseService } from './base-service'
import { environment } from '../../environments/environment'
@Injectable({
providedIn: 'root'
})
export class ApisService extends BaseService {
private restApi = `${environment.API_URL}`
constructor(private http: HttpClient) {
super()
}
getPortfolio(section): Observable<any> {
let urlApi = `${this.restApi}?query=${section}`
return this.http.get<any>(urlApi).pipe(
catchError(this.handleError)
)
}
getDetails(section, id): Observable<any> {
let urlApi = `${this.restApi}?query=detail&type=${section}&id=${id}`
return this.http.get<any>(urlApi).pipe(
catchError(this.handleError)
)
}
}

16
src/app/services/base-service.ts

@ -0,0 +1,16 @@
import { HttpErrorResponse } from "@angular/common/http"
import { throwError } from "rxjs"
import { ParseXML } from "./parse-xml"
export class BaseService {
constructor() { }
protected handleError(error: HttpErrorResponse) {
if(error.error instanceof ErrorEvent) {
console.error('An error occurred:', error.error.message)
}
return throwError( ParseXML.getXMLResponseMessage(error.error) )
}
}

13
src/app/services/parse-xml.ts

@ -0,0 +1,13 @@
export class ParseXML {
constructor() {}
public sanitize(str: string): string {
let sanitizeString = encodeURIComponent(str).replace(/%0A/g, '')
return decodeURIComponent(sanitizeString)
}
public static getXMLResponseMessage(responseBody: string): string {
let parseXMLClass = new ParseXML()
return parseXMLClass.sanitize(responseBody).match(/<Message>(.*?)<\/Message>/g)[0].replace(/<[^>]+>/g, '')
}
}

BIN
src/assets/fonts/icomoon.eot

Binary file not shown.

25
src/assets/fonts/icomoon.svg

@ -0,0 +1,25 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Generated by IcoMoon</metadata>
<defs>
<font id="icomoon" horiz-adv-x="1024">
<font-face units-per-em="1024" ascent="960" descent="-64" />
<missing-glyph horiz-adv-x="1024" />
<glyph unicode="&#x20;" horiz-adv-x="512" d="" />
<glyph unicode="&#xe900;" glyph-name="back" d="M424.633 593.293l-386.090-308.871h946.914v100h-661.836l163.48 130.785z" />
<glyph unicode="&#xf003;" glyph-name="envelope-o" d="M950.857 91.428v438.857c-12-13.714-25.143-26.286-39.429-37.714-81.714-62.857-164-126.857-243.429-193.143-42.857-36-96-80-155.429-80h-1.143c-59.429 0-112.571 44-155.429 80-79.429 66.286-161.714 130.286-243.429 193.143-14.286 11.429-27.429 24-39.429 37.714v-438.857c0-9.714 8.571-18.286 18.286-18.286h841.143c9.714 0 18.286 8.571 18.286 18.286zM950.857 692c0 14.286 3.429 39.429-18.286 39.429h-841.143c-9.714 0-18.286-8.571-18.286-18.286 0-65.143 32.571-121.714 84-162.286 76.571-60 153.143-120.571 229.143-181.143 30.286-24.571 85.143-77.143 125.143-77.143h1.143c40 0 94.857 52.571 125.143 77.143 76 60.571 152.571 121.143 229.143 181.143 37.143 29.143 84 92.571 84 141.143zM1024 713.143v-621.714c0-50.286-41.143-91.429-91.429-91.429h-841.143c-50.286 0-91.429 41.143-91.429 91.429v621.714c0 50.286 41.143 91.429 91.429 91.429h841.143c50.286 0 91.429-41.143 91.429-91.429z" />
<glyph unicode="&#xf081;" glyph-name="twitter-square" horiz-adv-x="878" d="M731.429 602.286c-21.714-9.714-44.571-16-69.143-19.429 25.143 14.857 44 38.857 53.143 66.857-23.429-13.714-49.143-24-76.571-29.143-21.714 23.429-53.143 37.714-87.429 37.714-66.286 0-120-53.714-120-120 0-9.143 0.571-18.857 2.857-27.429-100 5.143-188.571 52.571-248 125.714-10.286-17.714-16.571-38.857-16.571-60.571 0-41.714 19.429-78.286 52-100-20 0.571-38.857 6.286-57.143 14.857v-1.143c0-58.286 44-106.857 98.857-117.714-10.286-2.857-18.286-4.571-29.143-4.571-7.429 0-14.857 1.143-22.286 2.286 15.429-47.429 59.429-82.286 112-83.429-41.143-32-92.571-51.429-149.143-51.429-9.714 0-19.429 0.571-28.571 1.714 53.143-33.714 116-53.714 184-53.714 220.571 0 341.714 182.857 341.714 341.714 0 5.143 0 10.286-0.571 15.429 23.429 16.571 44 37.714 60 62.286zM877.714 713.143v-548.571c0-90.857-73.714-164.571-164.571-164.571h-548.571c-90.857 0-164.571 73.714-164.571 164.571v548.571c0 90.857 73.714 164.571 164.571 164.571h548.571c90.857 0 164.571-73.714 164.571-164.571z" />
<glyph unicode="&#xf082;" glyph-name="facebook-square" horiz-adv-x="878" d="M713.143 877.714c90.857 0 164.571-73.714 164.571-164.571v-548.571c0-90.857-73.714-164.571-164.571-164.571h-107.429v340h113.714l17.143 132.571h-130.857v84.571c0 38.286 10.286 64 65.714 64l69.714 0.571v118.286c-12 1.714-53.714 5.143-101.714 5.143-101.143 0-170.857-61.714-170.857-174.857v-97.714h-114.286v-132.571h114.286v-340h-304c-90.857 0-164.571 73.714-164.571 164.571v548.571c0 90.857 73.714 164.571 164.571 164.571h548.571z" />
<glyph unicode="&#xf095;" glyph-name="phone" horiz-adv-x="805" d="M804.571 242.286c0-20.571-9.143-60.571-17.714-79.429-12-28-44-46.286-69.714-60.571-33.714-18.286-68-29.143-106.286-29.143-53.143 0-101.143 21.714-149.714 39.429-34.857 12.571-68.571 28-100 47.429-97.143 60-214.286 177.143-274.286 274.286-19.429 31.429-34.857 65.143-47.429 100-17.714 48.571-39.429 96.571-39.429 149.714 0 38.286 10.857 72.571 29.143 106.286 14.286 25.714 32.571 57.714 60.571 69.714 18.857 8.571 58.857 17.714 79.429 17.714 4 0 8 0 12-1.714 12-4 24.571-32 30.286-43.429 18.286-32.571 36-65.714 54.857-97.714 9.143-14.857 26.286-33.143 26.286-50.857 0-34.857-103.429-85.714-103.429-116.571 0-15.429 14.286-35.429 22.286-49.143 57.714-104 129.714-176 233.714-233.714 13.714-8 33.714-22.286 49.143-22.286 30.857 0 81.714 103.429 116.571 103.429 17.714 0 36-17.143 50.857-26.286 32-18.857 65.143-36.571 97.714-54.857 11.429-5.714 39.429-18.286 43.429-30.286 1.714-4 1.714-8 1.714-12z" />
<glyph unicode="&#xf098;" glyph-name="phone-square" horiz-adv-x="878" d="M731.429 269.143c0 2.857 0 6.286-1.143 9.143-3.429 10.286-86.857 52.571-102.857 61.714-10.857 6.286-24 18.857-37.143 18.857-25.143 0-62.286-74.857-84.571-74.857-11.429 0-25.714 10.286-36 16-75.429 42.286-127.429 94.286-169.714 169.714-5.714 10.286-16 24.571-16 36 0 22.286 74.857 59.429 74.857 84.571 0 13.143-12.571 26.286-18.857 37.143-9.143 16-51.429 99.429-61.714 102.857-2.857 1.143-6.286 1.143-9.143 1.143-14.857 0-44-6.857-57.714-12.571-37.714-17.143-65.143-89.143-65.143-128.571 0-38.286 15.429-73.143 28.571-108.571 45.714-125.143 181.714-261.143 306.857-306.857 35.429-13.143 70.286-28.571 108.571-28.571 39.429 0 111.429 27.429 128.571 65.143 5.714 13.714 12.571 42.857 12.571 57.714zM877.714 713.143v-548.571c0-90.857-73.714-164.571-164.571-164.571h-548.571c-90.857 0-164.571 73.714-164.571 164.571v548.571c0 90.857 73.714 164.571 164.571 164.571h548.571c90.857 0 164.571-73.714 164.571-164.571z" />
<glyph unicode="&#xf099;" glyph-name="twitter" horiz-adv-x="951" d="M925.714 717.714c-25.143-36.571-56.571-69.143-92.571-95.429 0.571-8 0.571-16 0.571-24 0-244-185.714-525.143-525.143-525.143-104.571 0-201.714 30.286-283.429 82.857 14.857-1.714 29.143-2.286 44.571-2.286 86.286 0 165.714 29.143 229.143 78.857-81.143 1.714-149.143 54.857-172.571 128 11.429-1.714 22.857-2.857 34.857-2.857 16.571 0 33.143 2.286 48.571 6.286-84.571 17.143-148 91.429-148 181.143v2.286c24.571-13.714 53.143-22.286 83.429-23.429-49.714 33.143-82.286 89.714-82.286 153.714 0 34.286 9.143 65.714 25.143 93.143 90.857-112 227.429-185.143 380.571-193.143-2.857 13.714-4.571 28-4.571 42.286 0 101.714 82.286 184.571 184.571 184.571 53.143 0 101.143-22.286 134.857-58.286 41.714 8 81.714 23.429 117.143 44.571-13.714-42.857-42.857-78.857-81.143-101.714 37.143 4 73.143 14.286 106.286 28.571z" />
<glyph unicode="&#xf09a;" glyph-name="facebook, facebook-f" horiz-adv-x="602" d="M548 944v-150.857h-89.714c-70.286 0-83.429-33.714-83.429-82.286v-108h167.429l-22.286-169.143h-145.143v-433.714h-174.857v433.714h-145.714v169.143h145.714v124.571c0 144.571 88.571 223.429 217.714 223.429 61.714 0 114.857-4.571 130.286-6.857z" />
<glyph unicode="&#xf0e0;" glyph-name="envelope" d="M1024 545.143v-453.714c0-50.286-41.143-91.429-91.429-91.429h-841.143c-50.286 0-91.429 41.143-91.429 91.429v453.714c17.143-18.857 36.571-35.429 57.714-49.714 94.857-64.571 190.857-129.143 284-197.143 48-35.429 107.429-78.857 169.714-78.857h1.143c62.286 0 121.714 43.429 169.714 78.857 93.143 67.429 189.143 132.571 284.571 197.143 20.571 14.286 40 30.857 57.143 49.714zM1024 713.143c0-64-47.429-121.714-97.714-156.571-89.143-61.714-178.857-123.429-267.429-185.714-37.143-25.714-100-78.286-146.286-78.286h-1.143c-46.286 0-109.143 52.571-146.286 78.286-88.571 62.286-178.286 124-266.857 185.714-40.571 27.429-98.286 92-98.286 144 0 56 30.286 104 91.429 104h841.143c49.714 0 91.429-41.143 91.429-91.429z" />
<glyph unicode="&#xf166;" glyph-name="youtube-square" horiz-adv-x="878" d="M525.143 206.286v89.714c0 18.857-5.714 28.571-16.571 28.571-6.286 0-12.571-2.857-18.857-9.143v-128c6.286-6.286 12.571-9.143 18.857-9.143 10.857 0 16.571 9.143 16.571 28zM630.286 276h37.714v19.429c0 19.429-6.286 29.143-18.857 29.143s-18.857-9.714-18.857-29.143v-19.429zM304 428v-40h-45.714v-241.714h-42.286v241.714h-44.571v40h132.571zM418.857 356v-209.714h-38.286v22.857c-14.857-17.143-29.143-25.714-43.429-25.714-12 0-20.571 5.143-24 16-2.286 6.286-3.429 16-3.429 30.857v165.714h37.714v-154.286c0-8.571 0-13.714 0.571-14.857 0.571-5.714 3.429-8.571 8.571-8.571 8 0 15.429 5.714 24 17.714v160h38.286zM562.857 292.571v-83.429c0-18.857-1.143-33.143-4-41.714-4.571-16-14.857-24-30.286-24-13.143 0-26.286 8-38.857 23.429v-20.571h-38.286v281.714h38.286v-92c12 14.857 25.143 22.857 38.857 22.857 15.429 0 25.714-8 30.286-24 2.857-8.571 4-22.286 4-42.286zM706.286 218.857v-5.143c0-12.571-0.571-20.571-1.143-24.571-1.143-8.571-4-16-8.571-22.857-10.286-15.429-26.286-22.857-45.714-22.857-20 0-35.429 7.429-46.286 21.714-8 10.286-12 26.857-12 49.143v73.714c0 22.286 3.429 38.286 11.429 49.143 10.857 14.286 26.286 21.714 45.714 21.714 18.857 0 34.286-7.429 44.571-21.714 8-10.857 12-26.857 12-49.143v-43.429h-76v-37.143c0-19.429 6.286-29.143 19.429-29.143 9.143 0 14.857 5.143 17.143 14.857 0 2.286 0.571 10.857 0.571 25.714h38.857zM448.571 689.714v-89.143c0-19.429-6.286-29.143-18.286-29.143-12.571 0-18.286 9.714-18.286 29.143v89.143c0 19.429 5.714 29.714 18.286 29.714 12 0 18.286-10.286 18.286-29.714zM753.143 282.286v0c0 49.143 0 101.143-10.857 148.571-8 33.714-35.429 58.286-68 61.714-77.714 8.571-156.571 8.571-235.429 8.571-78.286 0-157.143 0-234.857-8.571-33.143-3.429-60.571-28-68-61.714-10.857-47.429-11.429-99.429-11.429-148.571v0c0-48.571 0-100.571 11.429-148.571 7.429-33.143 34.857-57.714 67.429-61.714 78.286-8.571 157.143-8.571 235.429-8.571s157.143 0 235.429 8.571c32.571 4 60 28.571 67.429 61.714 11.429 48 11.429 100 11.429 148.571zM321.714 654.286l51.429 169.143h-42.857l-29.143-111.429-30.286 111.429h-44.571c8.571-26.286 18.286-52.571 26.857-78.857 13.714-40 22.286-69.714 26.286-90.286v-114.857h42.286v114.857zM486.857 608v74.286c0 22.286-4 38.857-12 49.714-10.857 14.286-25.714 21.714-44.571 21.714-19.429 0-34.286-7.429-44.571-21.714-8-10.857-12-27.429-12-49.714v-74.286c0-22.286 4-38.857 12-49.714 10.286-14.286 25.143-21.714 44.571-21.714 18.857 0 33.714 7.429 44.571 21.714 8 10.286 12 27.429 12 49.714zM590.286 539.428h38.286v211.429h-38.286v-161.714c-8.571-12-16.571-17.714-24-17.714-5.143 0-8.571 2.857-9.143 9.143-0.571 1.143-0.571 5.714-0.571 14.857v155.429h-38.286v-167.429c0-14.857 1.143-24.571 3.429-31.429 4-10.286 12.571-15.429 24.571-15.429 14.286 0 28.571 8.571 44 25.714v-22.857zM877.714 713.143v-548.571c0-90.857-73.714-164.571-164.571-164.571h-548.571c-90.857 0-164.571 73.714-164.571 164.571v548.571c0 90.857 73.714 164.571 164.571 164.571h548.571c90.857 0 164.571-73.714 164.571-164.571z" />
<glyph unicode="&#xf167;" glyph-name="youtube" horiz-adv-x="878" d="M554.857 240v-120.571c0-25.714-7.429-38.286-22.286-38.286-8.571 0-17.143 4-25.714 12.571v172c8.571 8.571 17.143 12.571 25.714 12.571 14.857 0 22.286-13.143 22.286-38.286zM748 239.428v-26.286h-51.429v26.286c0 25.714 8.571 38.857 25.714 38.857s25.714-13.143 25.714-38.857zM196 364h61.143v53.714h-178.286v-53.714h60v-325.143h57.143v325.143zM360.571 38.857h50.857v282.286h-50.857v-216c-11.429-16-22.286-24-32.571-24-6.857 0-10.857 4-12 12-0.571 1.714-0.571 8-0.571 20v208h-50.857v-223.429c0-20 1.714-33.143 4.571-41.714 4.571-14.286 16.571-21.143 33.143-21.143 18.286 0 37.714 11.429 58.286 34.857v-30.857zM605.714 123.428v112.571c0 26.286-1.143 45.143-5.143 56.571-6.286 21.143-20.571 32-40.571 32-18.857 0-36.571-10.286-53.143-30.857v124h-50.857v-378.857h50.857v27.429c17.143-21.143 34.857-31.429 53.143-31.429 20 0 34.286 10.857 40.571 31.429 4 12 5.143 30.857 5.143 57.143zM798.857 129.143v7.429h-52c0-20.571-0.571-32-1.143-34.857-2.857-13.714-10.286-20.571-22.857-20.571-17.714 0-26.286 13.143-26.286 39.429v49.714h102.286v58.857c0 30.286-5.143 52-15.429 66.286-14.857 19.429-34.857 29.143-60.571 29.143-26.286 0-46.286-9.714-61.143-29.143-10.857-14.286-16-36-16-66.286v-98.857c0-30.286 5.714-52.571 16.571-66.286 14.857-19.429 34.857-29.143 61.714-29.143s48 10.286 61.714 30.286c6.286 9.143 10.857 19.429 12 30.857 1.143 5.143 1.143 16.571 1.143 33.143zM451.429 650.857v120c0 26.286-7.429 39.429-24.571 39.429-16.571 0-24.571-13.143-24.571-39.429v-120c0-26.286 8-40 24.571-40 17.143 0 24.571 13.714 24.571 40zM862.286 221.714c0-65.714-0.571-136-14.857-200-10.857-45.143-47.429-78.286-91.429-82.857-105.143-12-211.429-12-317.143-12s-212 0-317.143 12c-44 4.571-81.143 37.714-91.429 82.857-14.857 64-14.857 134.286-14.857 200v0c0 66.286 0.571 136 14.857 200 10.857 45.143 47.429 78.286 92 83.429 104.571 11.429 210.857 11.429 316.571 11.429s212 0 317.143-11.429c44-5.143 81.143-38.286 91.429-83.429 14.857-64 14.857-133.714 14.857-200zM292 950.857h58.286l-69.143-228v-154.857h-57.143v154.857c-5.143 28-16.571 68-34.857 121.143-12.571 35.429-25.143 71.429-37.143 106.857h60.571l40.571-150.286zM503.429 760.571v-100c0-30.286-5.143-53.143-16-67.429-14.286-19.429-34.286-29.143-60.571-29.143-25.714 0-45.714 9.714-60 29.143-10.857 14.857-16 37.143-16 67.429v100c0 30.286 5.143 52.571 16 66.857 14.286 19.429 34.286 29.143 60 29.143 26.286 0 46.286-9.714 60.571-29.143 10.857-14.286 16-36.571 16-66.857zM694.857 853.143v-285.143h-52v31.429c-20.571-24-40-35.429-58.857-35.429-16.571 0-28.571 6.857-33.714 21.143-2.857 8.571-4.571 22.286-4.571 42.857v225.143h52v-209.714c0-12 0-18.857 0.571-20 1.143-8 5.143-12.571 12-12.571 10.286 0 21.143 8 32.571 24.571v217.714h52z" />
<glyph unicode="&#xf194;" glyph-name="vimeo-square" horiz-adv-x="878" d="M738.286 586.286c4 82.857-26.857 124.571-92 126.857-88 2.857-147.429-46.857-178.286-149.143 16 6.857 31.429 10.857 46.857 10.857 32 0 46.286-18.286 42.286-54.857-1.714-21.714-16-53.714-42.286-95.429-26.857-42.286-46.857-62.857-60-62.857-17.143 0-32 32-46.857 96.571-4.571 19.429-13.143 67.429-25.714 145.714-11.429 72-41.714 105.714-91.429 101.143-20.571-2.286-52.571-20.571-93.714-57.143-30.857-26.857-61.143-54.857-92.571-82.286l29.714-38.286c28.571 19.429 45.143 29.714 49.714 29.714 21.714 0 42.286-34.286 61.143-102.286 17.143-62.857 34.286-125.143 51.429-188 25.714-68 56.571-102.286 93.714-102.286 59.429 0 132.571 56 218.857 168 83.429 107.429 126.857 192 129.143 253.714zM877.714 713.143v-548.571c0-90.857-73.714-164.571-164.571-164.571h-548.571c-90.857 0-164.571 73.714-164.571 164.571v548.571c0 90.857 73.714 164.571 164.571 164.571h548.571c90.857 0 164.571-73.714 164.571-164.571z" />
<glyph unicode="&#xf1d2;" glyph-name="git-square" horiz-adv-x="878" d="M332.571 203.428c0-30.857-28-37.714-53.143-37.714-24.571 0-61.143 4-61.143 36 0 31.429 30.857 36.571 56 36.571 24 0 58.286-4 58.286-34.857zM312 469.714c0-28.571-11.429-48.571-42.286-48.571-31.429 0-44 18.286-44 48s11.429 51.429 44 51.429c29.143 0 42.286-24 42.286-50.857zM406.857 512.571v71.429c-24.571-9.143-50.857-16.571-77.143-16.571-18.857 10.857-40.571 16.571-62.857 16.571-65.143 0-116.571-48-116.571-114.286 0-35.429 23.429-84.571 58.857-96.571v-1.714c-18.286-8-21.714-30.286-21.714-48.571 0-18.857 6.857-34.286 23.429-44v-1.714c-38.857-12.571-64.571-37.143-64.571-79.429 0-72.571 69.143-93.143 129.714-93.143 73.143 0 128 26.857 128 107.429 0 57.143-52 74.286-99.429 82.857-16 2.857-43.429 14.286-43.429 34.286 0 18.857 10.286 26.857 28 29.714 58.286 11.429 95.429 56.571 95.429 116.571 0 10.286-2.286 20-5.714 29.714 9.143 2.286 18.857 4.571 28 7.429zM440.571 273.143h78.286c-1.143 15.429-1.143 31.429-1.143 46.857v221.143c0 13.143 0 26.286 1.143 39.429h-78.286c1.714-13.143 1.714-27.429 1.714-40.571v-224c0-14.286 0-28.571-1.714-42.857zM731.429 282.286v69.143c-11.429-8-25.143-12-38.857-12-25.714 0-30.286 25.714-30.286 46.857v128.571h29.714c10.286 0 20-1.143 30.286-1.143v66.857h-60c0 19.429-1.143 38.857 1.714 58.286h-80c1.714-10.286 2.286-20.571 2.286-31.429v-26.857h-34.286v-66.857c6.857 0.571 13.714 1.714 21.143 1.714 4 0 8.571-0.571 13.143-0.571v-1.143h-1.143v-124c0-61.714 9.143-121.143 84.571-121.143 21.143 0 42.857 3.429 61.714 13.714zM528 685.714c0 26.857-20 52-48 52s-48.571-24.571-48.571-52c0-26.857 21.143-50.857 48.571-50.857s48 24.571 48 50.857zM877.714 713.143v-548.571c0-90.857-73.714-164.571-164.571-164.571h-548.571c-90.857 0-164.571 73.714-164.571 164.571v548.571c0 90.857 73.714 164.571 164.571 164.571h548.571c90.857 0 164.571-73.714 164.571-164.571z" />
<glyph unicode="&#xf1d3;" glyph-name="git" d="M340 85.714c0 50.286-55.429 57.143-94.286 57.143-40.571 0-90.286-8.571-90.286-59.429 0-51.429 58.857-57.714 98.286-57.714 41.714 0 86.286 10.286 86.286 60zM306.286 517.143c0 42.857-20.571 81.714-68 81.714-52.571 0-70.857-34.857-70.857-82.857 0-47.429 20.571-77.143 70.857-77.143 49.714 0 68 32 68 78.286zM460 702.286v-115.429c-14.857-5.143-29.714-9.143-45.143-12.571 5.714-15.429 9.143-31.429 9.143-48 0-96.571-59.429-170.286-154.286-188-28.571-5.714-45.143-17.714-45.143-48.571 0-87.429 230.857-28 230.857-189.143 0-130.857-88.571-173.714-207.429-173.714-97.714 0-209.143 32.571-209.143 150.286 0 68.571 41.714 108 104 128.571v2.286c-26.286 16-38.286 41.143-38.286 72 0 29.143 6.286 65.143 36 78.286v2.286c-57.714 19.429-95.429 98.857-95.429 156.571 0 106.857 82.857 185.143 188.571 185.143 35.429 0 70.857-9.143 101.714-26.857 42.857 0 85.143 11.429 124.571 26.857zM641.714 198.857h-126.857c2.286 25.714 2.286 50.857 2.286 76.571v348c0 24.571 0.571 49.143-2.286 73.143h126.857c-2.857-23.429-2.286-47.429-2.286-70.857v-350.286c0-25.714 0-50.857 2.286-76.571zM985.143 325.714v-112c-30.286-16.571-65.143-22.286-99.429-22.286-122.286 0-136.571 96.571-136.571 196v200.571h1.143v2.286c-7.429 0-14.286 1.143-21.143 1.143-11.429 0-22.857-1.714-33.714-3.429v108.571h54.857v43.429c0 17.143-0.571 34.286-3.429 50.857h129.714c-4.571-31.429-3.429-62.857-3.429-94.286h97.714v-108.571c-16.571 0-33.143 2.286-49.143 2.286h-48.571v-208.571c0-33.714 7.429-74.857 49.714-74.857 22.286 0 44 6.286 62.286 18.857zM656 866.857c0-42.857-33.143-82.857-77.143-82.857-45.143 0-78.857 39.429-78.857 82.857 0 44 33.143 84 78.857 84 45.143 0 77.143-41.143 77.143-84z" />
<glyph unicode="&#xf27d;" glyph-name="vimeo" horiz-adv-x="1029" d="M976.571 654.857c-4-90.286-67.429-214.286-189.714-372-126.857-164-233.143-246.286-321.143-246.286-54.286 0-100 50.286-137.143 150.286-25.143 91.429-50.286 183.429-75.429 275.429-27.429 100-57.714 149.714-89.714 149.714-6.857 0-30.857-14.286-72.571-43.429l-44 56c45.714 40.571 90.857 81.714 136 121.143 60.571 53.714 106.857 80.571 137.714 83.429 72.571 6.857 116.571-42.286 133.714-148 17.714-114.286 30.857-185.714 37.714-213.143 21.143-94.857 43.429-142.286 68.571-142.286 19.429 0 48.571 30.286 88 92 38.857 61.714 59.429 108.571 62.286 140.571 5.143 53.143-15.429 79.429-62.286 79.429-22.286 0-45.143-5.143-69.143-14.857 45.714 149.714 133.143 222.286 262.286 218.286 95.429-2.857 140.571-65.143 134.857-186.286z" />
</font></defs></svg>

After

Width:  |  Height:  |  Size: 18 KiB

BIN
src/assets/fonts/icomoon.ttf

Binary file not shown.

BIN
src/assets/fonts/icomoon.woff

Binary file not shown.

1
src/assets/fonts/selection.json

File diff suppressed because one or more lines are too long

BIN
src/assets/images/favicon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

13
src/assets/scss/global.scss

@ -6,8 +6,21 @@ body {
font-family: $font-primary; font-family: $font-primary;
font-size: $font-20; font-size: $font-20;
color: $black; color: $black;
background: $yellow;
overflow-x: hidden;
&.no-scroll { &.no-scroll {
overflow: hidden; overflow: hidden;
} }
} }
.particles {
position: fixed;
top: 0;
left: 0;
height: 100vh;
width: 100vw;
background: radial-gradient(circle, transparent 0%, transparent 85%, rgba(255,255,255,0.2) 95%, rgba(255,255,255,0.3) 100%);
z-index: -1;
}

75
src/assets/scss/icons.scss

@ -0,0 +1,75 @@
@font-face {
font-family: 'icomoon';
src: url('../fonts/icomoon.eot?9ti7zb');
src: url('../fonts/icomoon.eot?9ti7zb#iefix') format('embedded-opentype'),
url('../fonts/icomoon.ttf?9ti7zb') format('truetype'),
url('../fonts/icomoon.woff?9ti7zb') format('woff'),
url('../fonts/icomoon.svg?9ti7zb#icomoon') format('svg');
font-weight: normal;
font-style: normal;
font-display: block;
}
[class^="icon-"], [class*=" icon-"] {
/* use !important to prevent issues with browser extensions that change fonts */
font-family: 'icomoon' !important;
speak: never;
font-style: normal;
font-weight: normal;
font-variant: normal;
text-transform: none;
line-height: 1;
/* Better Font Rendering =========== */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-envelope-o:before {
content: "\f003";
}
.icon-twitter-square:before {
content: "\f081";
}
.icon-facebook-square:before {
content: "\f082";
}
.icon-phone:before {
content: "\f095";
}
.icon-phone-square:before {
content: "\f098";
}
.icon-twitter:before {
content: "\f099";
}
.icon-facebook:before {
content: "\f09a";
}
.icon-facebook-f:before {
content: "\f09a";
}
.icon-envelope:before {
content: "\f0e0";
}
.icon-youtube-square:before {
content: "\f166";
}
.icon-youtube:before {
content: "\f167";
}
.icon-vimeo-square:before {
content: "\f194";
}
.icon-git-square:before {
content: "\f1d2";
}
.icon-git:before {
content: "\f1d3";
}
.icon-vimeo:before {
content: "\f27d";
}
.icon-back:before {
content: "\e900";
}

4
src/assets/scss/main.scss

@ -1,3 +1,7 @@
@import "./variables"; @import "./variables";
@import "./fonts"; @import "./fonts";
@import "./icons";
@import "./global"; @import "./global";
@import "node_modules/bootstrap/scss/bootstrap-grid";

13
src/assets/scss/variables.scss

@ -4,14 +4,14 @@ $grid-breakpoints: (
sm: 576px, sm: 576px,
md: 768px, md: 768px,
lg: 992px, lg: 992px,
xl: 1200px
xl: 1440px
); );
$container-max-widths: ( $container-max-widths: (
sm: 540px, sm: 540px,
md: 720px, md: 720px,
lg: 960px, lg: 960px,
xl: 1140px
xl: 1418px
); );
$grid-columns: 12; $grid-columns: 12;
@ -22,15 +22,16 @@ $breadcrumb-height: 60px;
// Colors // Colors
$white: #fff; $white: #fff;
$black: #111;
$black: #000;
$gray: #ccc; $gray: #ccc;
$light-gray: #eee; $light-gray: #eee;
$dark-gray: #666;
$dark-gray: #333;
$yellow: #a2dc02; $yellow: #a2dc02;
$white-alpha: rgba(255, 255, 255, 0.9);
$black-alpha: rgba(0, 0, 0, 0.9);
$white-alpha: rgba(255, 255, 255, 0.8);
$black-alpha: rgba(0, 0, 0, 0.8);
$yellow-alpha: rgba(160, 220, 0, 0.8);
// Fonts // Fonts
$font-primary: 'Abel'; $font-primary: 'Abel';

6
src/environments/environment.prod.ts

@ -1,3 +1,5 @@
export const environment = { export const environment = {
production: true
};
production: true,
API_URL: `https://apis.dslak.it/`
}

17
src/environments/environment.ts

@ -1,16 +1,5 @@
// 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 = { export const environment = {
production: false
};
production: false,
/*
* 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.
API_URL: `http://dslakng.local/apis/`
}

BIN
src/favicon.ico

Binary file not shown.

Before

Width:  |  Height:  |  Size: 948 B

BIN
src/favicon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

2
src/index.html

@ -5,7 +5,7 @@
<title>DslakWebsite</title> <title>DslakWebsite</title>
<base href="/"> <base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
<link rel="icon" type="image/x-icon" href="assets/images/favicon.png">
</head> </head>
<body> <body>
<app-root></app-root> <app-root></app-root>

Loading…
Cancel
Save