-
{{item.title}}
-
{{item.type}}
+
+
+
+

+
![]()
+
+
{{item.title}}
+
{{item.type}}
-
-
- from
- on
- {{item.date_from | date}}
-
-
- to {{item.date_to | date}}
-
+
+
+ from
+ on
+ {{item.date_from | date}}
+
+
+ to {{item.date_to | date}}
-
-
{{item.tags}}
+
+
{{item.tags}}
+
+
diff --git a/src/app/portfolio/portfolio.component.scss b/src/app/portfolio/portfolio.component.scss
index 6a6f4ac..ab9be70 100644
--- a/src/app/portfolio/portfolio.component.scss
+++ b/src/app/portfolio/portfolio.component.scss
@@ -1,119 +1,134 @@
@import "../../assets/scss/variables";
.component-portfolio {
- padding-top: 140px;
+ padding: 160px 0 80px 0;
- .box {
+ .row-container {
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%);
- opacity: .9;
- filter: grayscale(100%) brightness(.4);
- transition: opacity .4s, filter .4s;
+ transform: skew(-2deg, -2deg) rotate(-2deg);
+ width: calc(100% - 50px);
+ max-width: 1400px;
+ margin: auto;
+ z-index: 1;
+
+ .box {
+ position: relative;
+ display: flex;
+ border-radius: 4px;
+ overflow: hidden;
+ background: $black-alpha;
+ margin: 6px;
+ padding: 40px 20px;
+ min-height: 250px;
+ cursor: pointer;
+ transform: skew(6deg, -6deg) rotate(6deg);
+ transition: transform .4s, background .4s, box-shadow .4s;
-webkit-backface-visibility: hidden;
- z-index: 0;
- }
-
- .text {
- display: block;
- margin: auto;
- text-align: center;
- transform: translate(0%, 0%);
- color: $yellow;
- //transition: color .4s;
- -webkit-backface-visibility: hidden;
- z-index: 1;
- .title {
- display: block;
- font-size: $font-20;
- text-transform: uppercase;
- font-weight: bold;
+ .image {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ height: 100%;
+ width: 100%;
+ object-fit: cover;
+ transform: translate(-50%, -50%);
+ opacity: .9;
+ filter: grayscale(100%) brightness(.4);
+ transition: opacity .4s, filter .4s;
+ -webkit-backface-visibility: hidden;
+ z-index: 0;
}
- .type {
- display: block;
- font-size: $font-16;
- font-weight: bold;
+ .loader {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ height: 100%;
+ width: 100%;
+ object-fit: cover;
+ transform: translate(-50%, -50%);
+ z-index: 0;
}
- .tags {
+ .text {
display: block;
- font-size: $font-12;
- text-transform: uppercase;
- font-weight: bold;
- padding-top: 10px;
- }
+ margin: auto;
+ text-align: center;
+ transform: translate(0%, 0%);
+ color: $yellow;
+ //transition: color .4s;
+ -webkit-backface-visibility: hidden;
+ z-index: 1;
+
+ .title {
+ display: block;
+ font-size: $font-20;
+ text-transform: uppercase;
+ font-weight: bold;
+ }
- .date-container {
- display: inline-flex;
- flex-wrap: wrap;
+ .type {
+ display: block;
+ font-size: $font-16;
+ font-weight: bold;
+ }
- .date-row {
+ .tags {
display: block;
- width: 100%;
+ font-size: $font-12;
+ text-transform: uppercase;
+ font-weight: bold;
+ padding-top: 10px;
+ }
- .date {
- display: inline-flex;
- margin: auto;
- font-size: $font-20;
- }
+ .date-container {
+ display: inline-flex;
+ flex-wrap: wrap;
- .date-indication {
- margin: 2px 5px auto 5px;
- font-size: $font-12;
- }
+ .date-row {
+ display: block;
+ width: 100%;
- &:nth-of-type(2) {
- margin-top: -12px;
+ .date {
+ display: inline-flex;
+ margin: auto;
+ font-size: $font-20;
+ }
+
+ .date-indication {
+ margin: 2px 5px auto 5px;
+ font-size: $font-12;
+ }
+
+ &:nth-of-type(2) {
+ margin-top: -12px;
+ }
}
}
- }
-
- }
- @each $angle in 0,1,2,3,4,5,6 {
- &.skew-#{$angle} {
- transform: skew(#{$angle - 3}deg, #{$angle - 3}deg);
}
- }
- &:hover {
- background: $black;
- z-index: 50;
+ &:hover {
+ box-shadow: 0 0 20px $white-alpha2;
+ background: $black;
+ z-index: 50;
- @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);
- transform: scale(1.4) rotate(0deg) skew(0deg, 0deg);
- }
- }
+ transform: scale(1.4) rotate(4deg) skew(3deg);
- .image {
- filter: grayscale(0%) brightness(1);
- opacity: .5;
- }
- .text {
- //color: $yellow;
+ .image {
+ filter: grayscale(0%) brightness(1);
+ opacity: .7;
+ }
}
}
}
}
+@media (min-width: map-get($grid-breakpoints, 'md')) {
+ .component-portfolio {
+ .row-container {
+ width: calc(100% - 100px);
+ }
+ }
+}
diff --git a/src/app/portfolio/portfolio.component.ts b/src/app/portfolio/portfolio.component.ts
index cf63720..f7f2c66 100644
--- a/src/app/portfolio/portfolio.component.ts
+++ b/src/app/portfolio/portfolio.component.ts
@@ -11,6 +11,8 @@ import { environment } from '../../environments/environment'
export class PortfolioComponent implements OnInit {
public basePath = `${environment.BASE_PATH}`
+ public loaded = false
+ public init = false
public portfolioItems: any = []
public section: string = ''
@@ -42,7 +44,6 @@ export class PortfolioComponent implements OnInit {
case 1:
width = Math.floor(Math.random()*3)+3
cnt++
-
if(tot + width > 9) {
width = 12 - tot
tot = 0
@@ -50,7 +51,6 @@ export class PortfolioComponent implements OnInit {
} else {
tot = tot + width
}
-
break;
case 2:
width = 12 - tot
@@ -58,11 +58,7 @@ export class PortfolioComponent implements OnInit {
cnt = 0
break;
}
-
e.width = width
-
- //((e.id % 5)+3)
- //Math.floor((Math.random()*3)+1)+2
})
},(error) => {
console.error('getPortfolio ERROR', error)
@@ -71,13 +67,18 @@ export class PortfolioComponent implements OnInit {
})
}
- showDetails(id): void {
+ ngAfterContentInit() {
+ this.init = true
+ }
+
+ showDetails(id, title = ''): void {
const section = this.section == 'exhibitions' ? 'exhibitions' : 'works'
- this.router.navigate([`/detail/${section}/${id}`])
+ this.router.navigate([`/detail/${section}/${id}/${title.toLowerCase().replace(/[^a-zA-Z0-9]/g, '_')}`])
}
onLoad(id): void {
this.portfolioItems.filter(item => item.id == id)[0].loading = false
+ this.loaded = this.init && this.portfolioItems.every( (val) => !val.loading)
}
}
diff --git a/src/app/services/apis.service.ts b/src/app/services/apis.service.ts
index 31e6ab1..47887ba 100644
--- a/src/app/services/apis.service.ts
+++ b/src/app/services/apis.service.ts
@@ -16,8 +16,8 @@ export class ApisService extends BaseService {
super()
}
- getPortfolio(section): Observable
{
- let urlApi = `${this.restApi}?query=${section}`
+ getPortfolio(section, randon = false): Observable {
+ let urlApi = `${this.restApi}?query=${section}&random=${randon}`
return this.http.get(urlApi).pipe(
catchError(this.handleError)
)
diff --git a/src/app/spinner/spinner.component.html b/src/app/spinner/spinner.component.html
new file mode 100644
index 0000000..91af365
--- /dev/null
+++ b/src/app/spinner/spinner.component.html
@@ -0,0 +1,2 @@
+
+
diff --git a/src/app/spinner/spinner.component.scss b/src/app/spinner/spinner.component.scss
new file mode 100644
index 0000000..ded7d41
--- /dev/null
+++ b/src/app/spinner/spinner.component.scss
@@ -0,0 +1,15 @@
+@import "../../assets/scss/variables";
+
+.spinner {
+ position: fixed;
+ top: 0;
+ left: 0;
+ height: 100vh;
+ width: 100vw;
+ background: $yellow-alpha;
+ background-image: url('/assets/images/loader.svg');
+ background-size: 200px 200px;
+ background-repeat: no-repeat;
+ background-position: center center;
+ z-index: 100;
+}
diff --git a/src/app/spinner/spinner.component.ts b/src/app/spinner/spinner.component.ts
new file mode 100644
index 0000000..2def854
--- /dev/null
+++ b/src/app/spinner/spinner.component.ts
@@ -0,0 +1,56 @@
+import { Component, OnInit, Input, ViewChild, ElementRef, SimpleChanges } from '@angular/core'
+
+@Component({
+ selector: 'app-spinner',
+ templateUrl: './spinner.component.html',
+ styleUrls: ['./spinner.component.scss']
+})
+
+export class SpinnerComponent implements OnInit {
+
+ @ViewChild('spinner') spinner: ElementRef
+ @Input() show: boolean = false
+
+ ngOnInit(): void {
+ }
+
+ ngOnChanges(changes: SimpleChanges) {
+ if(changes.show && changes.show.firstChange) {
+ this.loader(changes.show.currentValue ? 'show' : 'hide')
+ }
+ }
+
+ loader(action) {
+ let op = 0
+ let timer = null
+
+ switch(action) {
+ case 'show':
+ op = 1
+ timer = setInterval(() => {
+ if(op <= 0.1){
+ clearInterval(timer)
+ this.spinner.nativeElement.style.display = 'none'
+ }
+ this.spinner.nativeElement.style.opacity = op
+ this.spinner.nativeElement.style.filter = 'alpha(opacity=' + op * 100 + ")"
+ op -= op * 0.1
+ }, 20)
+
+ break
+ case 'hide':
+ op = 0.1
+ this.spinner.nativeElement.style.display = 'block'
+ timer = setInterval(() => {
+ if(op >= 1){
+ clearInterval(timer)
+ }
+ this.spinner.nativeElement.style.opacity = op
+ this.spinner.nativeElement.style.filter = 'alpha(opacity=' + op * 100 + ")"
+ op += op * 0.1
+ }, 20)
+
+ break
+ }
+ }
+}
diff --git a/src/assets/images/loader.svg b/src/assets/images/loader.svg
new file mode 100644
index 0000000..a656b7e
--- /dev/null
+++ b/src/assets/images/loader.svg
@@ -0,0 +1,11 @@
+
+
\ No newline at end of file
diff --git a/src/assets/scss/variables.scss b/src/assets/scss/variables.scss
index dd99a70..743424d 100644
--- a/src/assets/scss/variables.scss
+++ b/src/assets/scss/variables.scss
@@ -34,6 +34,7 @@ $yellow: #a2dc02;
$white-alpha: rgba(255, 255, 255, 0.8);
$white-alpha2: rgba(255, 255, 255, 0.4);
$black-alpha: rgba(0, 0, 0, 0.8);
+$black-alpha2: rgba(0, 0, 0, 0.4);
$yellow-alpha: rgba(160, 220, 0, 0.8);
// Fonts
diff --git a/src/index.html b/src/index.html
index b5d7d53..229698c 100644
--- a/src/index.html
+++ b/src/index.html
@@ -4,7 +4,7 @@
DslakWebsite
-
+
diff --git a/src/main.ts b/src/main.ts
index c7b673c..5f26277 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -4,6 +4,8 @@ import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
import { environment } from './environments/environment';
+import 'hammerjs';
+
if (environment.production) {
enableProdMode();
}