-
-
-
- {{c.title}}
- {{c.description}}
-
-
-
-
-
-
-
-
-
-
-
- {{c.title}}
- {{c.description}}
-
-
+
-
+
diff --git a/src/app/about-us/about-us.component.scss b/src/app/about-us/about-us.component.scss
index 76e0871..064765d 100644
--- a/src/app/about-us/about-us.component.scss
+++ b/src/app/about-us/about-us.component.scss
@@ -6,113 +6,71 @@
background-image: url("/assets/images/about-us.jpg");
background-size: cover;
background-repeat: no-repeat;
- background-position: bottom left;
min-height: 1600px;
min-width: 100vw;
+ @media screen and (max-width: 599px) { background-image: none; }
+ @media screen and (min-width: 600px) and (max-width: 959px) { background-image: none; padding-left: 10%; padding-right: 10%; }
+ @media screen and (min-width: 960px) and (max-width: 1279px) { background-image: none; padding-left: 20%; padding-right: 20%; }
+ @media screen and (min-width: 1280px) and (max-width: 1919px) { background-position: 50% 80%; }
+ @media screen and (min-width: 1920px) and (max-width: 5000px) { background-position: 90% 90%; }
+
+ &:before {
+ position: absolute;
+ content: '';
+ background-color: $brand-gray;
+ height: 100%;
+ right: 0;
+ top: 0;
+ z-index: 0;
+
+ @media screen and (max-width: 1279px) { width: 100%; }
+ @media screen and (min-width: 1280px) and (max-width: 1919px) { width: 50%; }
+ @media screen and (min-width: 1920px) and (max-width: 5000px) { width: 33.333%; }
+ }
+
+ &:after {
+ @media screen and (min-width: 1280px) and (max-width: 1919px) {
+ position: absolute;
+ content: '';
+ background-color: rgba(255, 255, 255, 0.8);
+ height: 100%;
+ left: 0;
+ top: 0;
+ z-index: 0;
+ width: 50%;
+ }
+ }
+
.title {
+ z-index: 1;
margin-top: 80px;
margin-left: 80px;
+ @media screen and (max-width: 1279px) { margin-left: 20px; margin-right: 20px; }
h1 {
color: $brand-primary;
margin-bottom: 0;
+ @media screen and (max-width: 1279px) { color: $brand-primary-light-2; }
+ }
+
+ h2 {
+ color: $brand-gray;
+ @media screen and (max-width: 1279px) { color: white; }
}
}
.capabilities {
- margin-top: 300px;
- margin-left: 80px;
- margin-right: 80px;
-
- ::ng-deep .capability-icon svg {
- margin-top: -52px;
- width: 128px;
- height: 128px;
- }
-
- .icon-left,
- .icon-right {
- position: relative;
- background-color: transparent;
-
- &:after {
- position: absolute;
- left: 50%;
- content: '';
- width: 2px;
- }
- }
- }
-
- .even {
- text-align: right;
-
- .details-left {
- background-color: transparent;
- h3 { color: $brand-primary-dark-1; }
- }
- .icon-left {
- ::ng-deep .capability-icon svg path { fill: $brand-primary; }
-
- &:after {
- @media screen and (min-width: 96px) {
- bottom: 0;
- height: calc(100% - 64px);
- background-color: $brand-gray-light-3;
- }
- }
- }
- .icon-right {
- &:after {
- @media screen and (min-width: 96px) {
- top: 0;
- height: calc(100% - 40px);
- background-color: $brand-gray-light-1;
- }
- }
- }
- .details-right { background-color: transparent; }
-
- &:first-of-type .icon-right:after { background-color: transparent; }
-
- &:last-of-type,
- &:nth-last-of-type(2) {
- .icon-left:after { background-color: transparent; }
- }
- }
-
- .odd {
- text-align: left;
-
- .details-left { background-color: transparent; }
- .icon-left {
- &:after {
- @media screen and (min-width: 96px) {
- top: 0;
- height: calc(100% - 40px);
- background-color: $brand-gray-light-3;
- }
- }
- }
- .icon-right {
- ::ng-deep .capability-icon svg path { fill: $brand-primary-light-1; }
-
- &:after {
- @media screen and (min-width: 96px) {
- bottom: 0;
- height: calc(100% - 64px);
- background-color: $brand-gray-light-1;
- }
- }
- }
- .details-right {
- background-color: transparent;
- color: white;
- h3 { color: $brand-primary-light-2; }
- }
-
- &:last-of-type .icon-right:after { background-color: transparent; }
- &:last-of-type .icon-left:after { background-color: transparent; }
+ padding-bottom: 4em;
+ z-index: 1;
}
}
+
+.bg-about-us {
+ background-image: url("/assets/images/bg-about-us.jpg");
+ background-size: cover;
+ background-repeat: no-repeat;
+ background-position: 75% 75%;
+ min-height: 75vh;
+ min-width: 100vw;
+}
diff --git a/src/app/about-us/about-us.component.ts b/src/app/about-us/about-us.component.ts
index 6542100..4772aec 100644
--- a/src/app/about-us/about-us.component.ts
+++ b/src/app/about-us/about-us.component.ts
@@ -2,7 +2,7 @@ import {Component, ElementRef, HostListener, OnInit} from '@angular/core';
import {ApiService} from '../api.service';
import {Capability} from '../interfaces';
import {animations} from '../animation';
-import {getScrollState, isEven} from '../util';
+import {getScrollState} from '../util';
@Component({
selector: 'app-about-us',
@@ -13,7 +13,6 @@ import {getScrollState, isEven} from '../util';
export class AboutUsComponent implements OnInit {
capabilities: Capability[];
state = 'hide';
- isEven = isEven;
constructor(private api: ApiService, public el: ElementRef) {
this.api.getCapabilities().subscribe(c => this.capabilities = c);
diff --git a/src/app/animation.ts b/src/app/animation.ts
index 59a7030..8a127a6 100644
--- a/src/app/animation.ts
+++ b/src/app/animation.ts
@@ -26,8 +26,12 @@ export const fadeIn = animation(
{ params: { time: '1000ms', start: 1, end: 0, zIndex: 0 } }
);
-
-export function easingFn( t: number, b: number, c: number, d: number): number {
+export function easingFn (
+ t: number,
+ b: number,
+ c: number,
+ d: number
+): number {
if ((t /= d / 2) < 1) {
return (c / 2) * t * t * t * t + b;
} else {
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 6d6c737..923f9ef 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -38,6 +38,8 @@ import {EmailValidator, EmailValidatorMessage,} from './formly.validator';
import {FormsModule, ReactiveFormsModule} from '@angular/forms';
import {TeamMemberComponent} from './team-member/team-member.component';
import { CaseStudyComponent } from './case-study/case-study.component';
+import { CapabilityDetailsComponent } from './capability-details/capability-details.component';
+import { BrandValueComponent } from './brand-value/brand-value.component';
const routes: Routes = [
{
@@ -80,6 +82,8 @@ export class FormlyConfig {
HomeComponent,
TeamMemberComponent,
CaseStudyComponent,
+ CapabilityDetailsComponent,
+ BrandValueComponent,
],
imports: [
BrowserAnimationsModule,
diff --git a/src/app/brand-value/brand-value.component.html b/src/app/brand-value/brand-value.component.html
new file mode 100644
index 0000000..e09c1e3
--- /dev/null
+++ b/src/app/brand-value/brand-value.component.html
@@ -0,0 +1,13 @@
+
+
+
{{brandValue.title}}
+
{{brandValue.description}}
+
diff --git a/src/app/brand-value/brand-value.component.scss b/src/app/brand-value/brand-value.component.scss
new file mode 100644
index 0000000..c65337c
--- /dev/null
+++ b/src/app/brand-value/brand-value.component.scss
@@ -0,0 +1,10 @@
+.logo-element {
+ ::ng-deep svg {
+ width: 64px;
+ height: 64px;
+ }
+}
+
+.value {
+ margin-bottom: 2em;
+}
diff --git a/src/app/brand-value/brand-value.component.spec.ts b/src/app/brand-value/brand-value.component.spec.ts
new file mode 100644
index 0000000..bbf74cb
--- /dev/null
+++ b/src/app/brand-value/brand-value.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { BrandValueComponent } from './brand-value.component';
+
+describe('BrandValueComponent', () => {
+ let component: BrandValueComponent;
+ let fixture: ComponentFixture
;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ BrandValueComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(BrandValueComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/brand-value/brand-value.component.ts b/src/app/brand-value/brand-value.component.ts
new file mode 100644
index 0000000..75fe94f
--- /dev/null
+++ b/src/app/brand-value/brand-value.component.ts
@@ -0,0 +1,37 @@
+import {Component, ElementRef, HostListener, Input, OnInit} from '@angular/core';
+import {animations} from '../animation';
+import {getScrollState} from '../util';
+import {BrandValue} from '../interfaces';
+
+@Component({
+ selector: 'app-brand-value',
+ templateUrl: './brand-value.component.html',
+ styleUrls: ['./brand-value.component.scss'],
+ animations: animations
+})
+export class BrandValueComponent implements OnInit {
+ @Input() brandValue: BrandValue;
+ state = 'hide';
+
+ constructor(public el: ElementRef) { }
+
+ ngOnInit() {
+ }
+
+ highlight(elementId: string, on: boolean) {
+ const svgEl = document.getElementById(elementId)
+
+ if (svgEl) {
+ if (on) {
+ svgEl.classList.add('highlight');
+ } else {
+ svgEl.classList.remove('highlight');
+ }
+ }
+ }
+
+ @HostListener('window:scroll', ['$event'])
+ checkScroll() {
+ this.state = getScrollState(this.el);
+ }
+}
diff --git a/src/app/capability-details/capability-details.component.html b/src/app/capability-details/capability-details.component.html
new file mode 100644
index 0000000..a4ddbef
--- /dev/null
+++ b/src/app/capability-details/capability-details.component.html
@@ -0,0 +1,60 @@
+
+
+
+ {{capability.title}}
+ {{capability.description}}
+
+
+
+
+
+
+
+
+
+
+ {{capability.title}}
+ {{capability.description}}
+
+
+
+
+
+
+
+
+
{{capability.title}}
+
{{capability.description}}
+
+
diff --git a/src/app/capability-details/capability-details.component.scss b/src/app/capability-details/capability-details.component.scss
new file mode 100644
index 0000000..ab05b2b
--- /dev/null
+++ b/src/app/capability-details/capability-details.component.scss
@@ -0,0 +1,128 @@
+@import "../../config";
+
+.capability-sm {
+ padding-left: 20px;
+ padding-right: 20px;
+ margin-bottom: 2em;
+
+ ::ng-deep .capability-icon svg {
+ width: 128px;
+ height: 128px;
+ margin-bottom: -1em;
+ path { fill: $brand-primary-light-1; }
+ }
+
+ h3 {
+ color: $brand-primary-light-2;
+ }
+
+ .details { color: white; }
+}
+
+@media screen and (min-width: 1280px) {
+ .capability {
+ ::ng-deep .capability-icon svg {
+ margin-top: -52px;
+ width: 128px;
+ height: 128px;
+ path { fill: $brand-primary-light-1; }
+ }
+
+ .icon-left,
+ .icon-right {
+ position: relative;
+ background-color: transparent;
+ text-align: center;
+ min-width: 128px;
+
+ &:after {
+ position: absolute;
+ left: 50%;
+ content: '';
+ width: 2px;
+ }
+ }
+
+ h3 {
+ color: $brand-primary-light-2;
+ }
+
+ .details-left {
+ padding-left: 80px;
+ color: white;
+ }
+
+ .details-right {
+ padding-right: 80px;
+ color: white;
+ }
+
+ &.even {
+ text-align: right;
+
+ .details-left {
+ background-color: transparent;
+ color: $brand-gray;
+
+ h3 { color: $brand-primary-dark-1; }
+ }
+
+ .icon-left {
+ ::ng-deep .capability-icon svg path { fill: $brand-primary; }
+
+ &:after {
+ bottom: 0;
+ height: calc(100% - 64px);
+ background-color: $brand-gray-light-3;
+ }
+ }
+ .icon-right {
+ background-color: $brand-gray;
+ &:after {
+ top: 0;
+ height: calc(100% - 40px);
+ background-color: $brand-gray-light-1;
+ }
+ }
+ .details-right { background-color: $brand-gray; }
+
+ &.first-row .icon-right:after { background-color: transparent; }
+
+ &.last-row,
+ &.second-to-last-row {
+ .icon-left:after { background-color: transparent; }
+ }
+ }
+
+ &.odd {
+ text-align: left;
+
+ .details-left { background-color: transparent; }
+ .icon-left {
+ &:after {
+ top: 0;
+ height: calc(100% - 40px);
+ background-color: $brand-gray-light-3;
+ }
+ }
+ .icon-right {
+ background-color: $brand-gray;
+ ::ng-deep .capability-icon svg path { fill: $brand-primary-light-1; }
+
+ &:after {
+ bottom: 0;
+ height: calc(100% - 64px);
+ background-color: $brand-gray-light-1;
+ }
+ }
+ .details-right {
+ background-color: $brand-gray;
+ color: white;
+ h3 { color: $brand-primary-light-2; }
+ }
+
+ &.last-row .icon-right:after { background-color: transparent; }
+ &.last-row .icon-left:after { background-color: transparent; }
+ }
+ }
+}
diff --git a/src/app/capability-details/capability-details.component.spec.ts b/src/app/capability-details/capability-details.component.spec.ts
new file mode 100644
index 0000000..4f9ad44
--- /dev/null
+++ b/src/app/capability-details/capability-details.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { CapabilityDetailsComponent } from './capability-details.component';
+
+describe('CapabilityDetailsComponent', () => {
+ let component: CapabilityDetailsComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ CapabilityDetailsComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(CapabilityDetailsComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/capability-details/capability-details.component.ts b/src/app/capability-details/capability-details.component.ts
new file mode 100644
index 0000000..4b3854b
--- /dev/null
+++ b/src/app/capability-details/capability-details.component.ts
@@ -0,0 +1,29 @@
+import {Component, ElementRef, HostListener, Input, OnInit} from '@angular/core';
+import {getScrollState, isEven} from '../util';
+import {Capability} from '../interfaces';
+import {animations} from '../animation';
+
+@Component({
+ selector: 'app-capability-details',
+ templateUrl: './capability-details.component.html',
+ styleUrls: ['./capability-details.component.scss'],
+ animations: animations
+})
+export class CapabilityDetailsComponent implements OnInit {
+ @Input() capability: Capability;
+ @Input() index: number;
+ @Input() numTotal: number;
+ state = 'hide';
+ isEven = isEven;
+
+ constructor(public el: ElementRef) {
+ }
+
+ ngOnInit() {
+ }
+
+ @HostListener('window:scroll', ['$event'])
+ checkScroll() {
+ this.state = getScrollState(this.el);
+ }
+}
diff --git a/src/app/case-studies/case-studies.component.html b/src/app/case-studies/case-studies.component.html
index aa28f4f..860965f 100644
--- a/src/app/case-studies/case-studies.component.html
+++ b/src/app/case-studies/case-studies.component.html
@@ -15,10 +15,10 @@